【数据结构】单链表 | 详细讲解
线性表顺序存储结构的优缺点
顺序表优点
- 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间;
- 因为以数组形式存储,可以快速地存取表中任一位置的元素。
顺序表缺点
- 插入和删除操作需要移动大量元素,时间复杂度为O(N);
- 当线性表长度变化较大时,难以确定存储空间的容量;
- 造成存储空间的“碎片”。
顺序存储结构不足的解决办法
其实顺序表最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费极大时间,因为相邻两元素的存储位置也具有邻居关系。它们编号是1,2,3,...,n,它们在内存中的位置也是挨着的,中间没有空隙,当然就无法快速介入,而删除后,当中就会留出空隙,自然需要弥补。
那这样的话,我们反正都要让相邻的元素都留有足够余地,那么干脆所有的元素都不考虑相邻位置了,哪里有空位就到哪里,而只是让每个元素知道他下一个元素的位置在哪里,这样我们就可以在第一个元素时,就知道第二个元素的位置(内存地址),而找到它;在第二个元素时,就知道第三个元素的位置(内存地址),而找到它。这样所有的元素我们就都可以通过遍历而找到了。
其实这个思路也就是链表存储思路,而本篇文章着重讲述链表中的单链表。
线性表链式存储结构定义
在链式结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址。
数据域:存储数据元素信息的域称为数据域;
指针域:存储直接后继位置的域称为指针域。
在指针域中存储的信息称为指针或链。数据域与指针域信息组成数据元素的存储映像,称为结点。
单链表:n个结点链结成的链表,此链表中的每个结点中只包含一个指针域。

单链表的代码实现以及分析
单链表的结构代码
单链表中的结点,是由存放数据元素的数据域和存放后继结点地址的指针域组成的。所以,假设这个数据为val,存放后继结点地址的指针为next。
typedef int SLNDataType;
typedef struct SListNode
{struct SListNode* next;SLNDataType val;
}SLNode;
单链表中的每一个节点都是一个结构体成员,也就是多个结构体构成了一条链表。这与顺序表不同,顺序表由于数组存储 ,所以就是一个结构体的数组中存储了多个节点。
单链表的遍历打印

void SLTPrint(SLNode* phead)
{assert(phead);SLNode* cur = phead;while (cur != NULL){printf("%d->", cur->val);cur = cur->next;}printf("NULL\n");
}
单链表建立新的头结点
在创建新的头结点时,需要用到malloc函数,关于malloc的使用方法,这里不做过多阐述,大家有什么不懂的,可以点击链接(单击即可查看)详细学习malloc的使用方法哦。
C库函数中 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
malloc是分配内存空间的函数。
SLNode* SLTCreateNode(SLNDataType x)
{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));if (newnode == NULL){perror("malloc fail\n");exit(-1);}newnode->next = NULL;newnode->val = x;return newnode;
}
单链表的尾插

那如果这是一个空表的话,那么就直接让这个单链表为指针,指向新创建的节点。
void SLTPushBack(SLNode** pphead, SLNDataType x)
{assert(pphead);SLNode* Newnode = SLTCreateNode(x);if (*pphead == NULL){*pphead = Newnode;}else{SLNode* tail = pphead;while (tail->next != NULL){tail = tail->next;}tail->next = Newnode;}
}
单链表的头插
void SLTPushFront(SLNode** pphead, SLNDataType x)
{assert(pphead);SLNode* Newnode = SLTCreateNode(x);Newnode->next = *pphead;*pphead = Newnode;
}
单链表的尾删

void SLTPopBack(SLNode** pphead)
{assert(pphead);assert(*pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLNode* tail = *pphead;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;}
}
单链表的头删
void SLTPopFront(SLNode** pphead)
{assert(pphead);assert(*pphead);SLNode* cur = (*pphead)->next;//注意在单链表头删的时候,如果只有一个节点,那也是可以的,就让那个临时的为空free(*pphead);*pphead = cur;
}
单链表的查找x数据
SLNode* SLTFind(SLNode* phead, SLNDataType x)
{SLNode* cur = phead;while (cur){if (cur->val == x){return cur;}else{cur = cur->next;}}return NULL;
}
单链表在pos位置插入x的数

