C实现带头循环双向链表(pushback pushfront popback popfront insert erase find destroy等)
创始人
2025-05-29 13:31:53

带头循环双向链表是链表中效率最高的,但是由于他里面有两个指针节点,所以也会更浪费空间一些,但是他在任意位置的插入删除的效率很高,所以也就弥补了顺序表的不足。

首先我们来看一下他的逻辑结构是什么样子的

1725408856cd43c3b9739deeb0684c31.png 

 

下面我们看一下如何实现

首先我们先看一下这个带头循环双向链表的每一个节点是怎么样的

5f1b45d6baf64b96b4edd451a803dd6f.png 

这里我们可以看到,里面有一个保存数据的变量data,还有两个该结构体类型的指针,其中一个是prev另一个是next分别代表上一个和下一个

在下面我们看一下带头循环双向链表至少需要哪些函数

 7b192a84a7734e5e9fc554fa200f8568.png

这里是头文件,这里有着函数的声明,我们可以看到我们要实现的函数。

下面我们依次介绍这些函数

首先我们来看一下初始化

 8b3c6d0fbe234527a43003c70cc02ba6.png

在初始化函数中,我们需要传过来二级指针,因为这里我们需要有一个头节点,所以我们需要改变外面传过来的变量,这里我们需要断言一下,然后我们就可以new一个节点,然后给给*pphead 这样我们就可以改变他,让他成为头节点,然后把他里面的dada给一个值(该值无任何意义)我们需要将他里面的内容都初始化,然后将他的两个指针都指向自己,因为这里只有他一个节点。

里面提到了一个BuyNode的一个函数,我们这里介绍一下

b2af2d60589b47d3abad6396bfaf16ad.png

这里的buynode其实就是new一个节点,然后将该节点指向的空间初始化并赋值,然后返回new出来的节点,该函数会在众多插入中使用

下面我们看一下pushback

810442b72f97404987eb990ac20b7c63.png

我们来看一下,首先我们断言的地方是因为这里绝对不能出现的,就比如不小心将第一个参数传为了空,下面我们来看一下,我们继续new一个节点初始化并赋值,然后我们是尾插入,所以我们可以插入到头节点的前面,这样就是尾插了。

下面我们来看一下 打印函数,我们就知道为什么插入在头节点的前面就相当于是尾插

60d5ebee182643c9b55282c0420150c1.png

我们的打印函数,这里我们定义一个cur但是这个指针并不指向头节点,而是头节点的下一个节点,所以当该指针打印完一遍之后又会回到头节点,但是头节点的值实际并没有任何意义,所以我们可以让cur指向头节点时为结束条件,这样我们就可以打印了

 下面我们看一下头插

4e73c89fb01645379f9dc0febbb12ef6.png

其实这里的双向带头循环链表,看起来比单链表的结构体更复杂一些,但是实际写起来是要比单链表简单一点点的,而且这里的头插也是特别简单,我们直接记录好头节点的下一个节点,然后new一个几点并赋值,将该节点链接上即可

 下面我们在看一下尾删

e3e745732b5e4017836a367c2d5e9d46.png

这里面以及后面的断言我就不一一阐述了,这里记住,但凡是有绝对不可能出现的情况就需要断言,因为这里的断言可以帮助我们省去很多的麻烦,所以记住该断言的地方就断言,

这里我们可以看到,我们首先就判断了该链表是否为空(IsEmpty下一个说) 如果是空的话返回,表示无法删除,但是这里也可以断言,因为是空的话就不能删除,所以这里也可以使用断言,下面我们就可以开始删除了,我们需要记录头节点前一个位置,自己头节点前前一个位置,因为删掉头节点前一个位置后,是需要保证前前一个位置和头节点的链接的,所以记录好之后再删除掉尾节点,然后再链接好前前一个节点和头节点

上面我们提到了一个IsEmpty函数,该函数用来判断是否为空下面我们看一下

11f60e71e9d0450f8290417ecdcfd391.png

