双端链表
1.概念
在单链表得基础上,加了一个指向尾部结点指针,提高在尾部插入得效率。
2.数据结构
typedef int ElemType;
//双端链表的结点的数据类型 和 单链表结点类型相同
typedef struct DeLinkNode {
ElemType val;
DeLinkNode* next;
}DeLinkNode;
//双端链表的头结点类型
typedef struct DeLinkHead {
int len;
DeLinkNode* frist;
DeLinkNode* last;
}DeLinkHead;
3.生成结点
DeLinkNode* BuyNode(ElemType elem)
{
DeLinkNode* ptr = (DeLinkNode*)calloc(sizeof(DeLinkNode), 1);
assert(ptr != NULL);
ptr->val = elem;
return ptr;
}
4.释放结点
void FreeNode(DeLinkNode* p)
{
free(p);
p = NULL;
}
6.头部插入一个结点
//头部插入
void PushFront(DeLinkHead* head, ElemType elem)
{
if (head == NULL) { return; }
DeLinkNode* ptr = BuyNode(elem);
if (head->frist == NULL)
{
head->last = ptr;
}
else
{
ptr->next = head->frist;
}
head->frist = ptr;
head->len++;
}
7.尾部插入一个结点
//尾部插入
void PushBack(DeLinkHead* head, ElemType elem)
{
if (head == NULL) { return; }
DeLinkNode* ptr = BuyNode(elem);
if (head->last == NULL)
{
head->frist = ptr;
}
else
{
head->last->next = ptr;
}
head->last = ptr;
head->len++;
}
8.打印双端链表
//打印双端链表
void Print(DeLinkHead* head)
{
if (head == NULL) { return; }
DeLinkNode* ptr = head->frist;
while (ptr != NULL)
{
printf("%d ", ptr->val);
ptr = ptr->next;
}
printf("\n");
}
9.双端链表的销毁
//双端的销毁
void Destory(DeLinkHead** head)
{
if (head == NULL) { return; }
(*head)->last = NULL;
while ((*head)->frist != NULL)
{
DeLinkNode* ptr = (*head)->frist;
(*head)->frist = ptr->next;
FreeNode(ptr);
ptr = NULL;
}
free(*head);
*head = NULL;
}
本文介绍了双端链表的概念,它在单链表的基础上增加了指向尾部节点的指针,从而提升了在尾部插入节点的效率。文中详细阐述了双端链表的数据结构、生成结点、释放结点、头部插入、尾部插入、打印链表以及销毁链表等操作。这些基本操作为双端链表的使用提供了便利。
417

被折叠的 条评论
为什么被折叠?



