一文吃透单向链表:定义、查找、插入、删除全套 C 代码实现 简介链表是一个线性数据结构由一系列的结点组成每个结点包括两个部分一个是存储数据元素的数据域另一个是存储下一个结点地址的指针域节点动态分配长度可变。常见类型单向链表singly、双向链表doubly、循环链表circular。用途需要频繁在中间插入/删除的场景很合适。链表可用于实现数据队列。队列Queue是一种抽象数据类型ADT遵循 FIFO先进先出规则。只在队尾插入enqueue只在队头删除dequeue。队列可以用数组循环缓冲或链表实现。一、单向链表的数据定义单向链表也叫单链表是链表中最简单的一种形式它的每个节点包含两个域一个信息域元素域和一个链接域。这个链接指向链表中的下一个节点而最后一个节点的链接域则指向一个空值。单向链表是一种线性表实际上是由节点Node组成的一个链表拥有不定数量的节点。其数据在内存中存储是不连续的它存储的数据分散在内存中每个结点只能也只有它能知道下一个结点的存储位置。由N各节点Node组成单向链表每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点Head我们对链表的所有操作都是直接或者间接地通过其头节点来进行的。链表的数据定义代码如下//单向链表定义 typedef struct LNode *List; struct LNode { ElementType Data; List Next; }二、获取单向链表长度具体代码实现如下//获取单向链表长度 int Length(List Pstart) { List p Pstart; int j 0; while(p) { p p-Next; j; } return j; }三、单向链表查找数据3.1 按序号查找代码实现如下//1.按序号查找 int FindK(int K, List Ptrl) { List p Ptrl; int i 0; while((p ! NULL) (i K)) { P P-Next; i; } if(i K) { return p; } else { return NULL; } }3.2 按值查找代码实现如下//2.按值查找 int Find(ElementType Val, List Ptrl) { List p Ptrl; while((p ! NULL) (p-Data ! Val)) { p p-Next; } return p; }四、单向链表插入在第i-11≤i≤n1个结点后插入一个值为X的新结点。1.先构造一个新结点用s指向2.再找到链表的第i-1个结点用p指向3.然后修改指针插入结点p之后插入新结点是s。链表插入过程如下图所示程序实现如下//单向链表插入在第i-11≤i≤n1个结点后插入一个值为X的新结点 List Insert(ElementType X,int i,List Ptrl) { List P,S; if(i 1) //新结点插入在表头 { S (List)malloc(sizeof(stroct LNode)); //申请、填装结点 S-Data X; S-Next Ptrl; return S; //返回表头指针 } P Find(i-1,Ptrl); //查找第i-1个结点 if(P NULL) //第i-1个不存在不能插入 { printf(参数i错\r\n); return NULL; } else { S (List)malloc(sizeof(struct LNode)); S-Data X; S-Next P-Next; //新结点插入在第i-1个结点的后面 P-Next S; return Ptrl; } }五、删除删除链表的第i1≤i≤n个位置上的结点。1.先找到链表的第i-1个结点用p表示2.再用指针s指向要删除的结点p的下一个结点3.然后修改指针删除s所指向的结点4.最后释放s所指向结点的内存空间。链表删除过程如下图所示程序实现如下//删除删除链表的第i1≤i≤n个位置上的结点 List Delete(int i,List Ptrl) { List p,s; if(i 1) //若删除的是表的第一个结点 { s Ptrl; //s指向第一个结点 if(Ptrl ! NULL) { Ptrl Ptrl-Next; //从链表中删除 } else { return NULL; } free(s); //释放被删除的结点 return Ptrl; } p Find(i-1,Ptrl); //查找第i-1个结点 if(p NULL) { printf(第%d个结点不存在,i-1); return NULL; } else if(p-Next NULL) { printf(第%d个结点不存在,i); return NULL; } else { s p-Next; //s指向第i个结点 p-Next s-Next; //从链表中删除结点s free(s); //释放被删除的结点s return Ptrl; } }六、总结链表的知识点初学起来感觉很抽象开始时可以先把链表的定义、查找、插入、删除这些基本操作用代码敲一下然后最好是实际应用一下找一个例程把需要处理的数据通过链表存储起来数据的查找、更新数据插入、删除旧的数据等这些操作都实践一下只有用了才能真正理解链表只学习概念理论没什么用。

相关新闻

最新新闻

Claude Skills开发实战:从核心能力到生产部署

Claude Skills开发实战:从核心能力到生产部署

1. Claude Skills 核心能力全景解析作为AI领域最受开发者关注的技术栈之一,Claude Skills正在重塑人机交互的开发范式。这套技能系统不同于传统API调用,它通过模块化封装将自然语言理解、任务分解、工具调用等能力转化为可组合的"技能单元"。我…

2026/7/28 3:05:45
【OpenClaw从入门到精通】第87篇:打造你的第一个自定义 Agent:从设计到运行(完整实战版)

【OpenClaw从入门到精通】第87篇:打造你的第一个自定义 Agent:从设计到运行(完整实战版)

【OpenClaw从入门到精通】第87篇:打造你的第一个自定义 Agent:从设计到运行(完整实战版) 摘要 2024-2025年,AI Agent 从概念验证走向生产落地,但大多数开发者仍面临“框架太重、配置复杂、无法定制”的困境。本文以轻量级 Agent 框架 OpenClaw 为例,从零开始构建一个能…

2026/7/28 3:05:45
MAXScript:3D艺术家的自动化编程利器

MAXScript:3D艺术家的自动化编程利器

1. 项目概述:当艺术思维遇上编程逻辑2018年冬天,我在北京798艺术区的工作室里盯着3ds Max界面发呆。那是我连续第三周熬夜修改建筑可视化动画的摄像机路径,重复操作让我的手腕开始隐隐作痛。就在那个凌晨,我偶然发现了MAXScript的…

2026/7/28 3:05:45
老板要的经营驾驶舱,本体语义平台到底能不能兜住

老板要的经营驾驶舱,本体语义平台到底能不能兜住

周一早上九点,某制造集团的信息总监把三张报表摆到老板桌上:一张是 ERP 导出的销售汇总,一张是从 BI 平台截屏的毛利率趋势,最后一张是 Excel 手填的库存周转。老板翻了 30 秒,把报表推回去,丢下一句&#…

2026/7/28 3:05:45
基于BERT的金融新闻去重系统设计与优化

基于BERT的金融新闻去重系统设计与优化

1. 金融新闻去重系统的行业背景与挑战金融领域每天产生海量新闻资讯,从财经媒体、监管公告到上市公司披露,信息过载问题日益严重。某国际投行内部统计显示,其分析师团队平均每天需要处理超过2000条新闻线索,其中约35%内容存在重复…

2026/7/28 3:05:45
UART串口通信全解析:从异步原理到嵌入式实战应用

UART串口通信全解析:从异步原理到嵌入式实战应用

1. 项目概述:从零开始理解UART如果你刚开始接触嵌入式开发,或者玩过一些单片机开发板,那么“串口”这个词你一定不陌生。它几乎是所有微控制器(MCU)或片上系统(SoC)最基础、最古老,也…

2026/7/28 3:00:44

月新闻