C实现带头循环双向链表(pushback pushfront popback popfront insert erase find destroy等)
创始人
2025-05-29 11:35:57
0次

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

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

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也可以充当修改。

 

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...