1、单链表存在的缺陷
1、不能从后往前走
2、找不到前驱
因为单链表有这些缺陷,所以我们在实际应用的过程中更多的是用双向带头循环链表
2、双向带头循环链表的接口函数代码实现(C语言)
(1)链表初始化
ListNode* ListInit()
{
ListNode*phead = BuyListNode(0);
phead->next = phead;//
phead->prev = phead;
return phead;
}
(2)尾插
void ListPushBack(ListNode*phead, LTDataType x)
{
ListNode*tail = phead->prev;//
ListNode*newnode = BuyListNode(x);
tail->next = newnode;
newnode->prev = tail;
newnode->next = phead;
phead->prev = newnode;
}
(3)打印函数
void ListPrint(ListNode*phead)
{
ListNode*cur = phead->next;
while (cur != phead)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
(4)头插
void ListPopFront(ListNode*phead, LTDataType x)
{
ListNode*first = phead->next;
ListNode*newnode = BuyListNode(x);
phead->next = newnode;
newnode->prev = phead;
newnode->next = first;
first->prev = newnode;
}
(5)头删
void ListPopFront(ListNode*phead, LTDataType x)
{
ListNode*first = phead->next;
ListNode*second = first->next;
phead->next = second;
second->prev = phead;
free(first);
}
(6)尾删
void ListPopBack(ListNode*phead)
{
assert(phead->next != phead);//判断是不是一个节点也没有
ListNode*tail = phead->prev;
ListNode*prev = tail->prev;
prev->next = phead;
phead->prev = prev;
free(tail);
tail = NULL;
}