C++带头双向循环链表超详细解析

 更新时间:2022年03月24日 10:14:46   作者:程序猿教你打篮球  
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单

上期我们讲完了无头单向非循环链表,这期我们接着来讲链表中结构最复杂的带头双向循环链表!

本期主要内容:

🐱 什么是带头双向循环链表?

😻 带头双向循环链表常用接口实现!

🙀 顺序表和链表的区别和联系!

什么是带头双向循环链表

什么是带头?双向?循环?(带头双向循环链表)

带头:代表链表存在一个哨兵位节点,也就是头节点,这个节点不存放任何的有效数据!

双向:每个节点都有两个指针,分别指向它的前一个节点和后一个节点!

循环:最后一个节点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++ 带头双向循环链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt股票组件之自选股列表拖拽、右键常用菜单功能的实现

    Qt股票组件之自选股列表拖拽、右键常用菜单功能的实现

    这篇文章主要介绍了Qt股票组件之自选股列表拖拽、右键常用菜单功能的实现方法,本文通过实例文字相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • c++ 基于opencv 识别、定位二维码

    c++ 基于opencv 识别、定位二维码

    这篇文章主要介绍了c++ 基于opencv 识别、定位二维码,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • C语言中定义与声明有哪些区别

    C语言中定义与声明有哪些区别

    在C/C++中有一个基础且重要的知识,什么是声明?什么是定义?他们的区别是什么?本文将带你理清其中的区别
    2022-07-07
  • 介绍C语言中tolower函数的实例

    介绍C语言中tolower函数的实例

    这篇文章主要介绍了介绍C语言中tolower函数的实例,本文列出了该函数的头文件,功能说明等,以及如何使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现LeetCode(38.计数和读法)

    C++实现LeetCode(38.计数和读法)

    这篇文章主要介绍了C++实现LeetCode(38.计数和读法),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 从头学习C语言之二维数组

    从头学习C语言之二维数组

    这篇文章主要为大家详细介绍了C语言之二维数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • c语言实现两个单链表的交叉合并方式

    c语言实现两个单链表的交叉合并方式

    今天小编就为大家分享一篇c语言实现两个单链表的交叉合并方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C语言用栈和队列实现的回文检测功能示例

    C语言用栈和队列实现的回文检测功能示例

    这篇文章主要介绍了C语言用栈和队列实现的回文检测功能,结合具体实例形式分析了C语言栈和队列的定义及使用栈和队列进行回文检测的操作技巧,需要的朋友可以参考下
    2017-06-06
  • C++ 中国象棋的实现流程详解

    C++ 中国象棋的实现流程详解

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动
    2021-11-11
  • OpenCV轮廓检测之boundingRect绘制矩形边框

    OpenCV轮廓检测之boundingRect绘制矩形边框

    在进行文本检测时,我们常常会用矩形边框将检测到的内容框除。这篇文章主要为大家介绍的是OpenCV中能实现这一效果的函数:boundingRect,感兴趣的同学可以学习一下
    2021-12-12

最新评论