一文了解单链表

news2024/11/23 13:06:11

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、单链表是什么?
  • 二、单链表功能函数实现
    • 1.申请节点
    • 2.尾插
    • 3.头插
    • 4.尾删
    • 5.头删
    • 6.查找
    • 7.在指定位置前插入数据
    • 8.在指定位置后插入数据
    • 9.删除指定位置的数据
    • 10.链表的销毁
  • 三.头文件
  • 总结


在这里插入图片描述

前言

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。今天我们就先来学习一下链表中比较基础的单链表。


一、单链表是什么?

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
以“结点的序列”表示线性表称作线性链表(单链表),单链表是链式存取的结构。
其大致状态如图
在这里插入图片描述
通过一个结点的内的指针指向下一个节点,串联其整个链表。
物理结构:不连续
逻辑结构;连续
如下是一个节点的定义,也是下文代码实现中的节点定义

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;

二、单链表功能函数实现

1.申请节点

代码如下(示例):

SLTNode* SLTBuyNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

在一个节点中需要两个数据,一个是数值,一个是下一节点的地址。所以我们申请新节点时就传入该节点中的数值(参数),之后使用malloc申请空间并判断是否成功,将data赋值,next指针暂为空,最后返回节点地址。

2.尾插

代码如下(示例):

void SLTPushBack(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

逻辑如图
在这里插入图片描述
我们想在末尾添加节点首先要找到尾节点,如果该链表为空,可以直接把新节点当头节点,如果不为空,则需要遍历链表找到next指针为NULL的节点,将next指针指向新节点即可。

3.头插

代码如下

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

头插相对简单,首先申请新节点,再将新节点的next指针指向原来的头节点,最后把新节点作为头节点即可。

4.尾删

代码如下

void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && *pphead);
	//只有一个节点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLTNode* prev = *pphead;
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

在这里插入图片描述
尾删逻辑上就是找到为节点,将其释放掉,并将前一节点next指针置NULL。因为尾删时我们需要处理尾节点和它前一个节点,但单链表不能往回走,所以我们这里定义两个节点,ptail指针比prev指针快一个节点,这样当ptail指向尾节点时,prev指针刚好指向前一个结点。之后,先free尾节点,再把前一个节点next指针置空。
注意:应在开始时先判断链表不为空。

5.头删

代码如下

void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

头删就比较容易,只要把头节点指向第二个节点,再释放头节点即可,但还是要注意传入地址有效且链表不为空。

6.查找

代码如下

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{
	assert(phead);
	SLTNode* pcur = phead;
	while (pcur)
	{
		if (pcur->data == x)
		{
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

查找实际上就是遍历一遍链表并且进行比较,找到则返回地址,找不到则返回NULL。

7.在指定位置前插入数据

代码如下

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead && *pphead);
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	if (pos = *pphead)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		newnode->next = pos;
		prev->next = newnode;
	}
}

整体逻辑如图
在这里插入图片描述
首先找到正确的位置,之后更改新节点的next指针和前一个节点的next指针。具体操作是,先判断是否为空链表,是则直接插入节点即可。不是则继续遍历寻找pos节点。注意这里当prev的next指针是pos即可,这样prev就停在前一个节点上,最后更改新节点和prev的next指针即可。

8.在指定位置后插入数据

代码如下

void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

这个由上面前插的讲解,这里相信大家可以自行看代码解决,就不再赘述。

9.删除指定位置的数据

代码如下

void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

逻辑如图
在这里插入图片描述
删除指定位置节点就是把pos前一个节点的next指针指向pos后一个指针,并free。首先,先定义prev指针进行遍历,当其next指向pos则停止,让prev的next指针指向pos的next指针,free掉pos节点即可。

10.链表的销毁

代码如下

void SListDesTroy(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* pcur = *pphead;
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}

	pphead = NULL;
}

链表的销毁需要一个一个的进行释放,定义一个pcur指针,并定义一个next指针存储pcur的next指针,将pcur释放,再将pcur指向next依次向下循环直至全部释放。

三.头文件

整体头文件如下

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;
}SLTNode;

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);
//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);
//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在指定位置前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//在指定位置后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);
//删除指定位置数据
void SLTEraseAfter(SLTNode* pos);
//销毁链表
void SListDesTroy(SLTNode** pphead);


总结

以上就是作者对单链表的一些理解和介绍,希望看到这篇文章的朋友们可以积极评价,还请一件三连。
在这里插入图片描述

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

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

相关文章

中国移动举办算力网络未来产业暨联合体创新论坛

4月29日&#xff0c;在国务院国有资产监督管理委员会的指导下&#xff0c;由中国移动主办的算力网络未来产业暨联合体创新论坛在苏州举办。大会以“算网一体&#xff0c;智领未来”为主题&#xff0c;旨在汇聚算力网络产学研各界领军力量&#xff0c;共创算力网络技术策源之路&…

大规模SLAM技术

书籍&#xff1a;Large-Scale Simultaneous Localization and Mapping 作者&#xff1a;Janusz Bğdkowski 出版&#xff1a;Springer 书籍推荐-《大规模SLAM技术》书籍&#xff1a;Large-Scale Simultaneous Localization and Mapping作者https://mp.weixin.qq.com/s/XopFq…

私域卖酒_私域卖酒怎么做

坐标&#xff1a;厦门&#xff0c;我是易创客运营肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 链动21模式为酒业企业带来了革命性的变革&#xff0c;通过与消费者建立紧密联系&#xff0c;实现了个性化定制的精…

