双端链表
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;
}