C语言数据结构:链表进阶(环形链表、双向链表、内核链表)与队列详解
上一篇讲解了单向链表基础结构体封装、头插、尾插、尾删、valgrind 内存泄漏检测。本篇继续拓展环形链表判环、环长、环入口、双向链表、Linux 内核链表、链式队列配套原理推导、核心逻辑适合期末复习、嵌入式 C 面试准备。一、单向链表 —— 环形链表问题单向链表尾结点不再指向NULL指向链表内部某个结点就形成带环链表。常见三道面试题判断是否有环、求环的长度、求环的入口点核心算法快慢指针双指针。1. 判断链表是否有环快慢指针法定义两个指针pfast快指针pslow慢指针都从链表头出发。慢指针pslow每次走 1 步快指针pfast每次走 2 步。如果快指针走到NULL链表无环如果快慢指针在链表中相遇链表一定存在环。原理环内快指针速度大于慢指针快指针会不断追赶慢指针环内一定会相遇无环链表快指针会率先抵达末尾NULL。2. 求有环链表的环长环长环形部分包含结点数量快慢指针得到相遇点指针从相遇点开始遍历循环计数当指针再次回到相遇点统计得到结点个数就是环的长度。3. 求环形链表环的入口结点经典数学推导设l链表头到环入口的结点距离a环入口到快慢指针相遇点距离b相遇点回到环入口的距离 环总长L a b。相遇时慢指针路程s l a快指针路程2s l a k*(ab)k 为快指针在环内绕的圈数联立化简得到关键结论l b✅数学结论链表起点到环入口距离 相遇点到环入口距离算法实现步骤得到快慢指针相遇结点一个指针从相遇点出发另一个指针从链表头部出发两个指针每次都只走一步两个指针第一次相遇的结点就是环形链表的环入口。⚠️注意必须两个指针都一次走一步不能继续快慢速度。二、双向链表单向链表结点只有后继指针pnext只能向后遍历双向链表每个结点增加前驱指针ppre既可以向后遍历也可以向前回溯。1. 双向链表结构体定义//数据域可以自定义存储任意业务数据 typedef struct stu { char name[32]; int age; int score; }Data_t; //双向链表结点前驱后继数据 typedef struct dnode { Data_t data; struct dnode *ppre; //指向前驱结点 struct dnode *pnext; //指向后继结点 }DNode_t; //双向链表管理对象封装头指针与链表长度 typedef struct dlink { DNode_t *phead; int clen; }DLink_t;2. 双向链表优缺点✅优点支持正向、反向双向遍历已知某结点可以直接找到它的前驱结点单向链表必须从头遍历删除当前结点时不需要遍历找前驱。❌缺点每个结点多一个指针域内存开销变大插入、删除结点要维护两个指针ppre、pnext代码逻辑比单链表复杂指针顺序容易写错。3. 双向链表 API 接口清单创建双向链表结点插入头插、尾插、按位置插入结点删除结点查找结点数据修改正向 / 反向遍历链表链表销毁循环 free 所有结点释放链表对象防止内存泄漏易错提醒双向链表插入删除要同时修改新结点、相邻结点的ppre与pnext指针赋值顺序不能乱。三、Linux 内核链表内核链表本质双向循环链表Linux 内核大量使用。和普通双向链表核心区别普通链表结点内部包含数据域结点把业务数据直接包在结构体里面一旦写死数据类型链表就只能存这一种数据。如果要存新的数据类型需要重新写一套链表代码。内核链表链表节点嵌入业务结构体链表的ppre、pnext指针不包裹数据把链表小结构体嵌入到你自己业务结构体内部。 同一套链表代码可以挂载任意不同类型业务结构体代码复用性极强。核心两个内核宏offsetof(TYPE, MEMBER)获取结构体成员距离结构体起始地址的字节偏移量。container_of(ptr, type, member)已知嵌入的链表成员地址结合偏移量反向得到整个业务结构体的首地址。工作流程通过链表指针 → container_of offsetof → 拿到外层完整业务结构体。内核链表没有 data 域只负责串起结构体业务数据放在外层结构体。一套链表算法适配多种数据类型驱动、内核模块广泛使用。四、队列Queue1. 队列基础概念队列是线性结构特性FIFO 先进先出。队尾执行插入操作叫入队队头执行删除操作叫出队类比排队先排队的人先离开队伍。2. 队列分类顺序队列数组实现存在假溢出问题一般优化为循环队列链式队列链表实现本篇重点链式队列管理结构体一般保存phead队头指针出队在这里删结点ptail队尾指针入队在这里新增结点clen当前队列元素个数3. 链式队列核心操作入队队尾插入结点新结点加到ptail后面更新队尾指针ptail指向新结点队列为空时phead和ptail都指向新结点。出队队头删除结点删除phead指向的队头结点更新队头指针 ⚠️边界删除之后队列为空需要将ptail置NULL避免野指针。4. 队列 API创建队列入队队列遍历判断队列是否为空出队获取队头元素只读取不删除销毁队列释放全部结点、释放队列管理对象5. 队列典型应用场景数据缓冲、任务排队、消息队列生产者消费者模型。知识点总结思维导图环形单向链表判环快慢指针有环则相遇无环 fast 走到 NULL环长相遇点循环计数回到原点环入口头指针、相遇点指针同速步进相遇即入口数学推导lb双向链表每个结点ppre前驱指针 pnext后继指针双向遍历插入删除维护两组指针内存开销增大。内核双向循环链表链表结点嵌入业务结构体offsetof求偏移container_of反向获取结构体首地址一套链表操作支持多种数据类型。队列 FIFO 先进先出队尾入队队头出队链式队列维护头指针、尾指针常用于缓冲、消息队列。拓展思考面试常考快慢指针为什么快指针每次走 2 步走 3 步行不行可以但 2 步是最简单步长过大会增加错过相遇的概率2 步是最优。双向链表删除结点相比单向链表优势单向链表删除当前结点需要从头遍历找前驱双向链表直接node-ppre拿到前驱。内核链表相比普通链表最大优势是什么代码复用不需要为每种数据类型重写一套链表插入删除。链式队列出队后什么时候 ptail 要置 NULL删除之后队列变空如果不置空ptail 会变成野指针下次入队会产生逻辑错误。下一篇可以完整实现环形链表判环代码、双向链表全套接口、内核链表模拟实现、链式队列完整 C 代码。

