[数据结构] -- 双向循环链表

🌈 个人主页:白子寰

🔥 分类专栏:C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集 👈 希望得到您的订阅和支持~

💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

双向循环链表

结构

介绍

图示

双向链表的实现

在List.h中

定义双向链表的结构

实现双向链表的接口/方法

在List.c中

初始化

销毁链表

打印链表

判断链表是否为空

尾插

测试

头插

测试

​编辑尾删

测试

​编辑头删

测试

​编辑在pos位置之后插入数据

测试

​编辑删除pos指定节点

测试

查找链表的指定元素


双向循环链表

结构

包含数据域,指针域(前驱节点prev和后继节点next)


介绍

结构最复杂,一般用在单独存储数据。

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

另外这个结构虽然结构复杂,

但是使用代码实现以后会发现结构会带来很多优势,但实现简单


图示



双向链表的实现

在List.h中

定义双向链表的结构

cs 复制代码
typedef int LTDataType;
typedef struct ListNode
{
	LTDataType data;
	struct ListNode* prev;
	struct ListNode* next;
}LTNode;

实现双向链表的接口/方法

cs 复制代码
//初始化
LTNode* LTInit();
//销毁链表
void LTDestroy(LTNode* phead);
//打印链表
void LTPrint(LTNode* phead);
//判断链表是否为空
bool LTEmpty(LTNode* phead);
//尾插
void LTPushBack(LTNode* phead, LTDataType x);
//头插
void LTPushFront(LTNode* phead, LTDataType x);
//尾删
void LTPopBack(LTNode* phead);
//头删
void LTPopFront(LTNode* phead);
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
//删除pos指定节点
void LTErase(LTNode* pos);
//查找链表的指定元素
LTNode* LTFind(LTNode* phead, LTDataType x);


在List.c中

初始化

cs 复制代码
//初始化
LTNode* LTInit()
{
	LTNode* phead = LTBuyNode(-1);
	return phead;
}

销毁链表

cs 复制代码
//销毁
void LTDestroy(LTNode* phead)
{
	assert(phead);

	LTNode* pcur = phead->next;
	while (pcur != phead)
	{
		LTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}

	//最后释放头节点的内存并置空
	free(phead);
	phead = NULL;
}

打印链表

cs 复制代码
//打印双向链表
void LTPrint(LTNode* phead)
{
	assert(phead);

	LTNode* pcur = phead->next;
	while (pcur != phead)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("\n");
}

判断链表是否为空

cs 复制代码
bool LTEmpty(LTNode* phead)
{
	if (phead->next == phead)
	{
		return true;
	}

	else { return false; }
}

尾插

cs 复制代码
//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);

	LTNode* newnode = LTBuyNode(x);

	newnode->next = phead;
	newnode->prev = phead->prev;

	phead->prev->next = newnode;
	phead->prev = newnode;
}

后四行的方向和赋值问题

有新开节点newnode

测试

头插

cs 复制代码
//头插
void LTPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);

	LTNode* newnode = LTBuyNode(x);
	LTNode* pcur = phead->next;

	newnode->next = pcur;
	newnode->prev = phead;

	phead->next = newnode;
	pcur->prev = newnode;
}
测试


尾删

cs 复制代码
//尾删
void LTPopBack(LTNode* phead)
{
	assert(phead);

	LTNode* p1 = phead->prev;
	LTNode* pcur = p1->prev;

	pcur->next = phead;
	phead->prev = pcur;

	free(p1);
	p1 = NULL;
}
测试


头删

cs 复制代码
//头删
void LTPopFront(LTNode* phead)
{
	assert(phead);

	LTNode* pcur = phead->next->next;
	LTNode* p1 = phead->next;

	phead->next = pcur;
	pcur->prev = phead;

	free(p1);
	p1 = NULL;
}
测试


在pos位置之后插入数据

cs 复制代码
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{
	assert(pos);

	 LTNode* newnode = LTBuyNode(x);

	 newnode->next = pos->next;
	 newnode->prev = pos;

	 //如果pos是最后一个节点
	 if (pos->next == NULL)
	 {
		 newnode->next = NULL;
	 }
	 else
	 {
		 pos->next->prev = newnode;
	 }

	 pos->next = newnode;
}
测试


删除pos指定节点

cs 复制代码
//删除pos节点
void LTErase(LTNode* pos)
{
	assert(pos);

	LTNode* p1 = pos->prev;
	LTNode* pcur = pos->next;

	p1->next = pcur;
	pcur->prev = p1;

	free(pos);
	pos = NULL;
}
测试

查找链表的指定元素

cs 复制代码
//查找元素
LTNode* LTFind(LTNode* phead, LTDataType x)
{
	assert(phead);

	LTNode* pcur = phead->next;
	while (pcur != phead)    //注意循环条件!
	{
		if (pcur->data == x)
		{
			return pcur;
		}

		else
		{
			pcur = pcur->next;
		}
	}
	return NULL;
}


***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

"人生如逆旅,我亦是行人"。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!!

好了划走吧。

相关推荐
Forever Nore2 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光5 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
不一样的故事1266 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴7 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_7988 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm9 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡9 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年11 小时前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs66611 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径
今日无bug11 小时前
JS 数据类型 + 内存分配:从 8 种类型到栈堆模型
javascript·数据结构