判断是否为空其实不难,我们可以想一下,带头循环双向链表如何为空,或者是在什么情况下为空,或者就是他一个节点都没有的时候他的逻辑结构是什么样子的,是的!当他的next节点指向自己或者prev指向自己的时候表示没有一个节点,所以就为空,我们返回true即可,反之则有数据不为空,返回 false

下面我们来看一下头删

4439af360e044af993b15629f2de21f7.png

头删其实也并不难,只需要记录头节点下一个的下一个节点的位置然后再删除头节点的下一个位置就可以了,不过这里也需要注意保证好链接关系。

 下面我们可以看一下查找函数

bd6d884d7d3d4f8d87c683cafc8b4643.png

查找函数,当某一个节点的值和x相等时返回该节点的指针,如果查找到头节点了还没有找到则为空。

下面我们来看一下insert和erase是任意位置的插入和删除 

2614b4fbd5954ec88b6e81aff0e07ee4.png

这里我们需要注意的是我们插入的位置是一个该类型的指针,所以这个函数需要和我们的find函数联动,我们记录pos位置前一个节点然后就可以插入了。

0c0c9651519a45178ac1634f233e5299.png 

删除也是一样的,也是pos位置的节点,我们记录pos的前一个和后一个,就可以删除pos。 这里我们还传了一个头节点,其实这里是不需要传头节点的 (因为C语言的需要缺陷,这里我们可以看到,如果我们pos传成头节点话会怎么样?明显会崩溃掉,逻辑结构错误,所以我们需要和头节点比较一下,如果pos和头节点相同的话就不能删除)。

最后我们来看一下销毁函数

c4dc200ec1df411d9d6c22885e7f2e48.png

关于销毁函数我们就可以删掉所有的节点后在删除头节点,就是销毁,所以我们可以直接调用头删或者尾删,所以while循环可以用isempty判断,这里我忘记用了,不过都是一样的,等删的只剩下头节点后,我们可以free掉头节点,然后就销毁了。

看到这里基本就结束了,但是我们实际上是增删查改,里面没有改,这里是为什么?因为这里我们想一下find函数我们查找到后返回了该节点的指针,所以我们可以 解引用后修改该节点,所以find也可以充当修改。

 

相关内容

热门资讯

