数据结构---顺序表之单链表

news2024/9/25 1:51:23

1.链表的概念

链表是一种逻辑上是线性的,但物理结构不一定是线性的数据结构,它通过链表中的指针链接次序实现的

链表的存储空间是我们通过动态内存开辟的内存空间,所以他们的地址可能是连续的也可能不是连续的

2.链表的分类

1.单向或者双向

2.带头或者不带头

3.循环或者不循环

虽然链表有这么多种类,单我们常用的就只有两种:

                                               单向不带头不循环链表(单链表)

                                                   双向带头循环链表(双链表)

3.单链表的实现

SList.h

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{
 SLTDateType data;
 struct SListNode* next;
}SListNode;
// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

SList.c

//为什么这里要用二级指针?
//因为我们的头结点是一个结构体指针,我们可能会改变头结点,所以我们需要传结构体地址的地址


// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x) {
	SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));
	if (NewNode == NULL) {
		return 0;
	}
	NewNode->next = NULL;
	NewNode->data = x;
	return NewNode;
}
// 单链表打印
void SListPrint(SListNode* plist) {
	
	SListNode* pcur = plist;
	while (pcur) {
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL\n");
}
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x) {
	assert(pplist);
	SListNode* NewNode = BuySListNode(x);
	//如果链表为NULL,头结点就是NewNode
	if (*pplist == NULL) {
		*pplist = NewNode;
		return;
	}
	//链表不为NULL,找到尾节点插入
	SListNode* pcur = *pplist;
	while (pcur->next) {
		pcur = pcur->next;
	}
	pcur->next = NewNode;
}
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x) {
	assert(pplist);
	SListNode* NewNode = BuySListNode(x);
	SListNode* pcur = *pplist;
	NewNode->next = pcur;
	*pplist = NewNode;
}
// 单链表的尾删
void SListPopBack(SListNode** pplist) {
	assert(pplist);
	//链表为NULL不能执行删除
	assert(*pplist);
	//如果链表只有1个节点
	if ((*pplist)->next == NULL) {
		free(*pplist);
		*pplist = NULL;
		return;
	}
	SListNode* pcur = *pplist;
	SListNode* prev = NULL;
	while (pcur->next) {
		prev = pcur;
		pcur = pcur->next;
	}
	prev->next = pcur->next;
	free(pcur);
	pcur = NULL;
}
// 单链表头删
void SListPopFront(SListNode** pplist) {
	assert(pplist);
	assert(*pplist);
	SListNode* pcur = *pplist;
	*pplist = pcur->next;
	free(pcur);
	pcur = NULL;

}
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x) {
	assert(plist);
	SListNode* pcur = plist;
	while (pcur) {
		if (pcur->data == x) {
			return pcur;
		}
		pcur = pcur->next;
	}
	//未找到返回NULL
	return NULL;
}
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
//因为单链表的节点只能找后继结点,不能找前驱
void SListInsertAfter(SListNode* pos, SLTDateType x) {
	assert(pos);
	SListNode* NewNode = BuySListNode(x);
	NewNode->next = pos->next;
	pos->next = NewNode;
}
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
// 如果链表存在多个节点,pos节点之前的节点就会丢失,造成内存泄露
void SListEraseAfter(SListNode* pos) {
	assert(pos);
	assert(pos->next);
	SListNode* DeleNode = pos->next;
	pos->next = DeleNode->next;
	free(DeleNode);
	DeleNode = NULL;
}

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

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

相关文章

PostgreSQL JAVA与SQL集成之PL/Java

PostgreSQL pljava PL/Java 作为 PostgreSQL 的编程语言扩展之一,与 PL/pgSQL(PostgreSQL 原生的存储过程语言)相比,提供了 Java 语言特有的面向对象功能,并支持 Java 的标准库和第三方库。由于 Java 是一种跨平台的语…

Python 聊聊有内置函数,又该怎么学习内置函数

前言 python有内置函数的概念,从Python3.x开始,内置函数位于builtins模块,比如我们常用的内置函数len(),其实它是builtins模块下的属性,我们也可以builtins.len()去访问,当然因为每个…

海豚调度运行成功但无法生成实例解决

海豚调度运行成功但无法生成实例解决 问题描述 点击运行,提示运行成功但无法在工作实例中看到 问题定位 查看资源监控,内存占用80% 查看master日志 tail -f /home/dolphinscheduler/tmp/dolphinscheduler/master-server/logs/dolphinscheduler-m…

