双向链表的优势:
代码实现:
1、定义一个结点结构
2、初始化链表
3、尾插
4、头插
5、 尾删
6、头删
7、打印链表
完整代码:
//双向链表的创建
//定义结点
typedef struct Dlist
{
int data;
struct Dlist* prev;//指向前指针
struct Dlist* next;//指向后指针
}Dlist;
//初始化 然后返回一个带有哨兵位的链表
Dlist* InitDlist()
{
//创建哨兵位结点
Dlist* head = (Dlist*)malloc(sizeof(Dlist));
head->prev = head;//连头
head->next = head;//连头
return head;//返回链表
}
//打印链表
void Dlistprint(Dlist* head)
{
assert(head);//判断
Dlist* cur = head->next;
while (cur != head)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("\n");
}
//插入数据
void DlistPushBack(Dlist* head, int x)
{
//创建结点
Dlist* newnode = malloc(sizeof(Dlist));
newnode->data = x;
Dlist* tail = head->prev;
//插入
tail->next = newnode;
newnode->prev = tail;
newnode->next = head;
head->prev = newnode;
}
//尾删
void DlistPopBack(Dlist* head)
{
//先判断链表是否为空
assert(head);
//然后找到尾结点
Dlist* tail = head->prev;
//然后找到尾结点的前一个结点
Dlist* tailprev = tail->prev;
//删结点
tailprev->next = head;//重新指向头
head->prev = tailprev;//头再指向新的尾结点
free(tail);//释放掉原来的尾结点
tail = NULL;//规范一点,将旧尾结点置为空
}
//头插
void DlistPushFront(Dlist* head,int x)
{
//创建一个新的节点
Dlist* newnode = malloc(sizeof(Dlist));
newnode->data = x;
Dlist* next = head->next;//创建一个指针指向head的下一个结点
newnode->prev = head;//将新节点的前一个给给head
head->next = newnode;//head的后一个给给newnode
newnode->next = next;//新节点的后一个给给原来head的下一个结点
next->prev = newnode;//原来head的下一个结点的前一个给给newnode
}
//头删
void DlistPopFront(Dlist* head)
{
assert(head);//先判断
//两种情况 1、有两个结点,有两个以上
Dlist* cur = head->next;//创建一个指向head的后一个结点的指针
head->next = cur->next;//head的next指向cur的next
free(cur);//释放掉cur 不然会变成野指针
cur = NULL;
}
void testlist()
{
Dlist* list = InitDlist();//初始化双向链表
DlistPushBack(list,1);//插入数据
DlistPushBack(list, 2);//插入数据
DlistPushBack(list, 3);//插入数据
DlistPushBack(list, 4);//插入数据
Dlistprint(list);//打印链表
DlistPopBack(list);//尾删
Dlistprint(list);//打印链表
DlistPushFront(list,9);//头插
Dlistprint(list);//打印链表
DlistPopFront(list);//头删
Dlistprint(list);//打印链表
}
int main()
{
testlist();
return 0;
}
如有错误,多多指教!