【数据结构】单链表带头双向循环链表的实现

news2024/9/20 18:28:13

一、链表的概念及结构

1.链表的概念

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

2.链表的结构

一般讲的链表包括数据域和指针域:

二、链表的种类

实际中链表的结构非常多样,由以下三组类型自由组合可得8种链表结构:

1.单向、双向:

2.带头、不带头:

3.循环、非循环:

虽然有这么多类型,但我们最长使用的就是以下两种:

在此我们只实现这两种链表

三、单链表的实现

1.自定义链表结点struct SListNode
typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;
2.链表打印数据SListPrint
//打印
void SListPrint(SListNode* plist)
{
	if (plist == NULL)
		return;

	while (plist)
	{
		printf("%d->", plist->data);
		plist = plist->next;
	}
}
3.链表创建结点BuyListNode
//创建节点
SListNode* BuySListNode(SLTDateType x)
{
	SListNode* new_node = (SListNode*)malloc(sizeof(SListNode));
	if (new_node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	new_node->data = x;
	new_node->next = NULL;
	return new_node;
}
4.链表尾部插入数据SListPushBack
//尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{
	//无节点
	if (*pplist == NULL)
	{
		(*pplist) = BuySListNode(x);
	}

	//有节点
	SListNode* tail = *pplist;
	while (tail->next)
	{
		tail = tail->next;
	}
	tail->next = BuySListNode(x);
}
5.链表头部插入数据SListPushFront
//头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{
	SListNode* new_node = BuySListNode(x);
	new_node->next = *pplist;
	*pplist = new_node;
}
6.链表尾部删除数据SListPopBack
//尾删
void SListPopBack(SListNode** pplist)
{
	//空链表
	if ((*pplist) == NULL)
		return;

	//一个节点
	if ((*pplist)->next == NULL)
	{
		SListNode* tmp = *pplist;
		free(tmp);
		tmp = NULL;
	}

	//多个节点

	else
	{
		SListNode* cur = *pplist;
		SListNode* next = cur->next;

		//找尾
		while (cur->next->next)
		{
			cur = next;
			next = next->next;
		}
		free(next);
		cur->next = NULL;
	}

}
7.链表头部删除数据SListPopFront
//头删
void SLPopFront(SListNode** pplist)
{
	//没有节点
	if ((*pplist) == NULL)
		return;

	//一个节点
	//多个节点
	SListNode* tmp = *pplist;
	*pplist = (*pplist)->next;
	free(tmp);
	tmp = NULL;
}
8.链表查找数据
//查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
	SListNode* cur = plist;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
9.链表在pos位置之后插入数据
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	//在非尾节点插入
	if (pos->next != NULL)
	{
		newnode->next = pos->next;
		pos->next = newnode;
	}
	else
	{
		SListPushBack(&pos, x);
	}
}

10.删除pos位置之后的值

// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{
	if (pos->next == NULL)
	{
		printf("erroe");
		return;
	}
	SListNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

11.销毁链表

//销毁链表
void SLTDestroy(SListNode** pphead)
{
	if (*pphead == NULL)
		return;
	SListNode* next = (*(pphead))->next;
	while (*pphead)
	{
		//销毁
		SListNode* del = *pphead;
		free(del);
		del = NULL;

		//迭代
		*pphead = next;
		if(next)
		next = next->next;
	}
}

四.带头双向循环链表的实现

1.自定义链表结点 ListNode

typedef int LTDataType;
typedef struct ListNode
{
	LTDataType _data;
	struct ListNode* _next;
	struct ListNode* _prev;
}ListNode;

2.创建新节点


//创建新节点
ListNode* BuyLTNode(LTDataType x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->_data = x;
	newnode->_next = NULL;
	newnode->_prev = NULL;

	return newnode;
}

3.创建一个新链表,返回头结点

// 创建返回链表的头结点.
ListNode* ListCreate()
{
	ListNode* Phead = BuyLTNode(-1);
	Phead->_next = Phead;
	Phead->_prev = Phead;

	return Phead;
}

4.打印链表

//打印链表
void ListPrint(ListNode* pHead)
{
	if (pHead == NULL)
		return;
	ListNode* cur = pHead->_next;
	printf("pHead <=> ");
	while (cur!=pHead)
	{
		printf("%d <=> ", cur->_data);
		cur = cur->_next;
	}
}

