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

 

相关内容

热门资讯

华熙生物赵燕谈胶原蛋白乱象:科... 21世纪经济报道记者雷晨 北京报道 近年来,重组胶原蛋白成为医美和护肤领域的热门概念,市场宣传中不乏...
富春染织完成董事会选举换届 开... 7月25日晚间,富春染织公告显示,当日,公司2025年第一次临时股东会和富春染织第四届第一次董事会在...
圣湘生物:两款产品取得医疗器械... 每经AI快讯,圣湘生物(SH 688289,收盘价:22.94元)7月27日晚间发布公告称,圣湘生物...
10年期国债收益率升至1.73... 近期债券市场出现显著调整,多重因素交织推动收益率持续上行。权益市场强势表现与大宗商品价格上涨形成合力...
当对手都在做下沉 蜜雪冰城旗下... [ 今年5月,蜜雪集团跟巴西签署40亿元人民币的采购意向大单,其中大多数是咖啡豆。 ] 当星巴克、瑞...
新手必看!股指期货交易规则基础... 股指期货交易规则,看似复杂抽象,实则与我们的日常生活有着奇妙的共通之处。它就像一场精心编排的生活交响...
王登发履新茅台技开公司“一把手... 一则微信公众号发布的信息,披露了茅台集团旗下的技术开发公司“一把手”已换人。 近日,南都湾财社-酒水...
特斯拉机器人V3量产版亮相!马... 快科技7月27日消息,特斯拉的Optimus人形机器人V3量产版终于要来了!马斯克在最近的财报电话会...
原创 中... 在金融全球化的浪潮中,中国资本市场始终勇立潮头,不断探索前行。7月26日,中国资本市场学会成立大会暨...
报告:我国经济增长保持韧性 下... 央广网北京7月27日消息(记者 樊瑞)近日,中国金融四十人论坛(CF40论坛)发布《2025年第二季...
超6300亿元!A股银行“分红... 7月25日,成都银行完成权益分派股权登记,将于7月28日发放现金红利,这标志着A股上市银行2024年...
老铺黄金:2025年上半年单个... 7月27日晚,老铺黄金(HK06181)披露2025年中期业绩预告。预计2025年上半年实现销售业绩...
保险行业2025年上半年回顾与... 今天分享的是:保险行业2025年上半年回顾与未来展望 报告共计:59页 2025年上半年保险行业回顾...
数币App上新!消费者、商户两... 数字人民币试点持续推进,相关数字钱包手机应用程序功能也在优化中。7月21日,北京商报记者注意到,日前...
A股热点迭出,个股连续涨停!资... 近段时间以来A股市场整体走势较为强劲,上周以来在雅江概念集体上行的推动下涨势更为明显,主要指数不同程...
原创 印... 令人惊讶的是,印度人开始反思自身制造业的发展状况。印度经济学家帕纳加利亚指出,印度原本有机会在20年...
首创证券拟赴港上市,“A+H”... 首创证券在A股上市不足三年便启动赴港上市计划。近日,首创证券公告称,公司董事会已审议通过了公司拟发行...
肥东杨大爷要帮“儿子”还钱,银... “儿子”在外借了2万元还不上 “要债人”电话直接打了过来 还?还是不还? 7月6日 肥东县公安局梁园...
A股上周16家上市公司公布并购... 转自:扬子晚报 扬子晚报网7月27日讯(记者 范晓林 薄云峰)近段时间以来,A股市场并购重组活跃度持...
独家|某股份行改动零售业务关键... 在资产端信贷“投不动”(多家行零售信贷增速连续几个季度放缓、更有甚者个贷投放负增长)、负债端存款“定...