单向-->不带头-->非循环链表(简称:单链表)

news2024/11/24 16:09:19

目录

一、链表的介绍

1.链表的概念

2.单链表的节点类型

3.单链表简图

二、单链表的增删查改

1.单链表的头插

2.单链表的尾插

3.单链表的头删

4.单链表的尾删

5.单链表pos位置之后插入一个节点

6.单链表删除pos位置后的一个节点

一、链表的介绍

1.链表的概念

        链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针链接次序实现的。(可以和数组进行比较理解,数组中的相邻元素在内存心中的地址是连续的,不需要额外的指针)

2.单链表的节点类型

        链表的节点一般是一个结构体类型的变量,结构体成员包括一个有效数据value和一个指向下一个节点的结构体类型指针next(如果是双向链表,还会有一个指向上一个节点的结构体类型指针prev)。代码如下:

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

下文均使用typedef  struct SListNode  SListNode

3.单链表简图

单链表的最后一个节点已经不需要指向下一个节点的指针,所以next=NULL ,最后一个节点指向空指针是单链表的结束方式。

二、单链表的增删查改

1.单链表的头插

简图:

        注:pList存储的是链表头节点的地址

代码实现:

// 单链表头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
	if (NewNode == NULL)
	{
		perror("malloc:");
		return NULL;
	}
	NewNode->data = x;
	NewNode->next = *pplist;
	*pplist = NewNode;
}

2.单链表的尾插

简图:

 

代码实现:

// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{
	assert(pplist);
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
	if (NewNode == NULL)
	{
		perror("malloc:");
		return;
	}
	NewNode->data = x;
	NewNode->next = NULL;
	if (*pplist == NULL)
	{
		*pplist = NewNode;
	}
	else
	{
		SListNode* cur = *pplist;
		while (cur->next)
		{
			cur = cur->next;
		}
		cur->next = NewNode;
	}
}

3.单链表的头删

简图:

代码实现:

// 单链表头删
void SListPopFront(SListNode** pplist)
{
	if (*pplist == NULL)
	{
		return;
	}
	else if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		SListNode* tmp = *pplist;
		*pplist = (*pplist)->next;
		free(tmp);
		tmp = NULL;
	}
}

4.单链表的尾删

简图:

 

代码实现:

// 单链表的尾删
void SListPopBack(SListNode** pplist)
{
	assert(pplist);
	if (*pplist == NULL)
	{
		return;
	}
	else if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		SListNode* prev = *pplist;
		SListNode* cur = prev->next;
		while (cur->next)
		{
			cur = cur->next;
			prev = prev->data;
		}
		prev->next = NULL;
		free(cur);
		cur = NULL;
	}
}

5.单链表pos位置之后插入一个节点

简图:

 

代码实现:

// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
	if (NewNode == NULL)
	{
		perror("malloc:");
		return;
	}
	NewNode->data = x;
	if (pos == NULL)
	{
		NewNode->next = NULL;
		pos = NewNode;
	}
	else if (pos->next == NULL)
	{
		NewNode->next = NULL;
		pos->next = NewNode;
	}
	else
	{
		NewNode->next = pos->next;
		pos->next = NewNode;
	}
}

6.单链表删除pos位置后的一个节点

简图:

 

代码实现:

// 单链表删除pos位置之后的节点
void SListEraseAfter(SListNode* pos)
{
	assert(pos);
	assert(pos->next);
	SListNode* next = pos->next;
	pos->next = next->next;
	free(next);
	next = NULL;
}

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

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

相关文章

如何搬运订单(1688)

目录 下载安装与运行 任务描述 搬运具体要求(示例) 订单导出操作过程 搜索指定范围的订单 选择要导出的订单数据 完整的导出动画演示 切换到另一个账号 B账号批量下单的要求 下单步骤 下单设置 为啥选加采购车而不是立即下单 为啥要选自动情…

Java-方法

在编程中,我们也可以将频繁使用的代码封装成"帖子"(方法),需要时直接拿来链接 方法就是一个代码片段. 类似于 C 语言中的 “函数” 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 …]){ 方法体代码; [return 返回值]; } 这里比得C语言…

关于视频人工智能/机器视觉创业商业模式的一些思考

今年开始了我的第二次创业,第一次创业大家看我以前的博客就知道了,做音视频流媒体相关技术的,现在公司也已经是安徽省专精特新中小企业了,还好是“中小企业”,如果直接是专精特新企业,我就可以不用来视频人…