SLNode* SLTInsert(SLNode** pphead, SLNode* pos, SLNDataType x)
{assert(*pphead);assert(pphead);assert(pos);if (*pphead==pos){SLTPushFront(pphead,x);}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}SLNode* Newnode = SLTCreateNode(x);prev->next = Newnode;Newnode->next = pos;}
}
单链表删除pos位置上的值
void SLTErase(SLNode** pphead, SLNode* pos)
{assert(*pphead);assert(pphead);assert(pos);if (pos == *pphead){SLTPopFront(pphead);}else{SLNode* prev = *pphead;while (prev->next!=pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}
单链表的销毁
void SLTDestroy(SLNode** pphead)
{assert(pphead);SLNode* cur = *pphead;while (cur){SLNode* tmp = cur->next;free(cur);cur = tmp;}*pphead = NULL;
}
相关文章:
【数据结构】单链表 | 详细讲解
线性表顺序存储结构的优缺点 顺序表优点 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间;因为以数组形式存储,可以快速地存取表中任一位置的元素。 顺序表缺点 插入和删除操作需要移动大量元素,时间复杂度为O(N);…...
每日一题:编写程序,使程序分别输出两个整数的加减乘除运算结果
文章目录 每日一题一、编写程序,使程序分别输出两个整数的加减乘除运算结果以下是一个使用 Java 编写的程序,可以输出两个整数的加减乘除运算结果:以下是一个简单的 Python 程序,可以计算两个整数的加减乘除运算结果: …...
alpine linux如何指定软件包安装源
永久修改apk下载源 vi etc/apk/repositories替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/ http://mirrors.aliyun.com/alpine/v3.8/community/更新源 apk update临时修改下载源 直接在软件安装后面 添加源地址 apk add php5.6 --repository http://nl.alpine…...
ubuntu设置脚本开机自启动
rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…...
cobol-简介
cobol学习笔记 cobol概述 COBOL是一门高级语言。我们必须了解COBOL的工作方式。计算机只能理解机器代码,0和1的二进制流。 COBOL代码必须使用编译器转换成机器代码。通过编译器运行程序源码。编译器首先检查是否有任何语法错误,然后将其转换为机器语言。…...
使用 JMeter 分布式性能测试
作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也可以像 Loa…...
【工具流】WSL2安装
一些废话 最近看到了PKU出品的cs自学指南,想要跟着里面的自学路径学国外的优质课程,无奈大多数pre教程里面都是直接Linux环境下的操作,并且我在CSwiki看到了那个熟悉的上学期学了一点的missing-semester课。 上学期自学missing-semester的时候…...
OpenGL获取GPU信息
glGetString 获取厂家信息 const GLubyte* info glGetString(GL_VENDOR); printf("GL_VENDOR:%s\n", info);info glGetString(GL_VERSION); printf("GL_VERSION:%s\n", info);info glGetString(GL_RENDERER); printf("GL_RENDER:%s\n", inf…...
毫米波雷达模块的目标检测与跟踪
毫米波雷达技术在目标检测与跟踪方面具有独特的优势,其高精度、不受光照影响等特点使其在汽车、军事、工业等领域广泛应用。本文深入探讨毫米波雷达模块在目标检测与跟踪方面的研究现状、关键技术以及未来发展方向。 随着科技的不断进步,毫米波雷达技术在…...
Linux 下 使用 Ekho 进行TTS文本转语音
官网 http://www.eguidedog.net/cn/index.phpEkho(余音)是一个免费、开源的中文语音合成软件。支持普通话、粤语。支持Linux、Windows和Android平台。 资源:https://download.csdn.net/download/weixin_44618297/88529881 参考:…...
WiFi protocol 详解
这里推荐两个 知乎上的 专题 讲的不错 802.11协议细读 - 知乎 Wi-Fi研习者 - 知乎...
llm模拟基本逻辑门
llm模拟基本逻辑门 全部代码代码解析全部代码 import paddle import numpy as np from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):def __init__(self, hidden_dim)...
Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题,我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是…...
CSDN每日一题学习训练——Python版(输入起始和结束的正整数,求其两个正整数之间的偶数和、两数相加)
版本说明 当前版本号[20231115]。 版本修改说明20231115初版 目录 文章目录 版本说明目录输入起始和结束的正整数,求其两个正整数之间的偶数和。题目解题思路代码思路参考代码 两数相加题目解题思路代码思路参考代码 输入起始和结束的正整数,求其两个…...
【论文】基于Hadoop的铁路货运大数据平台设计与应用
点我完整下载:基于Hadoop的铁路货运大数据平台设计与应用.docx 基于Hadoop的铁路货运大数据平台设计与应用 Design and Application of Railway Freight Big Data Platform based on Hadoop 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的…...
GoF之代理模式
2023.11.12 代理模式是GoF23种设计模式之一,其作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以…...
post 和get参数 请求
json参数 post请求格式 RestController public class HelloController { //json参数 post 请求RequestMapping("/jsonParam")public String jsonParam(RequestBody User user){System.out.println(user);return "OK";} } postman 接口测试工具…...
RabbitMQ多线程配置和异常解决办法
(1)RabbitMQ多线程配置 RabbitMqConfig.java Bean("customContainerFactory") public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory conn…...
【原创】java+swing+mysql车辆维修管理系统设计与实现
摘要: 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统,它能够提高效率,减少错误,并提供详细的车辆历史记录,可以帮助车辆维修企业实现信息化管理,提高工作效率和客户满意度,降低运营…...
无法在 DLL“SQLite.Interop.dll”中找到名为”sIb4c632894b76cc1d“
做项目,碰到这个问题,网上的解决办法都是 更换sqlite版本去解决 在我这里不适用 我这里的项目是一个主项目 下面挂载了很多其子项目 解决办法是 把子项目 和 主项目 更换为统一的sqlite版本 , 如果统一更换后还不可以 就把主项目下生成的 (一定要确保主项目下的sqlite版本一定是…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