5.在pos之前插入值为x节点

//在pos前插入
void ListInsert(ListNode* pos, LTDataType x)
{
	ListNode* pre = pos->_prev;
	ListNode* newnode = BuyLTNode(x);
	newnode->_next = pos;
	pos->_prev = newnode;
	pre->_next = newnode;
	newnode->_prev = pre;
}

6.尾插

//尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
	ListInsert(pHead,  x);
}

7.头插

//头插
void ListPushFront(ListNode* pHead, LTDataType x)
{
	ListInsert(pHead->_next, x);
}

8.删除pos位置节点

//删除pos位置的节点
void ListErase(ListNode* pos)
{
	ListNode* pre = pos->_prev;
	ListNode* next = pos->_next;
	free(pos);
	pos = NULL;
	pre->_next = next;
	next->_prev = pre;
}

9.双向链表头删

// 双向链表头删
void ListPopFront(ListNode* pHead)
{
	ListErase(pHead->_next);
}

10.双向链表尾删

// 双向链表尾删
void ListPopBack(ListNode* pHead)
{
	ListErase(pHead->_prev);
}

11.查找

// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
	ListNode* cur = pHead->_next;
	while (cur != pHead)
	{
		if (cur->_data == x)
			return cur;

		cur = cur->_next;
	}
	return NULL;
}

12.销毁链表

//销毁链表
void ListDestory(ListNode* pHead)
{
	ListNode* cur = pHead->_next;
	while (cur)
	{
		ListNode* next = cur->_next;
		free(cur);
		pHead->_next = next;
		cur = next;

	}
}

注:带头双向循环链表的头插头删,尾插尾删直接复用了插入删除代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云HIS系统源码,业务云协同和数据云协同的数字化医院信息系统

云HIS是利用云计算、大数据、物联网、移动互联网等技术&#xff0c;打造的一个安全、便捷、共享、协同的医疗互联网云生态平台。核心功能是业务云协同和数据云协同。云HIS具有可扩展、易共享、易协同、低成本、体验号、更便捷、易维护的优势&#xff0c;重新定义了数字化医院信…

Intel(R) Wireless-AC 9462 WLAN已关闭开不起来的可能原因

最近给老电脑机械师T90重装系统&#xff0c;装好各种驱动之后&#xff0c;发现无线功能开不起来&#xff0c;WLAN已关闭不管怎么操作都开不起来 最后尝试把笔记本的无线网卡重新插了一下就正常了

freertos的学习cubemx版

HAL 库的freertos 1 实时 2 任务->线程 3 移植 CMSIS_V2 V1版本 NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15 编码规则&#xff0c; 变量名 &#xff1a;类型前缀&#xff0c; c - char S - int16_t L - int32_t U - unsigned Uc - uint8_t Us - uint…

sheng的学习笔记-AI-公式-指数加权移动平均(EWMA)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 指数加权移动平均&#xff08;Exponential Weighted Moving Average&#xff09;&#xff0c;是一种常用的序列处理方式 看例子&#xff0c;首先这是一年365天的温度散点图&#xff0c;以天数为横坐标&#xff0…

C++进阶(9)C++11

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 目录 一、统一列表初始化 二、变量类型推导 1、auto 2、decltype 3、typeid 三、左值/右值 1、左值引用/右值引用&#xff08;粗&#xff09; 2、右值 3、右值引用&#xff08;细&#xff09; 1…

135.分发糖果,遍历方向+candy选取的详解

力扣135分发糖果 题目思路代码 题目 https://leetcode.cn/problems/candy/description/ 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子…

【Python机器学习】朴素贝叶斯——使用Python进行文本分类

目录 准备文本&#xff1a;从文本中构建词向量 训练算法&#xff1a;从词向量计算概率 测试算法&#xff1a;根据现实情况修改分类器 准备数据&#xff1a;文档词袋模型 要从文本中获取特征&#xff0c;需要先拆分文本。这里的特征是来自文本的词条&#xff0c;一个词条是字…

大脑网络交互分析:公式与应用