地理测绘基础知识(2)-椭球最短距离计算

在上一篇中,我们介绍了ECEF坐标系和经纬度的互换。 本篇,主要介绍已知A\B两个点的经纬度,如何求取椭球上的最短距离、路径。 在标准椭球面上,从A点运动到B点,距离如何,轨迹、每个阶段的方向又是如何呢&am…

consul安装启动流程

普通软件包安装 首先cd /opt ,将安装包放到该目录下 下载consul安装包 进入consul官网找到自己开发平台对应的安装包下载 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

【K8S系列】深入解析k8s网络插件—Weave Net

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 Kubernetes (k8s) 是一个容器编…

MySQL数据库练习

目录 表结构 建表 插入数据 1、用SQL语句创建学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在系的默认值是 “计算机”。 2、修改student 表中年龄(age)字段属性,数据类型由…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助 方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql> set pass…

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP,是一种常用的服务器架构。它由以下组件组成: Linux:作…

【2023新教程】树莓派4B开机启动-树莓派第一次启动-树莓派不使用显示器启动-树莓派从购买到启动一步一步完全版!

背景 闲来无事,在咸鱼上买了一个树莓派4B。买来配件都十分齐全,于是就想着启动来测试一下。下面是树莓派无显示器第一次启动的全过程,包含安装系统。 网上的教程大多需要额外使用显示器、鼠标、键盘之类的外设。然而,树莓派本身就…

阿里云服务器是什么?阿里云服务器有什么优缺点?

阿里云服务器是什么?云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,云服务器可以降低IT成本提升运维效率,免去企业或个人前期采购IT硬件的成本,阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器…

[数据集][目标检测]骑电动车摩托车不戴头盔数据集VOC格式1385张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1385 标注数量(xml文件个数):1385 标注类别数:2 标注类别名称:["y","n&q…

工业物联网数据桥接教程:Modbus 桥接到 MQTT

Modbus 介绍 Modbus 是一种串行通信协议,用于连接工业自动化设备,最初由 Modicon 公司开发,诞生于 1979 年,现在已成为通用的通讯标准之一,广泛用于工业自动化场景。 Modbus 采用主从模式,支持多种传输方…

jacoco功能测试-代码覆盖率

1、下载 jacoco 官网地址:EclEmma - JaCoCo Java Code Coverage Library 2、拷贝 jar 包 下载好后,找到这两个文件,然后找到被测项目 3、启动 jacocoagent,监控被测项目 java -javaagent:jacocoagent.jarincludes*,outputtcp…

BGP总结

前言 我们从动态路由协议的应用范围可以分为IGP(内部网关协议)和EGP(外部网关协议)。 IGP协议追求: 无环(选路佳)收敛快占用资源少 EGP协议的追求 可控性强(管理员可以方便进行…

Rx.NET in Action 第二章学习笔记

Part 1 初入反应式扩展 2 Hello, Rx 本章节涵盖的内容: 不使用Rx的工作方式向项目中添加Rx创建你的第一个Rx应用程序 Rx 的目标是协调和统筹来自社交网络、传感器、用户界面事件等不同来源的基于事件的异步计算。例如,建筑物周围的监控摄像头和移动传感器会在有人靠…

激活函数总结(三):激活函数补充

激活函数总结(三):激活函数补充 1 引言2 激活函数2.1 Softmax激活函数2.2 Softplus激活函数2.3 Mish激活函数2.4 Maxout激活函数 3. 总结 1 引言 在前面的文章中已经介绍了过去大家较为常见的激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PR…

42 | 航空公司客户价值分析

民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价格、服务间的竞争逐渐转向对客户的竞争。 目前航空公司已积累了大量的会员档案信息和其乘坐航班…

vscode debug python 带参数

两种方法 第一种: 1,侧边栏选择运行和调试 2,请先创建一个launch.json文件 3,并选择配置文件为python文件 此时你的工作目录下会多一个目录.vscode和该目录下一个launch.json文件,该文件则配置了你的debug配置。在…

JZ40最小的K个数

题目地址:最小的K个数_牛客题霸_牛客网 题目回顾: 解题思路: 注意本题不需要去重。 最简单的方法:排序后数组顺序是由小到大的,也就是说此时数组前k个数就是我们要求的结果。 整体代码: public ArrayLi…