mysql基础知识汇总

本文自行整理&#xff0c;只做学习记忆之用&#xff0c;若有不当之处请指出 一、数据库三层结构 &#xff08;1&#xff09;所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system) &#xf…

数据结构八:线性表之循环队列的设计

上篇博客&#xff0c;学习了栈&#xff0c;我们可以知道他也是一种线性表&#xff0c;遵从先进后出的原则&#xff0c;在本节&#xff0c;我们进一步学习另一种线性表—队列。就像饭堂里排队打饭的的队伍&#xff0c;作为一种先进先出的线性表&#xff0c;他又有哪些特别之处呢…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名&#xff1f; 2、为什么使用域名&#xff1f; 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存&#xff1f; 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

2024年度四川省重点实验室资助申报范围重点、时间方式

一、申报范围 &#xff08;一&#xff09;本项目面向文化和旅游部重点实验室开展申报。 &#xff08;二&#xff09;申报项目应围绕实验室研究方向&#xff0c;解决行业重要共性关键技术或基础研究问题&#xff0c;着力提升实验室科技支撑能力和人才培养能力。支持重点包括&a…

手机运营商二要素验证接口:确保业务操作安全可靠

手机运营商二要素验证接口是一种通过与电信运营商合作的方式&#xff0c;检验手机用户的手机号码与姓名是否一致的服务。这个接口可以广泛应用于各种需要用户实名认证的场景&#xff0c;例如电商、游戏、直播以及金融等行业。 这个接口的作用非常重要&#xff0c;它可以帮助企…

请求接口报错:java.lang.IllegalStateException: argument type mismatch

目录 一、场景二、报错信息三、控制器四、接口调用五、原因六、解决 一、场景 1、调用后端接口报错 2、接口参数以Json方式传递 – 二、报错信息 java.lang.IllegalStateException: argument type mismatch Controller [com.xxx.huarunshouzheng.controller.MallControlle…

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

【Redis 开发】Redis分片集群

分片集群 分片集群搭建分片集群 散列插槽集群伸缩故障转移RedisTemplate访问分片集群 分片集群 在我们使用哨兵进行高并发读的问题&#xff0c;但是还有海量数据存储,高并发写的问题,使用分片集群可以解决&#xff1a; 特征&#xff1a; 集群中有多个master&#xff0c;每个m…

干细胞样本保存对液氮罐有使用温度要求吗

温度是确保生物样本质量的核心要素&#xff0c;对使用容器的温度控制就成了样本保存项目的观察重点。在生物实验研究和干细胞技术的实际应用情景中&#xff0c;液氮罐内部温度对维持干细胞样本的活性与稳定性起到了决定性作用。 为了确保干细胞样本在长期的保存中仍保持较优的…

VUE+TS使用elementUI的el-checkbox双重v-for循环做勾选

html部分 <template><div class"hello"><el-form :model"elForm"> <!-- cities对象数组形式 --><el-form-item v-for"(item, topIndex) in cities" :key"topIndex"> <!--item.checked 是每一个item…

web题目实操(6)ssti模板注入学习

1.BUUCTF之[MRCTF2020]你传你呢-------文件解析漏洞 &#xff08;1&#xff09;打开环境后就看到一个很特别的文件上传的界面&#xff0c;以为是一题简单的文件上传漏洞&#xff0c;实不然后面做了才发现并非那样&#xff08;2&#xff09;这里本来应该是先上传php文件&#x…

神之浩劫2测试资格100%获取教程 测试资格获取方法教程

《神之浩劫》是一款基于Unreal 3&#xff08;虚幻3&#xff09;游戏引擎开发的3D团队竞技游戏&#xff0c;由美国Hi-Rez工作室开发、腾讯全球代理。2013年10月31日&#xff0c;游戏开启国服首测&#xff0c;并于2014年3月25日在美国公测。2018年1月20日&#xff0c;国服并入全球…

某科聚网一体化运营平台 catchByUrl 文件上传致RCE漏洞复现

0x01 产品简介 某科聚网一体化运营平台是一种综合性的软件平台&#xff0c;旨在帮助企业实现运营管理的集中化、自动化和协同化。该平台通常提供一系列功能模块和工具&#xff0c;用于支持企业在销售、营销、客户关系管理、供应链管理、人力资源管理等方面的运营活动。 0x02 …

25计算机考研院校数据分析 | 电子科技大学

电子科技大学&#xff08;University of Electronic Science and Technology of China&#xff09;坐落于四川省会成都市&#xff0c;直属中华人民共和国教育部&#xff0c;由教育部、工业和信息化部、四川省和成都市共建。是国家“985工程”、“211工程”、“世界一流大学和一…

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…

OMG 一个方法的调用改动居然优化了一倍性能!!! ConcurrentHashMap.computeIfAbsent 学习

背景 前提&#xff1a;抖音小程序有qps的监控&#xff0c;如果说qps过低就会导致小程序被下架掉。 业务代码非常的简单 一个easy的查询 但是当并非达到 20就 会发现qps降低了10倍 业务需求实现大概这么一个链路 ok 那么此前我们在认识一下 computeIfAbsent 方法&#xff08;大…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中&#xff0c;接收方多数都要求英文面试。如果导师的母语为非英语国家&#xff0c;将会带有口音&#xff0c;这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度&#xff0c;使自己的英语表达更加流利&#xff0c;知识人网小…