【数据结构与算法】单链表
单链表详解从概念到实现文章目录单链表详解从概念到实现1. 单链表的基本概念2. 单链表的结点结构3.单链表的一系列用法3.1链表的打印及初始化3.2 尾插3.3头插3.4 尾删3.5 头删3.6查找3.7在指定位置之前插入数据3.8 在指定位置之后插入结点3.9 删除pos结点3.10 删除pos之后的结点3.11 销毁链表4. 顺序表与链表的比较1. 单链表的基本概念单链表也是一种线性表。逻辑结构线性的 / 物理结构非线性的概念链表是一种物理存储结构上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。2. 单链表的结点结构链表是由结点组成的结点由两个部分组成存储的数据指针存储下一个结点的地址一个一个的结点就相当于一节一节的车厢3.单链表的一系列用法3.1链表的打印及初始化//链表的打印voidSLTPrint(SLTNode*phead){SLTNode*pcurphead;while(pcur){printf(%d - ,pcur-data);pcurpcur-next;}printf(NULL\n);}SLTNode*SLTBuyNode(SLTDataType x){//根据x创建新结点SLTNode*newnode(SLTNode*)malloc(sizeof(SLTNode));if(newnodeNULL){perror(malloc fail!);exit(1);}newnode-datax;newnode-nextNULL;returnnewnode;}放入测试函数测试一下创建出一个新链表这里要说一下传值和传址只要看不到这个操作符就是传值传值形参是实参的值的拷贝传址形参的改变要影响实参SLTPrint(plist)中没有用取地址操作符plist就是一个结构体指针在这里就是传值调用3.2 尾插一是链表不为空二是链表为空voidSLTPushBack(SLTNode**pphead,SLTDataType x){SLTNode*newnodeSLTBuyNode(x);//链表为空if(*ppheadNULL){*ppheadnewnode;}else{//找尾结点SLTNode*ptail*pphead;while(ptail-next){ptailptail-next;}//ptail newnodeptail-nextnewnode;}}思考下面的问题为什么这里形参的改变没有影响实参3.3头插voidSLTPushFront(SLTNode**pphead,SLTDataType x){assert(pphead);SLTNode*newnodeSLTBuyNode(x);newnode-next*pphead;*ppheadnewnode;}3.4 尾删voidSLTPopBack(SLTNode**pphead){assert(pphead*pphead);//只有一个结点if((*pphead)-nextNULL){free(*pphead);*ppheadNULL;}else{SLTNode*prevNULL;SLTNode*ptail*pphead;while(ptail-next){prevptail;ptailptail-next;}//prev ptailprev-nextNULL;free(ptail);ptailNULL;}}3.5 头删voidSLTPopFront(SLTNode**pphead){assert(pphead*pphead);SLTNode*next(*pphead)-next;free(*pphead);*ppheadnext;}3.6查找SLTNode*SLTFind(SLTNode*phead,SLTDataType x){SLTNode*pcurphead;while(pcur){if(pcur-datax){returnpcur;}pcurpcur-next;}}3.7在指定位置之前插入数据voidSLTInsert(SLTNode**pphead,SLTNode*pos,SLTDataType x){assert(ppheadpos);//当pos指向第一个结点时是头插if(pos*pphead){SLTPushFront(pphead,x);}else{SLTNode*newnodeSLTBuyNode(x);//找pos的前一个指针SLTNode*prev*pphead;while(prev-nextpos){prevprev-next;}//prev-- newnode-- posprev-nextnewnode;newnode-nextpos;}}3.8 在指定位置之后插入结点voidSLTInsertAfter(SLTNode*pos,SLTDataType x){assert(pos);SLTNode*newnodeSLTBuyNode(x);newnode-nextpos-next;pos-nextnewnode;}3.9 删除pos结点voidSLTErase(SLTNode**pphead,SLTNode*pos){assert(ppheadpos);//pos就是头结点if(pos*pphead){SLTPopFront(pphead);}else{SLTNode*prev*pphead;while(prev-next!pos){prevprev-next;}//prev pos pos-nextprev-nextpos-next;free(pos);posNULL;}}3.10 删除pos之后的结点voidSLTEraseAfter(SLTNode*pos){assert(pospos-next);//pos del del-nextSLTNode*delpos-next;pos-nextdel-next;free(del);delNULL;}3.11 销毁链表voidSListDestroy(SLTNode**pphead){SLTNode*pcur*pphead;while(pcur){SLTNode*nextpcur-next;free(pcur);pcurnext;}*ppheadNULL;}以上就是单链表各种功能的实现4. 顺序表与链表的比较1. 顺序表中间 /头部的插入删除时间复杂度ON 链表头部插入删除O1 在尾部频繁的插入和删除用顺序表更好 在头部频繁的插入和删除用链表更好 2. 顺序表增容需要申请新空间拷贝数据释放旧空间会有不小的消耗 链表无需增容 3. 顺序表增容一般是呈2倍增长势必会有一定的空间浪费。例如当前容量为100满了以后增容到200我们再继续插入五个数据后面没有数据插入了那么就浪费了95个数据空间。 链表不存在空间浪费不同点顺序表链表存储空间上物理上一定连续逻辑上连续物理上不一定连续随机访问支持:O1不支持O(N)任意位置插入或删除元素可能需要搬移元素效率低 (ON)只需修改指针指向插入动态顺序表空间不够时需要扩容没有容量的概念应用场景元素高效存储频繁访问任意位置插入和删除频繁缓存利用率高低