四个自信四个意识两个维护具体内... 今天给各位分享四个自信四个意识两个维护具体内容是什么的知识,其中也会对四个自信四个意识两个维护具体内...
四个意识四个自信是什么(两个确... 本篇文章极速百科给大家谈谈四个意识四个自信是什么,以及两个确立,两个维护对应的知识点,希望对各位有所...
汽车主动轮是哪个轮(汽车主动轮... 今天给各位分享汽车主动轮是哪个轮的知识,其中也会对汽车主动轮是前轮还是后轮进行解释,如果能碰巧解决你...
菡字的意思(菡字的意思和特质)... 本篇文章极速百科给大家谈谈菡字的意思,以及菡字的意思和特质对应的知识点,希望对各位有所帮助,不要忘了...
一路航导航仪怎么样(一路为你导... 今天给各位分享一路航导航仪怎么样的知识,其中也会对一路为你导航进行解释,如果能碰巧解决你现在面临的问...
堂堂正正打一生肖(堂堂正正打一... 今天给各位分享堂堂正正打一生肖的知识,其中也会对堂堂正正打一生肖动物生肖进行解释,如果能碰巧解决你现...
雨燕油耗多少真实油耗多少?(雨... 今天给各位分享雨燕油耗多少真实油耗多少?的知识,其中也会对雨燕15油耗高怎么解决进行解释,如果能碰巧...
湖南省车辆违章查询,平安在线湖... 今天给各位分享湖南省车辆违章查询,平安在线湖南省车辆违章查询的知识,其中也会对湖南车辆违章查询官网a...
网页qq直接登录聊天(无需下载... 本篇文章极速百科给大家谈谈网页qq直接登录聊天,以及无需下载直接登录对应的知识点,希望对各位有所帮助...
雷克萨斯ct200h报价多少(... 本篇文章极速百科给大家谈谈雷克萨斯ct200h报价多少,以及雷克萨斯260报价及参数对应的知识点,希...
川崎h2官方报价查询(川崎h2... 本篇文章极速百科给大家谈谈川崎h2官方报价查询,以及川崎h2r官方报价对应的知识点,希望对各位有所帮...
母亲节由来(母亲节由来英语简介... 今天给各位分享母亲节由来的知识,其中也会对母亲节由来英语简介进行解释,如果能碰巧解决你现在面临的问题...
沃尔沃XC602021款最低多... 今天给各位分享沃尔沃XC602021款最低多少钱可以落地?的知识,其中也会对沃尔沃xc602022款...
网上怎么预选车牌号(网上怎样预... 今天给各位分享网上怎么预选车牌号的知识,其中也会对网上怎样预选车牌号进行解释,如果能碰巧解决你现在面...
五一高速收费吗五天都免费吗(五... 本篇文章极速百科给大家谈谈五一高速收费吗五天都免费吗,以及五一高速收费吗五天都免费吗今天对应的知识点...
双环小贵族质量怎么样(双环小贵... 今天给各位分享双环小贵族质量怎么样的知识,其中也会对双环小贵族停产了吗进行解释,如果能碰巧解决你现在...
路威蓝盾摩托车2022价格及图... 本篇文章极速百科给大家谈谈路威蓝盾摩托车2022价格及图片,以及路威蓝盾摩托车视频对应的知识点,希望...
世界上速度最快的10辆汽车-有... 今天给各位分享世界上速度最快的10辆汽车-有驾的知识,其中也会对世界上速度最快的汽车是什么车进行解释...
上海租车公司商务车中巴大巴上海... 本篇文章极速百科给大家谈谈上海租车公司商务车中巴大巴上海汽车租赁,以及上海租中巴车地点对应的知识点,...
什么叫ACGN(什么叫AcEl... 本篇文章极速百科给大家谈谈什么叫ACGN,以及什么叫AcEl类药对应的知识点,希望对各位有所帮助,不...
汽车保养项目更换周期表汽车保养... 今天给各位分享汽车保养项目更换周期表汽车保养周期表一览的知识,其中也会对汽车保养周期是多久进行解释,...
辽r是哪个城市的车牌号?(辽r... 本篇文章极速百科给大家谈谈辽r是哪个城市的车牌号?,以及辽r是哪儿的车牌对应的知识点,希望对各位有所...
九流指的是哪九流(九流霸主) ... 本篇文章极速百科给大家谈谈九流指的是哪九流,以及九流霸主对应的知识点,希望对各位有所帮助,不要忘了收...
PPT造车,资本游戏还是历史使... 今天给各位分享PPT造车,资本游戏还是历史使命?的知识,其中也会对ppt造车有哪些进行解释,如果能碰...
什么是普世价值(什么是普世价值... 本篇文章极速百科给大家谈谈什么是普世价值,以及什么是普世价值?对应的知识点,希望对各位有所帮助,不要...
火麒麟的寓意和象征(火麒麟的寓... 今天给各位分享火麒麟的寓意和象征的知识,其中也会对火麒麟的寓意和象征镇宅吗进行解释,如果能碰巧解决你...
007工作制是什么意思(工作制... 本篇文章极速百科给大家谈谈007工作制是什么意思,以及工作制996 985 007对应的知识点,希望...
奥迪A61.8T提速缓慢(奥迪... 本篇文章极速百科给大家谈谈奥迪A61.8T提速缓慢,以及奥迪a628提速慢是怎么回事对应的知识点,希...
为什么我电脑12306登不上去... 为什么我电脑12306登不上去目录为什么我电脑12306登不上去12306登不上去是怎么回事电脑无法...
雷克萨斯rx200t售价多少(... 本篇文章极速百科给大家谈谈雷克萨斯rx200t售价多少,以及rx200雷克萨斯报价表对应的知识点,希...