相关新闻

OpenAI API 集成实战:从环境配置到生产级代码助手开发

OpenAI API 集成实战:从环境配置到生产级代码助手开发

1. 背景与核心概念:AI巨头的组织变动与技术生态 近期,OpenAI 长期首席运营官(COO)Brad Lightcap 离职创业的消息引发了技术社区的广泛关注。对于开发者而言,这不仅是商业新闻,更是一个审视和思考 AI 技术生…

2026/10/31 4:42:49 阅读更多 →
AI编程时代开发者核心竞争力:从编码到架构的升维竞争

AI编程时代开发者核心竞争力:从编码到架构的升维竞争

最近在技术圈里流传着一个很有意思的说法:“笑死了,已经可以完赛了”。乍一听,这像是一句游戏圈或者体育圈的调侃,但如果你把它放到AI编程助手的语境下,就会发现它精准地戳中了当前开发者的一个核心痛点:当…

2026/10/29 23:48:04 阅读更多 →
使用NTLite深度定制与精简Windows系统:从原理到实战避坑指南

使用NTLite深度定制与精简Windows系统:从原理到实战避坑指南

1. 为什么需要精简Windows系统?如果你和我一样,是个喜欢折腾电脑的“老鸟”,或者手头恰好有一台配置不那么给力的老电脑,那你一定对Windows系统那日益臃肿的身材深有体会。每次新装完系统,看着C盘那几十个G的空间被瞬间…

2026/10/28 20:51:40 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/30 9:20:34 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/30 10:19:21 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/30 10:19:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/30 9:21:37 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 17:32:24 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 10:28:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 0:09:01 阅读更多 →