【数据结构:线性表】单链表

news2024/11/25 18:34:39

在学习了顺序表,我们可能会对其有一些思考:

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到
    200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

那么有没有一些更好的结构来解决这些问题呢?这篇博客就给大家讲一讲单链表这个重要的数据结构。


⚡链表的概念及结构

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

链表的结构: 链式结构在逻辑上是连续的,但在物理上不一定连续。


⚡单链表各接口实现

typedef int SLTDatatype;

typedef struct SListNode
{
	SLTDatatype data;
	struct SListNode* next;
}SLTNode;

动态申请一个结点:

SLTNode* BuySLNode(SLTDatatype x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		return 0;
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

单链表的打印:

void SLPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

单链表头插:

void SLPushFront(SLTNode** pphead, SLTDatatype x)
{
	/*SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;*/

	SLTNode* newnode = BuySLNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

单链表尾插:

void SLPushBack(SLTNode** pphead, SLTDatatype x)
{
	SLTNode* newnode = BuySLNode(x);
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

单链表头删:

void SLPopFront(SLTNode** pphead)
{
	assert(*pphead);
	/*if ((*pphead)->next == NULL)
	{
		*pphead = NULL;
	}
	else
	{
		SLTNode* tail = *pphead;
		*pphead = tail->next;
	}*/
	SLTNode* tail = *pphead;
	*pphead = tail->next;
}

单链表尾删:

void SLPopBack(SLTNode** pphead)
{
	assert(*pphead);
	//单链表只有一个结点
	if ((*pphead)->next == NULL)
	{
		*pphead = NULL;
	}
	//结点数大于1
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next->next)
		{
			tail = tail->next;
		}
		tail->next = NULL;
	}
}

 单链表查找:

SLNode* SLFind(SLNode* pphead, SLNDatatype x)
{
	SLNode* tail = pphead;
	while (tail != NULL)
	{
		if (tail->data == x)
		{
			return tail;
		}
		tail = tail->next;
	}
	return NULL;
}

单链表pos位置处插入结点:

void SLInsert(SLNode** pphead, SLNode* pos, SLNDatatype x)
{
	assert(pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLPushFront(pphead, x);
	}
	else
	{
		SLNode* tail = *pphead;
		while (tail->next != pos)
		{
			tail = tail->next;
		}
		SLNode* newnode = BuySLNode(x);
		tail->next = newnode;
		newnode->next = pos;
	}
}

单链表pos位置之后插入结点:

void SLInsertAfter(SLNode* pos, SLNDatatype x)
{
	assert(pos);
	SLNode* newnode = BuySLNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

在单链表删除pos处的结点:

void SLErase(SLNode** pphead, SLNode* pos)
{
	assert(pphead);
	assert(*pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLPopFront(pphead);
	}
	else
	{
		SLNode* cur = *pphead;
		while (cur->next != pos)
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
	}
}

在单链表删除pos之后的结点:

void SLEraseAfter(SLNode* pos)
{
	assert(pos);
	assert(pos -> next);
	pos->next = pos->next->next;
	free(pos->next);
}

感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的数据结构。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

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

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

相关文章

第四次工业革命的里程碑-chatgpt

文章目录 一、 介绍二、 训练数据方法、数据来源三、 能帮你做什么做表格论文降重写文案、周报写代码改bug写注释写作业制作游戏策划方案 四、 搭建自己的chatgpt方法五、 安全、安全试用chatgpt的方法六、 几款类似chatgpt的工具七、 优点八、 缺点九、下一步的期待十、 总结 …

vue中vue-cli项目各种报错

目录 sockjs.js报错 [WDS] Disconnected报错 假如有以上报错&#xff0c;首先看下index.html有没有这句 <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests"> 是限制资源获取&#xff1a;限制网页当中一系列的资源获…

OkHttp3源码解析 - 拦截器

系列文章目录 第一章 OkHttp3源码解析 - 请求流程 第二章 OkHttp3源码解析 - 拦截器 第三章 OkHttp3源码解析 - 连接机制和缓存机制 文章目录 系列文章目录前言一、五大内置拦截器二、拦截器分发流程1.RetryAndFollowUpInterceptor-重试重定向拦截器2.BridgeInterceptor-桥接拦…

用友BIP助力中国领先企业数智化国产替代

随着数字经济的快速发展&#xff0c;软件的重要性日益凸显。软件是新一代信息技术的灵魂&#xff0c;已经成为数字中国、制造强国、网络强国建设的关键支撑。面对全球竞争新格局&#xff0c;关键软件自主创新与国产化替代已迫在眉睫。 助力华为成功替换国外ERP系统 在此背景下…

android studio Switch按钮

1.添加按钮 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"horizontal"><TextViewandroid:id"id/tv1"android:layout_width"0dp"android:layout_weig…

JavaScript如何实现继承?

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;JavaScript &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 继承JavaScript如何实现继承&#xff1f;原型链继承构造函数继承组合继承原型式…

纽扣电池出口欧盟ce认证EN62133测试项目

纽扣电池CE证办理&#xff0c;锂电CE证旨在提高环境性能的2006/66/EC入了电池和 蓄电池中0.0005%汞和便携式电池和蓄电池中0.002%镉的限值。自2013/56/EU 修订了2006/66/EC&#xff0c;2013/56/EU(修订2006/66/)规定&#xff0c;2015年10月1日 起&#xff0c;纽扣电池中汞的…

从零基础到条码高手:傻瓜式操作,告别excel、AI和PS的烦恼

条形码是一种用于商品识别、库存管理等方面的编码标识系统&#xff0c;它是通过将数字和字符以特定的图案排列组合起来&#xff0c;从而形成一组能被机器扫描和识别的条纹图案。 通常情况下&#xff0c;条形码的生成可以分为如下几个步骤&#xff1a; 1、编号&#xff1a;首先…

【神秘题 整数溢出】牛客小白月赛71 C-猫猫与数列

被教育了 学到了一些只有我不知道的常识 C-猫猫与数列_牛客小白月赛71(重现赛) (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 直接模拟即可 值得注意的是&#xff0c;他在算数列的过程中可能会爆long long&#xff0c;因此在算的时候注意开__int128&#xff0c;这样…

微信小程序 开发中的问题(simba_wx)

目录 一、[将 proto 文件转成 json 文件](https://blog.csdn.net/wzxzRoad/article/details/129300513)二、[使用 test.json 文件](https://blog.csdn.net/wzxzRoad/article/details/129300513)三、[微信小程序插件网址](https://ext.dcloud.net.cn/)四、[vant-weapp网址](http…

为什么停更ROS2机器人课程-2023-

机器人工匠阿杰肺腑之言&#xff1a; 我放弃了ROS2课程 真正的危机不是同行竞争&#xff0c;比如教育从业者相互竞争不会催生ChatGPT…… 技术变革的突破式发展通常是新势力带来的而非传统行业的升级改革。 2013年也就是10年前在当时主流视频网站开启分享&#xff1a; 比如 …

电脑开机后出现哭脸错误无法启动解决方法

电脑开机后出现哭脸错误无法启动解决方法。有用户安装好电脑系统之后&#xff0c;遇到了哭脸错误的情况。出现这样的错误原因有很多。如果你无法找到问题的根源的话&#xff0c;其实都是可以通过U盘重装系统的方法来解决的&#xff1f;接下来我们一起来看看以下的操作教学吧。 …

BM39-序列化二叉树

题目 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树&#xff0c;不对序列化之后的字符串进行约束&#xff0c;但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指&#xff1a;把一棵二叉树按照某种遍历方式的结…

flv怎么转换成mp4?这3种方法总有适合你的

flv怎么转换成mp4&#xff1f;首先我们得知道flv为什么转换成mp4&#xff1f;FLV和MP4都是常用的视频格式&#xff0c;其中FLV格式在以前的一些互联网应用中得到了广泛使用。但随着技术的发展和设备的普及&#xff0c;MP4格式逐渐成为了主流的视频格式。因此&#xff0c;将FLV格…

jQuery 在图片和文字中插入内容(多种情况考虑)

昨天接到一个新的需要&#xff0c;在后台文章编辑器中&#xff0c;每一个文章的正文前面&#xff0c;可以单独添加一个电头字段&#xff0c;但是如果在富文本编辑器中最上面就添加图片的话&#xff0c;图片就会把电头和正文中的文字给隔开。需要做的是获取到电头字段&#xff0…

一款纯Web化免费SQL工具,重新定义数据库管理

SQL Studio是一款由麦聪软件研发的多数据库管理工具&#xff0c;提供Windows、Linux 和 MacOS三种版本的软件包&#xff0c;支持中英文两种语言。SQL Studio是用Java编写的&#xff0c;默认使用 JDK 8进行编译。 下载看这里: [SQLStudio] (http://www.maicongs.com/#/home/web)…

shell脚本function传参的使用

这里直接上操作来说明function 的传参 新建一个脚本 vi 1.sh #!/bin/bash function check_a {echo $2echo $3echo "this is check_a" } function check_b {echo $2echo "this is check_b" } $1 #$1作为选择执行哪个function的参数 执行以下这个脚本传…

测试不够快?试试这招!让pytest多进程/多线程执行测试用例,轻松提升测试效率!

目录&#xff1a;导读 前言&#xff1a; 多进程执行用例之pytest-xdist pytest-xdist分布式测试的原理&#xff1a; pytest-xdist分布式测试的流程&#xff1a; 多线程执行用例之pytest-parallel 常用参数配置 pytest-parallel与pytest-xdist对比说明: 结语 前言&#…

vue修改当前页面query参数

最近在项目中手写分页器&#xff08;为什么手写&#xff0c;因为对分页器样式外观要求比较严苛&#xff09;&#xff0c;遇到一个需求&#xff0c;就是我们在点击分页的时候&#xff0c;再进入详情&#xff0c;之后回退希望能够回到之前的页码值。 解决这个需求&#xff0c;个…

研报精选230425

目录 【行业230425华金证券】电子行业动态分析&#xff1a;23Q1电子板块环比略微下降&#xff0c;半导体设备重仓持股显著上升 【行业230425中泰证券】电力设备与新能源行业周报&#xff1a;特斯拉一季度储能收入高增&#xff0c;宁德时代发布凝胶态电池 【行业230425长城国瑞证…