无刷直流电机内阻小和大有什么区别

‌直流电机的内阻小和大各有其特点和应用场景。 ‌ 内阻小的直流电机通常具有较小的线圈匝数,这意味着在工作时消耗的电流较大,从而在同一转速下能够提供较大的扭矩。这种电机适用于需要较大扭矩的应用场景,例如重载启动或需要较高机械效率的…

模型django封装uvicorn服务器部署实战

Uvicorn 是一个轻量级的 ASGI 服务器,它基于 uvloop 和 httptools 这两个高性能的异步库。Uvicorn 提供了快速的启动时间和低延迟的响应,非常适合用于生产环境。 Django: 是一个开源且强大的Web框架,适用于快速开发和部署Python …

Spring中存储Bean的常见注解

目录 IoC & DI IOC(控制反转)详解 依赖注入的三种方式 IoC & DI IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器. 控制反转:也就是控制权反转. 什么的控制权发⽣了反转? 获得依赖对…

成为谷歌开发者专家(GDE)的经历

大家好,我是张海龙(Jason)。经过一年多的准备,GDE申请 终于正式成功通过面试,成为了国内第一位Firebase GDE。下面对整个过程做个总结,希望对大家有所帮助。 1.什么是 GDE? Google Developers上面有详细的说明&#x…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反…

DataWhale X 南瓜书学习笔记 task03笔记

对数几率回归 使用场景:分类任务。根据广义线性模型,分类任务构建模型的基本思想:找到一个单调可微函数将分类任务的真实标记(值)与线性回归模型的预测值联系起来。 对数几率回归的引入 二分类任务 输出标记&#…

从角速度向量的角度理解姿态角速度和机体角速度的转换公式

一、什么是姿态角速度 这是我从《多旋翼飞行器设计和控制》上截取的关于欧拉角的定义。无人机的姿态角速度即偏航角、俯仰角、滚转角的一次导数,分别是、、。 二、什么是机体角速度 这是我在网上随便找的图,展示了机体坐标系。这个坐标系与飞机固定连接&…

技术美术百人计划 | 《5.1.2 PBR-基于物理的相机》笔记

一、曝光三角形 1、曝光主要由三个参数控制 快门速度(Shutter Speed) 可以获得运动模糊(Motion) 光圈(Aperture) 可以获得景深(Depth of Field) 感光度(ISO&#xff0…

vue3 通过 axios + jsonp 实现根据公网 ip, 查询天气信息

前提 安装 axios 的 jsonp 适配器。 pnpm install pingtou/axios-jsonp 简单使用说明:当与后端约定的请求 callback 参数名称不为为 callback 时,可修改。一般无需添加。 1. 获取当前电脑 ip 和城市信息 请求地址: https://whois.pconl…

全能的Office插件——不坑盒子 2024.0923发布,云同步配置、合并单元格复制、PPT样机展示……

昨天凌晨,不坑盒子上线了2024.0923版本,这次更新的功能比较多,亮点较多,有必要发文推荐给大家! 向新人介绍 不坑盒子是一款全能的Office插件,支持微软Office和WPS Office的办公三件套(Word、E…

构建高效企业客户管理系统:SpringBoot应用

1 绪论 1.1研究背景 随着网络不断的普及发展,企业客户管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

2024 天池云原生编程挑战赛决赛名单出炉,冠军来自中山大学、昆仑数智战队

9 月 20 日,2024 天池云原生编程挑战赛决赛答辩完美落幕,12 支进入决赛的团队用精彩的答辩,为历时 3 个月的大赛画下了圆满的句号。其中,来自中山大学的陈泓仰以及来自昆仑数智的冉旭欣、沈鑫糠、武鹏鹏, 以出色的方案…

【运维类】信息系统运维方案(Word原件原版参考)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览,而且支持用户USB接口连接,同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项,能够帮助摄影师优化相机的性能&…

问请问请问2312123213123

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

多快好省,高质量、低成本通过 CISSP 认证

CISSP 作为安全从业人员含金量最高的认证,一直以来被认为是难度较高、学习成本较大、知识点大而全的考试。这里面也有一部分因素是因为考试费用较高,需要 749$,如果不是公司能够报销通过考试以后的费用,我也不会贸然尝试。相比于国…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术,并非多大范围的网络 网关 为局域网内的用户提供了一扇门,通过网关可以访问到别的网络。这个门,就叫网关 以…