上期我们讲完了无头单向非循环链表,这期我们接着来讲链表中结构最复杂的带头双向循环链表!
本期主要内容:
? 什么是带头双向循环链表?
? 带头双向循环链表常用接口实现!
? 顺序表和链表的区别和联系!
什么是带头双向循环链表
什么是带头?双向?循环?(带头双向循环链表)
带头:代表链表存在一个哨兵位节点,也就是头节点,这个节点不存放任何的有效数据!
双向:每个节点都有两个指针,分别指向它的前一个节点和后一个节点!
循环:最后一个节点next不再指向NULL指向的是哨兵位节点,哨兵位节点prev指向的是最后一个节点!(如果是单项链表的话哨兵位不指向最后一个节点!)
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了!
带头双向循环链表常用接口实现
? 搭建带头双向循环链表的结构!
? 带头双向循环链表的初始化并创建新节点!
? 头部插入节点!
? 尾部插入节点!
? 头部删除节点!
? 尾部删除节点!
? 在pos节点前插入节点!
我们首先要找到pos节点的地址!
ListNode* ListFind(ListNode* phead, LTDataType x)
{
assert(phead);
ListNode* cur = phead->next;
while (cur != phead)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
? 删除指定pos节点!
看了上面的那么多的图解,相信删除指定节点对你来说也很简单吧!我就直接上代码了!
void ListErase(ListNode* pos)
{
assert(pos);
ListNode* prev = pos->prev;
ListNode* next = pos->next;
prev->next = next;
next->prev = prev;
free(pos);
pos = NULL;
}
? 最后别忘记销毁链表哦!
void ListDestory(ListNode* phead)
{
ListNode* cur = phead->next;
while (cur != phead)
{
ListNode* next = cur->next;
free(cur);
cur = next;
}
free(phead);
phead = NULL;
}
其实很多小伙伴一看到数据结构就头疼,但是我想说,不要嫌画图麻烦,一定要多画图,这样更有利于我们实现代码,靠脑袋空想是想不出来的!
最后爱打篮球的程序猿想送小伙伴们一句话:天再高又怎样,踮起脚尖就更接近阳光!
gitee(码云):Mercury. (zzwlwp) - Gitee.com
到此这篇关于C++带头双向循环链表超详细解析的文章就介绍到这了,更多相关C++ 带头双向循环链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!