相关新闻

HarmonyOS7基础吸附滚动页实战:ScrollSnap 基础吸附行为与滚动停靠

HarmonyOS7基础吸附滚动页实战:ScrollSnap 基础吸附行为与滚动停靠

文章目录前言真正值得先看的不是细节代码状态设计这里有点东西代码别平均看,先抓关键方法第一段关键代码:页面是怎么被带起来的第二段关键代码:真正决定交互手感的地方不是只看,最好按这个顺序动手拿去项目里之前,我通…

2026/7/21 8:29:12阅读更多 →
名校招生机制解析:公平性与多元化的平衡之道

名校招生机制解析:公平性与多元化的平衡之道

1. 名校招生机制与公平性探讨最近关于顶尖高校招生政策的讨论再次成为热点话题。作为高等教育领域的从业者,我想从一个相对客观的角度,分析名校招生流程背后的运作机制及其引发的社会思考。名校的招生委员会通常由15-40名经验丰富的招生官组成&#xff0…

2026/7/21 8:29:12阅读更多 →
3步完成GitHub汉化:终极GitHub中文插件安装指南

3步完成GitHub汉化:终极GitHub中文插件安装指南

3步完成GitHub汉化:终极GitHub中文插件安装指南 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否也曾面对GitHub的英…

2026/7/21 8:29:12阅读更多 →
OpenZFS故障排除手册:常见问题与解决方案大全

OpenZFS故障排除手册:常见问题与解决方案大全

OpenZFS故障排除手册:常见问题与解决方案大全 【免费下载链接】openzfs OpenZFS on Linux and FreeBSD 项目地址: https://gitcode.com/gh_mirrors/op/openzfs OpenZFS是一款强大的文件系统和卷管理器,广泛应用于Linux和FreeBSD系统。本手册将帮助…

2026/7/21 17:03:59阅读更多 →
Python异步Web框架路由性能测试:py-frameworks-bench路由系统分析

Python异步Web框架路由性能测试:py-frameworks-bench路由系统分析

Python异步Web框架路由性能测试:py-frameworks-bench路由系统分析 【免费下载链接】py-frameworks-bench Another benchmark for some python frameworks 项目地址: https://gitcode.com/gh_mirrors/py/py-frameworks-bench py-frameworks-bench是一个专注于…

2026/7/21 17:03:59阅读更多 →
探索Replugged生态系统:精选插件与主题推荐清单

探索Replugged生态系统:精选插件与主题推荐清单

探索Replugged生态系统:精选插件与主题推荐清单 【免费下载链接】replugged A lightweight Discord client mod focused on simplicity and performance. 项目地址: https://gitcode.com/gh_mirrors/re/replugged 想要提升你的Discord使用体验吗?…

2026/7/21 17:03:59阅读更多 →
3分钟搞定微信语音转换:Silk v3音频解码器完整指南

3分钟搞定微信语音转换:Silk v3音频解码器完整指南

3分钟搞定微信语音转换:Silk v3音频解码器完整指南 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. 项目地…

2026/7/21 17:03:59阅读更多 →
OpenRun开发者指南:如何为平台贡献插件与扩展功能

OpenRun开发者指南:如何为平台贡献插件与扩展功能

OpenRun开发者指南:如何为平台贡献插件与扩展功能 【免费下载链接】openrun Deployment platform for code-first internal tools. Deploy web apps declaratively, on a single-node or on Kubernetes, with OIDC/SAML auth and RBAC. 项目地址: https://gitcode…

2026/7/21 17:03:59阅读更多 →
完播率卡在38.7%?AI生成视频的3秒钩子失效真相,及4步动态帧级重校准法

完播率卡在38.7%?AI生成视频的3秒钩子失效真相,及4步动态帧级重校准法

更多请点击: https://codechina.net 第一章:完播率卡在38.7%?AI生成视频的3秒钩子失效真相,及4步动态帧级重校准法 当AI视频生成工具批量产出“高信息密度开头”后,完播率却稳定卡在38.7%——这不是算法退化&#xff…

2026/7/21 17:01:59阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →