线性表——双向链表

一.什么是双向链表

双向链表也属于线性表中的一种,分为普通双向链表和双向循环链表,结构如下图

双向链表也分为普通双向链表和带头结点的双向链表。普通双向链表就是不带头节点的双向链表,这种双向链表在插入和删除时都要判断头指针是否为空,分支多,很容易出bug;带头结点(也叫哨兵位)的双向链表无论链表是否为空,操作均统一,不易出现问题。

二.双向链表的初始化、增、删、查、改

1.双向链表的初始化

双向链表的空间也分为数据域和指针域,但是指针域要有两个指针,分别时指向上一个结点的指针和指向下一个结点的指针,因此结构应该是这样

复制代码
struct DNode
{
    ElemType data;
    struct DNode* prior;
    struct DNode* next;
};

在头文件声明如下

现在来对双向链表进行初始化,即创建一个不存储任何有效数据的头结点。当然如果不想使用头节点,可以只创建一个头指针,把头指针置为空即可,这里选择带头节点的初始化。

这样就得到了个不存储任何数据的头结点,在头文件声明后我们调试看初始化是否正常

能看到是可以初始化成功的,不过这里有个问题,初始化完成后,头节点的prior和next是野指针,我们需要手动给它们置为空。

2.双向链表的头插操作

上面我们已经初始化了头文件,假设插入的结点指针为pos,头插的时候只需要让pos的prior指向phead,pos的next置等于phead的next,phead的next指向pos,phead的原next的prior也要指向pos,即

用代码实现就是

这里有个问题,如果是第一次插入,那么

复制代码
phead->next->next->prior = temp;

不就越界访问了吗?所以这里要加一个判断语句,如果phead->next不为空,再执行这个语句

同时在头文件声明,为了直观观察每一次操作的变化,先定义一个打印函数

现在来测试一下头插函数

3.双向链表的尾插操作

现在我想在链表的尾部插入一个结点p1,只需要让p1的prior指向尾结点,next指向尾结点的next;最后尾结点的next指向p1即可

用代码实现就是

测试代码运行结果

4.双向链表的查询函数

经过了前面的顺序表和单链表,我们发现,线性表的查询函数几乎一直,都是通过遍历来找到要查询的值的地址,双向链表也如此,传入头指针和要查询的值后,逐个遍历比较。

在头文件声明后进行测试

当要查询的值不存在时返回空,输出的地址就为00000000;存在则正常输出地址。

5.双向链表的指定位置前后插入操作

在指定位置前后插入值,需要我们提前利用查询函数得到目标地址,然后进行插入操作,双向链表此时的优势已经体现出来了,由于双向链表可以随意访问前驱结点或者其后继结点,在插入或者删除数据时十分方便。

进行指定位置前插入其实和头插函数几乎一模一样,进行指定位置的尾插操作时和尾插几乎一模一样,只需要将头指针替换为指针位置的指针即可。

前插

后插

这两个操作很相似,只是改变指针的指向不同,来测试结果

测试通过

6.双向链表的删除操作

直接单独做头删或尾删或指定位置删与前面的顺序表和单链表过于相似,因此这里选择删除想要删除的值,若值不存在则返回false,若删除成功则返回true。因为是按值删除,所以要遍历链表查找值,直接调用前面定义好的查询函数,在释放前先完成指针的指向交换,再进行free

同时在头文件声明,来测试代码的可行性

成功将9 21 10等值删除。

那么双向链表的基本操作也就这些了,当然其它操作SunnyByte还在学习中...

相关推荐
番茄灭世神3 小时前
汇顶模拟前端GH3220使用备忘录
c语言·单片机·传感器·模拟芯片·电生理信号处理
find1star5 小时前
LeetCode 25:K 个一组翻转链表
java·数据结构·算法·leetcode·链表·职场和发展·动态规划
Brilliantwxx6 小时前
【STM32 】把 printf 搬到串口上 —— C 标准 IO 函数重定向与多文件工程搭建(实战串口电灯)
c语言·开发语言·stm32·单片机·嵌入式硬件·架构·ecmascript
wuminyu6 小时前
Kafka利用sendfile与Page Cache实现高性能传输剖析
java·linux·c语言·jvm·c++
亮_一个嵌入式新手7 小时前
C语言Day21
c语言·开发语言
djarmy16 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
李永奉17 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
爱吃苹果的日记本20 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
aramae1 天前
模拟实现strstr函数(C语言)
c语言·开发语言·算法
多弗朗皮卡丘1 天前
数据结构4:链表(下)
c语言·数据结构·链表