这个是一个标题哦
在淦了四篇刷题笔记之后,菜鸡大学生想起她之前在单链表挖的坑还没填。遂,填。有一说一菜鸡大学生的坑品还是可以的。下一篇是动图教程哦,所以…(暗示) 开搞!
双链表
(今天的攻略对象)
和上次的单链表相比,今天要写的双链表有以下不同:
- 带哨兵位的头结点。
- 双向的,每个节点不仅可以指向下一个,还可以指向上一个。
- 循环链表,最后一个节点指向第一个节点。
那么,开始准备吧
双链表的本体
加上一个前驱的指针,欸嘿嘿。
typedef int ListDataType;
typedef struct ListNode
{
struct ListNode* prev; //*
struct ListNode* next;
ListDataType data;
}ListNode;
初始化
在初始化的时候我们就要带上我们的哨兵位了。
我们先生成一个节点,里面的数据置为0 (数据多少都无所谓,反正都不会用上) 然后将节点的前指针和后指针统统指向自己。
这样,一个循环链表的雏形就出来了。
//初始化
ListNode* ListInit()
{
ListNode* phead= BuyListNode(0);
phead->next = phead;
phead->prev= phead;
return phead;
}
得到一个节点
没啥,就多了一个前指针。
随便写写就好。
//得到一个节点
ListNode* BuyListNode(ListDataType x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
newnode->data = x;
newnode->next = NULL;
newnode->prev = NULL;
return newnode;
}
打印链表
同上,注意结束条件变成了cur!=phead
,因为是循环链表嘛。
//打印
void ListPrint(ListNode* phead)
{
assert(phead);
ListNode* cur = phead->next;
whil