当前位置: 首页 > article >正文

线性表——单链表的增删查改操作

一.认识单链表目录一.认识单链表1.什么是单链表呢2.结点的初始化二.单链表的增删查改操作1.单链表的头插操作2.单链表的尾插操作3.指定位置的前方和后方进行插入1.在p1的前面插入ps4.单链表的删除操作1.中间位置删除2.头删3.尾删1.什么是单链表呢单链表也属于线性表中的一种它是物理上不连续存储逻辑上用指针按次单向序链接的线性表。如各个结点之间并无物理上的链接。各个结点由两部分组成——数据域和指针域各个结点的指针指向它的下一个结点若没有下一个节点则使该结点的指针赋为空。如此就是一个单向、不连续存储、不循环的线性表——单链表。2.结点的初始化单链表虽然物理上不连续但是并代表它的各个结点的数据类型可以各不相同和顺序表一样各个储存的是相同的数据类型。1 struct SListNode 2 { 3 int data; //节点数据 4 struct SListNode* next; //指针变量⽤保存下⼀个节点的地址 5 };每当我们插入一个结点时都需要开辟一块空间用来存储结点但是插入结点后我们基本上只知道第一个结点的指针后面的结点都时匿名的 。头结点也叫哨兵位。只是一个放哨的不存储任何数据指针域的指针指向第一个有效结点的地址。当然头结点可用可不用。我们先在头文件对结点的结构体进行声明同时我们还定义了结构体的指针*PNode相当于typedef struct SLNode* PNode;此时PNode就是一个指针类型注意是类型而不是变量当我们再声明一个指针变量时就可以这样声明了PNode L; //相当于struct SLNode* L;现在我们来完成各个结点的初始化函数,当然在那之前我们先完成头节点的初始化思考一下我们初始化一个结点应该返回是什么或者应该什么都不返回吗我们的选择是要如果不反回结点的地址就需要二级指针进行操作这里我们希望使用一级指针我们选择返回初始化的结点的地址我们知道头结点的数据是不用初始化的我们只管初始化后把地址返回去即可。如果初始化成功就返回开辟好的地址如果初始化失败就返回空。同时在头文件上声明在test.c文件中进行调用注意我们创建的头结点是不存放数据的当然刚初始化头节点它后面还没有有效的结点所以node的next要置为空二.单链表的增删查改操作1.单链表的头插操作前面我们已经创建了一个头节点但是头插法指的是在第一个有效数据前面插入而不是头节点的前面插入。理解这个后我们开始实现头插函数我们来分析应该怎么插入假设ps指针指向的就是我们要插入的结点我们最直接的想法就是让phead指向ps,然后ps指向p1,当然这没错只不过需要注意顺序问题。如果先让phead的next先指向ps,那么我们就失去了p1的地址也就是这种写法phead-next ps; ps-next phead-next;这样就容易造成了死循环也就变成了这样虽然看似简单稍不注意就会犯这样的错误那么正确的操作应该是这样//先让ps找到下个结点的地址 ps-next phead-next; //再让头节点的next指向ps phead-next ps;这里也能体现出带头节点的好处假如头节点指向的下一个位置为空我们也不用进行额外的操作依然和正常头插一样即可。如果是不带头节点的头插你还得判断头指针是否为空操作不慎还会使得头指针变成野指针导致越权访问。现在头插的基本逻辑已经搞定头插函数就可以这么写了我们需要头指针你既然要插入肯定要有值吧所以还得有value下面就是用上面的逻辑来实现这样我们就完成了头插让我们来测试一下当然为了只管观察过程我么设计一个打印函数这里不细讲来我们看测试结果没有问题我们继续看尾插2.单链表的尾插操作我们来看图进行分析为了方便解说我们给最后一个结点取名为p1在实际操作过程中它是匿名的我们只能通过头节点开始从头遍历找到它。现在我们想把ps插入到p1的后面和头插法的逻辑很像先让ps指向p1的next再让p1指向ps即可那就是这样由于逻辑和头插几乎一直故不再过多解释我们直接测试结果很简单现在我们来看指定位置的前后面插入3.指定位置的前方和后方进行插入这里我们先来解决传入头节点传入的情况假设我要在p1这个位置的前面进行插入操作现在我们有两种方法进行寻值操作第一种是按需要进行寻值插入第二种是先查询值的位置再进行操作。这两种既然都涉及查询我就先完成查询函数吧然后再进行插入操作查询函数比较简单这里直接给出这样得到要查询的值的地址后就方便进行前后插入操作了。1.在p1的前面插入ps假设查找到了p1的地址现在要在p1的前面插入ps,但是现在不传入头指针了这就意味着我没有办法从头开始遍历找到p1的前一个结点就没有办法让p1的前一个结点的next指针直接指向ps能想到的一个办法是先把ps插入到p1的后面做它的直接后继结点然后把p1的data与ps的data交换以实现在值value前插入结点ps的操作用代码实现就是同时在头文件声明后测试出现了随机值说明插入函数又未定义值就进行运算的情况检查函数bool InsertFront(PNode p1, ElemType value) { PNode temp (PNode)malloc(sizeof(Node)); if (temp) { temp-next p1-next; p1-next temp; p1-data temp-data; p1-data value; return true; } return false; }我发现在两个结点完成指针指向链接后temp的data并没有进行初始化就与p1的data进行了交换值操作因此交换后temp的值为确实值而p1的data为随机值只需要开在交换值前给temp的成员data赋值即可修改完成测试运行结果在4的前面插入11再于2的前面插入12均没有问题。在p1的后方插入值value和前插中的操作如出一辙直接插入值不需要进行交换操作在头文件声明后测试分别于4的后面插入11再于2的后面插入12 。代码正常进行插入操作基本完成既然后插入肯定也要又删除操作。4.单链表的删除操作1.中间位置删除删除操作和插入操作很像都是注意结点的指针域的指向释放空间后不要让表断链假设传入参数是只传了p1指向的地址就无法从头开始找到p1的前驱结点不能简单地去修改p1前驱结点的next指向这个时候只能接着运用偷梁换柱的方法把删掉p1修改为删掉p1后继结点因为这里讨论的是p1不为最后一个结点的情况所以不用担心p1后面没有值和p1前驱结点的next会成为野指针的情况。把p1后继结点的data赋值给p1的data在让p1的next等于p1后继结点的next这样就完成了偷梁换柱就变成了这样测试一下看效果出问题了目前不知道哪里有bug通过调试检查试试发现我们要删除值为4的结点进行删除操作后访问错误检查后发现是删除时空间释放的逻辑有问题当完成交换后node指向的已经时原来直接后继的next再进行释放操作就会释放到原直接后继结点的next现在只需要另起一个变量存储原直接后继结点的地址然后释放就不会释放错空间了在来测试看结果结点4和结点2都被正常删除没有造成内存泄漏的情况。2.头删因为讨论的时有带头节点的单链表所以头山的时候完全不用考虑头节点是否为空的情况大大方便了删除操作的执行。结合前面的经验每把phead的next修改前先把要释放的空间临时存起来然后free但是头删要注意phead的next为空的情况所以进行头删操作前要先判断phead的next是否为空为空则返回。同时在头文件进行声明测试看结果如何结果正常接着继续处理尾删3.尾删尾删就是从最后一个结点挨个往前删除结点但是单向链表是不可以逆向访问的每一次尾删只能从头循环遍历到最后一个结点再进行删除操作。同样尾删时如果只有一个元素时或者链表为空头指针的next就为空所以尾删也要判断phead的next是否为空。如果我的pos时最后一个结点我释放掉pos后pos的直接前驱结点的next就变成了也指针如果我把循环条件改为while (pos-next pos-next-next)确实可以解决这个问题但是有效元素为1的时候如何判断我的pos是倒数第一个元素还是倒数第二个元素只需要让pos是从phead的位置出发即可这里再一次体现出带头节点的单向链表的优势循环结束后pos的next才是最后一个结点所以要释放的是pos-next然后把pos的next置为空这样我们就完成了尾插操作。至此我们就完成了单链表的基本增删查改操作

相关文章:

线性表——单链表的增删查改操作

一.认识单链表 目录 一.认识单链表 1.什么是单链表呢? 2.结点的初始化 二.单链表的增删查改操作 1.单链表的头插操作 2.单链表的尾插操作 3.指定位置的前方和后方进行插入 1.在p1的前面插入ps 4.单链表的删除操作 1.中间位置删除 2.头删 3.尾删 1.什么是…...

将 Claude Code 编程助手的后端无缝切换至 Taotoken 聚合平台

将 Claude Code 编程助手的后端无缝切换至 Taotoken 聚合平台 1. 准备工作 在开始配置之前,请确保您已安装 Claude Code 编程助手并拥有 Taotoken 平台的 API Key。若尚未获取 API Key,可登录 Taotoken 控制台创建。模型标识符可在模型广场查看&#x…...

实测 Claude Code:当 AI 成为你的全栈实习生,本地开发流该如何重构?

站在 2026 年的今天,如果你还在一行一行手写样板代码(Boilerplate),或者只是把 AI 当作高级的代码自动补全工具,那真的已经有些落伍了。随着 Anthropic Claude Code 等全栈 Agent 系统的爆发,开发者和 AI 之…...

Jellyfin智能中文字幕插件:5分钟快速上手指南

Jellyfin智能中文字幕插件:5分钟快速上手指南 【免费下载链接】jellyfin-plugin-maxsubtitle 一个 Jellyfin 中文字幕插件(未来可以不局限中文) 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-maxsubtitle Jellyfin-p…...

5个理由选择LinkSwift:八大网盘直链获取完整指南

5个理由选择LinkSwift:八大网盘直链获取完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...

【RTOS配置黄金法则】:C语言嵌入式开发者必知的2026年5大配置陷阱与避坑指南

更多请点击: https://intelliparadigm.com 第一章:RTOS配置黄金法则的底层逻辑与演进趋势 RTOS 配置并非参数堆砌,而是对时间确定性、内存约束与中断响应三者动态平衡的系统性建模。其底层逻辑根植于硬件抽象层(HAL)与…...

告别LNK1181:一份给C++新手的Visual Studio链接器‘寻宝’指南(以avdevice.lib为例)

从零破解LNK1181:Visual Studio链接器寻宝全攻略 第一次在Visual Studio里看到LNK1181错误时,我盯着屏幕上那行"无法打开输入文件avdevice.lib"的红色文字发呆了十分钟。作为一个刚接触C的开发者,这种报错就像突然收到一封用拉丁文…...

【2026嵌入式配置生死线】:未启用MPU内存保护的RTOS初始化=裸奔上线?

更多请点击: https://intelliparadigm.com 第一章:【2026嵌入式配置生死线】:未启用MPU内存保护的RTOS初始化裸奔上线? 在2026年功能安全与ASIL-B/C级嵌入式系统准入门槛下,RTOS(如FreeRTOS、Zephyr、Thre…...

终极AI翻唱生成指南:如何使用AICoverGen轻松制作专业级AI翻唱歌曲

终极AI翻唱生成指南:如何使用AICoverGen轻松制作专业级AI翻唱歌曲 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen …...

BepInEx插件框架技术深度解析:Unity游戏模块化扩展实战指南

BepInEx插件框架技术深度解析:Unity游戏模块化扩展实战指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity和XNA游戏生态中的核心插件框架&#xff0…...

3大优势:揭秘跨平台网络资源下载神器的完整使用攻略

3大优势:揭秘跨平台网络资源下载神器的完整使用攻略 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否曾为无…...

当数字记忆面临消失危机:如何用WeChatMsg守护你的微信对话历史

当数字记忆面临消失危机:如何用WeChatMsg守护你的微信对话历史 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...

UE Viewer:3大核心技术揭秘,解锁虚幻引擎资源逆向工程全流程

UE Viewer:3大核心技术揭秘,解锁虚幻引擎资源逆向工程全流程 【免费下载链接】UEViewer Viewer and exporter for Unreal Engine 1-4 assets (UE Viewer). 项目地址: https://gitcode.com/gh_mirrors/ue/UEViewer 在游戏开发和逆向工程领域&#…...

FastAPI整洁架构实战:分层设计与依赖注入构建可维护后端

1. 项目概述:为什么我们需要一个“干净”的FastAPI后端架构?如果你和我一样,用FastAPI开发过几个项目,从简单的API服务到稍具规模的后台系统,大概率会经历这样一个过程:一开始,main.py里写几个路…...

GetQzonehistory:当技术遇见记忆,永久封存你的青春时光

GetQzonehistory:当技术遇见记忆,永久封存你的青春时光 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经在深夜翻看QQ空间,看着那些年写下的…...

轻量化Transformer在点云处理中的应用与优化

1. 项目概述:当点云遇上Transformer在三维视觉领域,点云数据处理一直是个既迷人又棘手的问题。不同于规整的二维图像像素矩阵,点云是由空间中的离散点组成的无序集合,每个点包含XYZ坐标和可能的附加属性(如RGB颜色、反…...

【R报告DevOps黄金标准】:3个不可绕过的Docker镜像构建技巧,让tidyverse代码在Air-Gapped内网秒级上线

更多请点击: https://intelliparadigm.com 第一章:R报告DevOps黄金标准的演进与内网部署挑战 R语言在数据科学团队中正从单机分析工具演变为支撑CI/CD流水线关键环节的报告引擎。随着《DevOps黄金标准》(2023版)将“可审计、可复…...

告别手动抓取:构建自动化数据清洗管道byebyeclaw实战

1. 项目概述:告别“猫爪”的自动化利器最近在折腾一个挺有意思的小项目,名字叫“byebyeclaw”,直译过来就是“再见,猫爪”。乍一听可能有点摸不着头脑,这到底是干嘛的?其实,这是一个专门用来处理…...

2025届最火的五大AI论文助手横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能对学术写作予以辅助,正一步步改变传统的论文产出模式,当下&a…...

ArcGIS Pro二次开发实战:手把手教你写一个勘测定界TXT解析工具(C#/.NET 6)

ArcGIS Pro二次开发实战:勘测定界TXT解析工具全流程解析 在GIS开发领域,勘测定界数据的处理一直是土地管理、城乡规划等业务中的高频需求。传统的勘测定界数据常以特定格式的TXT文件交付,包含地块坐标、属性等关键信息。本文将手把手带你开发…...

类型注解不再“形同虚设”,Python 3.15新增TypeVarTuple与Self类型实战,重构你的API层代码,现在不学明年就被淘汰?

更多请点击: https://intelliparadigm.com 第一章:Python 3.15 类型系统增强概览 Python 3.15 引入了多项类型系统关键演进,旨在提升静态类型检查的精度、表达力与开发者体验。核心变化聚焦于泛型协变/逆变控制、运行时可擦除类型的显式声明…...

WPF开发必看:ResourceDictionary的MergedDictionaries到底怎么用?一个例子讲清楚

WPF开发实战:ResourceDictionary的MergedDictionaries深度解析与工程实践 在WPF企业级应用开发中,资源管理往往成为项目规模扩大后的第一个痛点。当UI组件超过50个、样式定义突破200行时,如何避免XAML文件变成难以维护的"巨无霸"&a…...

TSN流量调度实战指南(C语言裸机/RTOS双环境适配)

更多请点击: https://intelliparadigm.com 第一章:TSN流量调度实战指南(C语言裸机/RTOS双环境适配) 时间敏感网络(TSN)在工业控制、车载以太网和实时音视频传输中要求微秒级确定性调度。本章聚焦于在资源受…...

Go 开发者学 Rust:枚举、操作符体验如何?运行时与监控有何不同?

当 Go 开发者遇上 Rust作者 Paul Hinze 用 Go 编程约十年,一直敬重 Rust 却缺乏深入学习动力。本周 Miren 参加首届 TokioConf,为准备演示,作者搭建了聊天服务器,让 Claude 帮忙编写代码并向其请教。代码放在示例应用仓库&#xf…...

如何用PyTorch实现物理知情神经网络:5分钟掌握PINN核心原理与实战应用

如何用PyTorch实现物理知情神经网络:5分钟掌握PINN核心原理与实战应用 【免费下载链接】PINN Simple PyTorch Implementation of Physics Informed Neural Network (PINN) 项目地址: https://gitcode.com/gh_mirrors/pin/PINN 物理知情神经网络(P…...

一天一个开源项目(第89篇):Warp - AI 驱动的现代化 Rust 终端

引言 “The terminal hasn’t fundamentally changed in 40 years. It’s time it did.” — The Warp Team 这是"一天一个开源项目"系列的第89篇文章。今天带你了解的项目是 Warp。 在开发者每天都要面对的工具链中,终端(Terminal&#xff0…...

35 年后!1991 年 Adobe PostScript 解释器在浏览器运行,还打破多项限制

在浏览器中运行 Adobe 1991 年的 PostScript 解释器2026 年 5 月 1 日,作者 [Michael Steil](https://www.pagetable.com/?author1 "查看 Michael Steil 的所有文章")[HP C2089A “PostScript Cartridge Plus”](https://www.pagetable.com/?p1673) 是 …...

SOCD Cleaner终极指南:内核级键盘输入仲裁技术深度解析

SOCD Cleaner终极指南:内核级键盘输入仲裁技术深度解析 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd SOCD Cleaner是一款专为竞技游戏玩家设计的开源键盘输入仲裁工具,通过创新的内核级…...

python transformers

# 聊聊Python transformers这个库 做了几年NLP相关的工作,接触过的框架和库少说也有十几个。但要说哪个库让我觉得“这个团队是真的在认真做工程”,那Hugging Face的transformers绝对排在前列。它不是那种学术原型代码,而是真正能直接扔到生产…...

【Python WASM 部署实战白皮书】:20年架构师亲授3大避坑指南、4步零错误上线法与Chrome 125+兼容性验证清单

更多请点击: https://intelliparadigm.com 第一章:Python WASM 部署测试的演进背景与核心挑战 WebAssembly(WASM)正从“前端高性能执行层”加速演变为通用跨平台运行时,而 Python 作为生态最丰富的科学计算与胶水语…...