大脑网络交互分析&#xff1a;公式与应用 核心概念与重要性 大脑网络交互分析是神经科学研究中的重要领域&#xff0c;它关注大脑不同区域之间的连接与交互方式。通过分析大脑网络&#xff0c;我们可以理解大脑如何处理和整合信息&#xff0c;进而揭示认知、情感和行为的神经…

java 集合框架-map(键值对集合)

一、Map接口 (键值对集合) 1.实现类 (1).线程不安全 HashMap 1.特点: ①无序 ②查找效率高&#xff1a;根据key&#xff0c;查找value 2.数据结构&#xff1a;数组&#xff08;哈希表&#xff09; 链表&#xff08;链地址法解决哈希表冲突&#xff09; 红黑树&#xff0…

UDP的报文结构及其注意事项

1. 概述 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的数据传输服务&#xff0c;不保证数据的可靠传输。在网络通信中&#xff0c;UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用&#xff0c…

大数据的数据质量有效提升的研究

大数据的数据质量有效提升是一个涉及多个环节和维度的复杂过程。以下是从数据采集、处理、管理到应用等方面&#xff0c;对大数据数据质量有效提升的研究概述&#xff1a; 一、数据采集阶段 明确采集需求&#xff1a;在数据采集前&#xff0c;需明确数据需求&#xff0c;包括…

Mike21粒子追踪模型particle tracking如何展示粒子轨迹

前言&#xff1a; 随着模型的推广&#xff0c;模型的很多模块也问的多了起来&#xff0c;PT粒子追踪模块最近群友也在问&#xff0c;结果算了出来&#xff0c;却实现不了展示运动轨迹。今天就写段简单的PT后处理的方法吧。 注意&#xff1a;MIKE21输出模块中不但输出了关于水…

3个管人绝招,让下属心服口服

管人不能瞎管&#xff0c;手段很重要&#xff1a;3个管人绝招&#xff0c;让下属心服口服 一&#xff1a;差异化管理&#xff0c;玩弄人性 谁赞成&#xff0c;谁反对&#xff0c;看清楚谁顺从自己&#xff0c;谁反对自己之后&#xff0c;接下来要做的便是区别对待。 给听话的…

简单的CSS样式

样式分为三种 内部样式&#xff1a;写在html文件里的样式叫内部样式 内联样式&#xff1a;写在需要的标签中 外部样式&#xff1a;写在外部css文件里 可以通过不同的选择器来选择设置指定组件的样式&#xff1a; <style>/* 写在html文件里的样式叫内部样式 *//* 选择器 *…

PEFT LoRA 介绍(LoRA微调使用的参数及方法)

一 PEFT LoRA 介绍 官网简介如下图&#xff1a; 翻译过来是&#xff1a;低秩自适应(LoRA)是一种PEFT方法&#xff0c;它将一个大矩阵在注意层分解成两个较小的低秩矩阵。这大大减少了需要微调的参数数量。 说的只是针对注意力层&#xff0c;其实我自己平时微调操作注意力层多…

一款功能强大的视频编辑软件会声会影2023

会声会影2023是一款功能强大的视频编辑软件&#xff0c;由加拿大Corel公司制作&#xff0c;正版英文名称为‌Corel VideoStudio。它具备图像抓取和编修功能&#xff0c;可以处理和转换多种视频格式&#xff0c;如‌MV、‌DV、‌V8、‌TV和实时记录抓取画面文件。会声会影提供了…

微服务上(黑马)

文章目录 微服务011 认识微服务1.1 单体架构1.2 微服务1.3 SpringCloud 2 微服务拆分2.1 熟悉黑马商城2.2 服务拆分原则2.2.1.什么时候拆2.2.2.怎么拆 2.3 拆分服务2.3.1 拆分商品管理功能模块2.3.2 拆分购物车功能模块 2.4 远程调用2.4.1 RestTemplate2.4.2.远程调用 2.5 总结…

SpringBoot-21 SpringBoot微服务的发布与部署(3种方式)

基于 SpringBoot 的微服务开发完成之后&#xff0c;现在到了把它们发布并部署到相应的环境去运行的时候了。 SpringBoot 框架只提供了一套基于可执行 jar 包&#xff08;executable jar&#xff09;格式的标准发布形式&#xff0c;但并没有对部署做过多的界定&#xff0c;而且为…

25届最近5年广东工业大学自动化考研院校分析

广东工业大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…