数据结构:带头双向循环链表——增加、删除、查找、修改,详细解析

读者可以先阅读这一篇:数据结构——单链表的增加、删除、查找、修改,详细解析_昵称就是昵称吧的博客-优快云博客,可以更好的理解带头双向循环链表


目录

 一、带头双向循环链表的处理和介绍

1、带头双向循环链表的概念

2、带头双向循环链表的结构

 3、节点的处理

4、头节点的处理

5、节点(结构体)内存空间的开辟

二、链表的主体框架

1、整体框架

 2、主菜单

 三、功能的实现

1、创建一个新节点的函数

2、初始化创建头节点的函数

3、打印节点数据的函数

4、尾插和头插增加节点的函数

4.1 从尾部插入节点的函数

4.2 从头部插入节点的函数

5、尾删和头删减少节点的函数

5.1 从尾部删除节点的函数

 5.2 从头部删除节点的函数

 6、提供一个数据,找到这个数据所在的节点的函数

7、给一个数据,在其所在节点前面插入一个节点的函数

8、给一个数据,删除这个数据所在的节点的函数

 9、修改数据的函数

10、部分功能的简化与升级

 10.1 尾插和头插函数的简化升级

 四、总代码

 五、代码运行实例


 一、带头双向循环链表的处理和介绍

1、带头双向循环链表的概念

 链表的概念链表是一种物理存储结构上非连续非顺序存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

带头双向循环链表是链表中最复杂的,因为它具有了链表存在的结构中所有的结构:带头,双向和循环。

1、带头和不带头带头就是链表带有头节点,这个头节点只具有哨兵位的作用意思就是它不随着链表的改变而改变,定义之后就固定不变了,并且头节点里面不存放数据;不带头就是链表没有头节点。

2、双向和单项:双向就是一个节点,既存上一个节点的地址,也存下一个节点的地址单向就是一个节点,只存下一个节点的地址。


3、循环和非循环:循环就是这个链表的最后一个节点里的指针存放的地址,如果链表带头,就存放的头节点的地址;如果链表不带头,就存放第一个节点的地址非循环就是这个链表的最后一个节点存放的地址是空的。


2、带头双向循环链表的结构

 头节点里面是不存放数据的,只具有哨兵位的作用,各个节点之间通过节点里面的指针进行链接。单向链表里面,每个节点里只有一个指针,因为只需要指向下一个节点;但是双向链表中,每个节点里有两个指针,一个指向上一个节点,一个指向下一个节点。


 3、节点的处理

因为双向链表里面每个节点,都会存储一个数据和两个指针prevnext指针prev指向上一个节点指针next指向下一个节点,所以用结构体来表示节点。

typedef int ListDataType;//类型名重定义

typedef struct ListNode
{
	struct ListNode* prev;
	struct ListNode* next;
	ListDataType data;
}ListNode;

4、头节点的处理

在这里,我们用指针phead/plist表示头节点的地址,因为是带有头双向循环链表,所以定义头节点的时候,其节点里的指针prev和next都必须指向自己

	phead->prev = phead;//头节点不存放数据
	phead->next = phead;

5、节点(结构体)内存空间的开辟

因为每个节点都是结构体,为了不会导致内存空间的浪费,需要用一个节点,就开辟一个节点。所以用动态内存开辟函数malloc即可,每次开辟一个结构体大小的内存空间。但是要注意,每个节点创建的时候,其里面的指针prev和next都要先置为空指针,方便后面的修改。

	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	newnode->next = NULL;//因为是新节点,都先初始化置为空指针
	newnode->prev = NULL;
	newnode->data = x;//将想要的数据放入进去

二、链表的主体框架

1、整体框架

int main()
{
	int input = 0;
	do
	{
		meun();
		printf("请输入想要进行的操作:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值