【数据结构】双向循环链表的实现(c语言)

前言——双向链表的优点

带头双向循环链表结构最复杂,一般用在单独存储数据。

实际中使用的链表数据结构,都是带头双向循环链表。

另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带

来很多优势,实现反而简单了,后面我们代码实现了就知道了。

一.图解带头双向链表的结构

对于单向链表来说,每一个节点都由一个数据和一个指针构成,只需要指针记录下一个节点的地址即可。

而双向链表的每个节点由两个指针和一个数据组成,其中的一个节点用来保存上一个节点的地址,另一个指针用来保存下一个节点的地址,从而实现链表的双向。双向循环链表的示意图如下:

其中prev指针用来保存上一个节点的地址,next指针用来保存下一个节点的地址,data用来保存数据。

(1)带头双向循环链表的接口

二.实现链表的步骤

  1. 创建并初始化

首先需要定义一个结构体,然后需要在堆上申请空间作为头节点(俗称哨兵位节点),然后让它们首尾相连,就可以了。如下图所示:

定义一个结构体

为结构体申请空间

刚申请空间的时候把这两个指针置空(防止野指针),然后给data赋值

接着把申请来的新节点的地址返回

初始化

让头节点(哨兵位节点)自己指向自己,以便后续的判断

  1. 尾插和尾删及打印接口

(1)尾插,由循环链表(刚开始的图解)可以知道头节点的prev指针指向链表的尾,先让tail指针指向尾,

然后让头节点的prev指向newnode(此时newnode为尾节点),

然后让原来的尾节点的next指针指向newnode,

再让newnode的next指针指向头节点(phead)实现循环,

最后让newnode的prev指针指向tail(原来的尾节点)即可

2)尾删前需要判断一下链表是否为空,因此创建一个判断链表是否为空的接口

(3)尾删,用一个指针记录一下尾节点的地址,

然后让尾节点的上一个节点指向头节点,

再让头节点的prev指针指向此时尾节点的上一个节点,

最后把为节点释放掉就好了,

这里我没有让tail指针置空,是因为tail是局部变量,该函数一调用完,该函数的栈帧就会立马

被销毁(tail也被销毁了),所以我觉得没必要(不会发生野指针问题),当然想置空也是可以的

(4)打印接口

这里只需要注意当tail等于头指针时结束遍历即可,因为该链表为循环链表如果没有这个条件将会发生死循环,最后程序会崩掉

3.头插和头删

头插,该链表的头插和链表的头插有点区别,就是需要把新节点插到头节点的后面

让新节点的next指针指向原来的头节点的下一个节点,

让新节点的prev节点指向头节点,

然后让头节点的下一个节点的prev指针指向新节点,

最后让头节点的next指针指向新节点

头删删除链表中的数据肯定先要判断链表是否为空,所以进行了一下断言

定义一个指针first用来保存被删除的节点,

然后让头节点指向被删除节点(first)的下一个节点,

然后再让first指针的下一个节点的prev指针指向头节点

最后把first指向的节点释放掉就好了

  1. 任意元素前的插入和任意元素的删除

任意元素前的插入

让新节点的next指针指向pos节点

然后让新节点的prev指向pos节点的上一个节点

再让新节点的上一个节点(原来pos节点的上一个节点)的next指向新节点

最后让pos节点的prev指针指向新节点

任意元素的删除

先让pos节点的上一个节点的next指针指向pos节点的下一个节点,

然后再让pos节点的下一个节点的prev指针指向pos节点的上一个节点

最后释放掉pos节点,把pos节点置空即可

  1. 元素的查找

查找要找的元素,如果找到就返回该节点,如果找不到就返回NULL

  1. 链表的销毁

把申请的链表给删掉,不过多阐述了

三.一些小技巧

1.任意元素前插入(头插)

当我们在需要在较短的时间内写出一个双向循环链表的时候

可以只写 任意元素前的插入、和任意元素的删除即可

因为当给任意元素前的插入接口传头节点的next指针指向的地址时,相当于头插(如下图)

2.任意元素前插入(尾插)

当给任意元素前的插入接口传plist(头节点)的地址时,相当于尾插(如下图)

因为链表是从plist(头节点)的下一个节点开始遍历,

最后才到头节点

3.任意元素的删除(头删)

当给该接口传头节点的next指针指向的地址时,此时该接口相当于头删,如下图:

4.任意元素的删除(尾删)

给该接口传头节点的prev指针指向的地址时,此时该接口相当尾删,如下图:

今日份享就到这里了,路过的小伙们给个关注和小赞吧,如果有错误也请指出来,让我们共同进步吧(886)!!!

猜你喜欢

转载自blog.csdn.net/m0_72532428/article/details/129477992