双向链表的基本操作1
程序员文章站
2022-03-24 18:19:15
...
dlinklist.h
#pragma once
#include<stdio.h>
typedef char DLinkType;
typedef struct DLinkNode {
DLinkType data;
struct DLinkNode* next;
struct DLinkNode* prev;
} DLinkNode;
void DLinkListInit(DLinkNode** head);
void DLinkListPushBack(DLinkNode* head, DLinkType value);
void DLinkListPopBack(DLinkNode* head);
void DLinkListPushFront(DLinkNode* head, DLinkType value);
void DLinkListPopFront(DLinkNode* head);
DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find);
/**
* * @brief 往指定位置之前插入一个元素
* */
void DLinkListInsert(DLinkNode* pos, DLinkType value);
/**
* * @brief 往指定位置之后插入一个元素
* */
dlinklist.c
#include<stdio.h>
#include<stdlib.h>
#include"dlinklist.h"
void DLinkListPrintChar(DLinkNode* head,const char* msg)
{
if(head == NULL)
{
printf("非法输入\n");
return;
}
printf("[#####%s#####]\n",msg);
DLinkNode* cur = head->next;
for(;cur != head;cur = cur->next)
{
printf("[%c|%p]\t",cur->data,cur);
}
printf("\n");
return;
}
DLinkNode* CreatDlinkNode(DLinkType value)
{
DLinkNode* New_Node = (DLinkNode*)malloc(sizeof(DLinkNode));
New_Node->data = value;
New_Node->prev = NULL;
New_Node->next = NULL;
return New_Node;
}
void DLinkListInit(DLinkNode** head)
{
if(head == NULL)
{
//error
return;
}
*head = CreatDlinkNode(0);
(*head)->prev = *head;
(*head)->next = *head;
return;
}
//尾插
void DLinkListPushBack(DLinkNode* head, DLinkType value)
{
if(head == NULL)
{
//error;
return;
}
DLinkNode* New_Node = CreatDlinkNode(value);
New_Node->data = value;
DLinkNode* tail = head->prev;
tail->next = New_Node;
New_Node->prev = tail;
New_Node->next = head;
head->prev = New_Node;
}
//尾删
void DLinkListPopBack(DLinkNode*head)
{
if(head == NULL)
{
//error
return;
}
if(head->next == NULL)
{
//空链表
return;
}
DLinkNode* tailprev = head->prev->prev;
free(tailprev->next);
tailprev->next = head;
head->prev = tailprev;
}
void DLinkListPushFront(DLinkNode* head,DLinkType value)
{
if(head == NULL)
{
//error
return;
}
DLinkNode* New_Node = CreatDlinkNode(value);
New_Node->next = head->next;
New_Node->next->prev = New_Node;
head->next = New_Node;
New_Node->prev = head;
}
void DLinkNodePopFront(DLinkNode* head)
{
if(head == NULL)
{
//error
return;
}
DLinkNode*Next = head->next;
head->next = Next->next;
Next->next->prev = Next->prev;
free(Next);
}
DLinkNode* DLinkListFind(DLinkNode* head, DLinkType to_find)
{
if(head == NULL)
{
//error
return NULL;
}
DLinkNode* cur = head->next;
while(cur != head)
{
if(cur->data == to_find)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void DLinkListInsert(DLinkNode* pos,DLinkType value)
{
if(pos == NULL)
{
//error
return;
}
DLinkNode* New_Node = CreatDlinkNode(value);
New_Node->data = value;
DLinkNode* Prev = pos->prev;
Prev->next = New_Node;
New_Node->prev = Prev;
New_Node->next = pos;
pos->prev = New_Node;
}
void DLinkListInsertAfter(DLinkNode* pos,DLinkType value)
{
if(pos == NULL)
{
//error
return;
}
DLinkNode* New_Node = CreatDlinkNode(value);
New_Node->data = value;
DLinkNode* Next = pos->next;
Next->prev = pos;
pos->next = New_Node;
New_Node->prev = pos;
New_Node->next = Next;
Next->prev = New_Node;
}
void TestPushBack()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkListPrintChar(head,"尾插元素");
}
void TestPopBack()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkListPopBack(head);
DLinkListPrintChar(head,"尾删元素");
}
void TestPushFront()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushFront(head,'a');
DLinkListPushFront(head,'b');
DLinkListPushFront(head,'c');
DLinkListPushFront(head,'d');
DLinkListPrintChar(head,"头插元素");
}
void TestPopFront()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushFront(head,'a');
DLinkListPushFront(head,'b');
DLinkListPushFront(head,'c');
DLinkListPushFront(head,'d');
DLinkNodePopFront(head);
DLinkListPrintChar(head,"头删元素");
}
void TestInsert()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkNode* pos = DLinkListFind(head,'c');
DLinkListInsert(pos,'x');
DLinkListPrintChar(head,"前插元素");
}
void TestInsertAfter()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkNode* pos = DLinkListFind(head,'c');
DLinkListInsertAfter(pos,'x');
DLinkListPrintChar(head,"在c之后插入x");
DLinkListInsertAfter(head,'w');
DLinkListPrintChar(head,"在head在后插入w");
}
int main()
{
TestPushBack();
TestPopBack();
TestPushFront();
TestPopFront();
TestInsert();
return 0;
}