【数据结构】单链表详解(超详细)

news2024/12/23 18:14:40

单链表是我们学习数据结构时必不可少的部分,但也由于指针的参与变得更加复杂,这篇文章学习完之后可以更好地理解与掌握链表结构

注意:

  • 数据结构中,不在乎菜单的创建,注重的是功能的实现;
  • 菜单的创建会影响我们的调试

在这里插入图片描述

目录

  • 结构体的创建:
  • 动态申请节点:
  • 打印:
  • 尾插:
  • 头插:
  • 尾删:
  • 头删:
  • 链表查找:
  • 链表插入某节点:
  • 链表删除某节点:

结构体的创建:

这里要注意typedef的灵活使用,可以更方便的使用与修改结构体,不必牵一发而动全身

typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;
}SListNode;

动态申请节点:

在我们前插或者尾插时,需要一个新的结点,故我们需要一个申请节点的函数帮助我们,同时我们需要返回这个地址,否则将会内存泄漏

SListNode* BuySListNode(SLTDateType x)
{
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

打印:

打印可以很好的帮助我们检查我们写的程序有无错误

void SListPrint(SListNode* plist)
{
	SListNode* cur = plist;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

尾插:

单链表尾差与顺序表尾差完全不一样,要知道,单链表在创建头结点时:SListNode* ps = NULL;
我们发现,创建的头结点是一个指针,而我们尾插时如果是第一个元素,就会改变ps的值,而改变一个指针的值需要传入指针的地址,故:

void SListPushBack(SListNode** pplist, SLTDateType x)
//传入二级指针,可以改变ps的值
{
	SListNode* newnode = BuySListNode(x);
	if (*pplist == NULL)
	{
		*pplist = newnode;
	}
	else
	{
		SListNode* cur= *pplist;
		while (cur->next != NULL)
		{
			cur = cur->next;
		}
		cur->next = newnode;
	}
}

头插:

与尾插同理,需要二级指针

void SListPushFront(SListNode** pplist, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	newnode->next = *pplist;
	*pplist = newnode;
}

尾删:

void SListPopBack(SListNode** pplist)
{
	assert(*pplist);
	SListNode* cur = *pplist;
	if (cur->next == NULL)
	{
		*pplist = NULL;
	}
	else
	{
		while (cur->next->next != NULL)
		{
			cur = cur->next;
		}
		free(cur->next);
		cur->next = NULL;
	}
}

头删:

void SListPopFront(SListNode** pplist)
{
	assert(*pplist);
	SListNode* cur = (*pplist)->next;
	free(*pplist);
	*pplist = cur;
}

链表查找:

SListNode* SListFind(SListNode* plist, SLTDateType x)
{
	assert(plist);
	SListNode* cur = plist;
	while (cur->next)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

(插入,删除)与查找通常是配套使用

链表插入某节点:

单链表插入时只能向后插入,因为单链表只能找到后边的节点却无法找到前边的节点,故链表的形态多种多样,适用各种场景

void SListInsertAfter(SListNode* pos, SLTDateType x)
{
	SListNode* newnode = BuySListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

链表删除某节点:

void SListEraseAfter(SListNode* pos)
{
	assert(pos->next);
	SListNode* cur = pos;
	SListNode* tmp = pos->next;
	cur->next = cur->next->next;
	free(tmp);
}

欢迎讨论,有问题可以及时找我沟通,每天25h高强度冲浪在这里插入图片描述

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

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

相关文章

什么是协议栈? 用户态协议栈设计(udp协议栈)

什么是协议栈呢? (协议栈(Protocol Stack)是计算机网络和通信系统中的一个重要概念,它指的是一组协议层的层次结构,这些协议层一起协同工作,以便在不同计算机或设备之间实现数据通信和交换。每…

开源 Wiki 软件 wiki.js

wiki.js简介 最强大、 可扩展的开源Wiki 软件。使用 Wiki.js 美观直观的界面让编写文档成为一种乐趣!根据 AGPL-v3 许可证发布。 官方网站:https://js.wiki/ 项目地址:https://github.com/requarks/wiki 主要特性: 随处安装&a…

【从零开始学习Redis | 第四篇】基于延时双删对Cache Aside的优化

前言: 在如今的单体项目中,为了减轻大量相同请求对数据库的压力,我们采取了缓存中间件Redis。核心思想为:把数据写入到redis中,在查询的时候,就可以直接从Redis中拿取数据,这样我们原本对数据库…

Microsoft Dynamics 365 CE 扩展定制 - 5. 外部集成

本章内容包括: 使用.NET从其他系统连接到Dynamics 365使用OData(Java)从其他系统连接到Dynamics 365使用外部库从外部源检索数据使用web应用程序连接到Dynamics 365运行Azure计划任务设置Azure Service Bus终结点与Azure Service Bus构建近乎实时的集成使用来自Azure服务总线…

单目标应用:粒子群优化算法(PSO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、粒子群优化算法(PSO)求解微电网优化 (1)部分代码 close all; clear ; clc; global P_load; %电负荷 gl…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

mooc单元测验第一单元

TCP和OSI参考模型对比 OSI参考模型与TCP/IP参考模型(计算机网络)_osi模型 tcpip模型_李桥桉的博客-CSDN博客 会话层和物理层

分享女儿的冬季时尚穿搭~经典款的羽绒服

分享女儿冬季的时尚穿搭—羽绒服 经典百搭的时尚款 90白鸭绒&#xff0b;杜邦三防工艺&#xff0b;精细走线&#xff0b;腰部抽绳 满满的设计感&#xff0c;穿上简直不要太好看啊&#xff01;

计算机组成与结构-安全性和可靠性

系统可靠性分析 概念 平均无故障时间 MTTF 1/失效率 平均故障修复时间 MTTR1/修复率 平均故障间隔时间 MTBFMTTFMTTR 系统可用性 MTTF/(MTTFMTTR)*100% 计算 串联系统 一个设备不可靠&#xff0c;整个系统崩溃RR1R2Rn 并联系统 所有设备不可靠&#xff0c;整个系统崩溃R1-(1…

数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储

1.压缩存储的目标 值相同的元素只存储一次 压缩掉对零元的存储&#xff0c;只存储非零元 特殊形状矩阵&#xff1a; 是指非零元&#xff08;如值相同的元素&#xff09;或零元素分布具有一定规律性的矩阵。 如&#xff1a; 对称矩阵 上三角矩阵 下三角矩阵 对角矩阵 准…

汽车标定技术(二)--基于XCP的标定测量实战

目录 1.工程创建 1.1 新建工程 1.2 设备配置 1.3 标定观测 1.4 刷写 2.原始hex文件与标定文件的合并 2.1 修改memory segment file 2.2 标定量地址偏移 ​编辑 2.3 标定后与原始hex文件合并 2.4 标定后直接merge 2.5 不用对ram地址进行偏移实现hex文件合并 本文使用…

算法?认识一下啦

一、什么是算法&#xff1f; 算法 &#xff0c;是对特定问题求解方法和步骤的一种描述。它是有限指令的有限序列&#xff0c;其中每个指令表示一个或多个操作。 算法和程序的关系 算法​是解决问题的一种方法或一个过程&#xff0c;考虑如何将输入转换成输出&#xff0c;一个…

小程序如何设置用户同意服务协议并上传头像和昵称

为了保护用户权益和提供更好的用户体验&#xff0c;设置一些必填项和必读协议是非常必要的。首先&#xff0c;用户必须阅读服务协议。服务协议是明确规定用户和商家之间权益和义务的文件。通过要求用户在下单前必须同意协议&#xff0c;可以确保用户在使用服务之前了解并同意相…

Android Studio布局

线性布局 水平或竖直排列子元素的布局容器 相对布局 可针对容器内每个子元素设置相对位置&#xff08;相对于父容器或同级子元素的位置&#xff09; 网格布局 找了下面这篇文章连接可以参考&#xff08;不再赘述&#xff09; GridLayout(网格布局) | 菜鸟教程 (runoob.com) …

【原创】java+swing+mysql校园共享单车管理系统设计与实现

摘要&#xff1a; 校园共享单车作为一种绿色、便捷的出行方式&#xff0c;在校园内得到了广泛的应用。然而&#xff0c;随着单车数量的增加&#xff0c;管理难度也不断加大。如何提高单车的利用率和管理效率&#xff0c;成为校园共享单车发展面临的重要问题。本文针对这一问题…

Python武器库开发-常用模块之collections模块(十七)

常用模块之collections模块(十七) 除python提供的内置数据类型&#xff08;int、float、str、list、tuple、dict&#xff09;外&#xff0c;collections模块还提供了其他数据类型: 计数器&#xff08;counter&#xff09;有序字典&#xff08;orderedDict&#xff09;可命名元…

基于动力学模型的机械臂滑膜控制

一、滑模控制设计思路 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/463230163&#xff08;思路理解&#xff09; https://blog.csdn.net/xiaohejiaoyiya/article/details/90271529&#xff08;干扰的处理&#xff09; 滑模控制的思路有两个关键&#xff0c;一个是设计…

【C++】多态 ⑫ ( 多继承 “ 弊端 “ | 多继承被禁用的场景 | 菱形继承结构的二义性 | 使用虚继承解决菱形继承结构的二义性 )

文章目录 一、多继承 " 弊端 "1、多继承被禁用的场景2、多继承弊端 二、代码示例 - 多继承弊端1、错误示例 - 菱形继承结构的二义性2、代码示例 - 使用虚继承解决菱形继承结构的二义性 一、多继承 " 弊端 " 1、多继承被禁用的场景 禁止使用多继承的场景 : …

LV.12 D16 轮询与中断 学习笔记

一、CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始 中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c…

如何使用Python和Matplotlib创建双Y轴动态风格折线图 | 数据可视化教程

前言 我的科研论文中需要绘制一个精美的折线图&#xff0c;我的折线图中有三条曲线&#xff0c;分别表示期望角速度指令信号&#xff0c;和实际的角速度信号&#xff0c;还有实际的航向角信号&#xff0c;现在我已经拥有了数据&#xff0c;使用Python中matplotlib.plt.plot来直…