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/8/25 16:17:47 阅读更多 →
AI编程时代开发者核心竞争力:从编码到架构的升维竞争

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

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

2026/8/24 12:25:12 阅读更多 →
使用NTLite深度定制与精简Windows系统:从原理到实战避坑指南

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

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

2026/8/25 16:34:39 阅读更多 →

最新新闻

OpenClaw运维实战:从日志排查到智能预防的故障自愈指南

OpenClaw运维实战:从日志排查到智能预防的故障自愈指南

1. 项目概述:从“救火”到“预防”的运维思维转变如果你也像我一样,曾经在深夜被报警电话叫醒,然后一头扎进成千上万行的日志海洋里,试图从ERROR、WARNING和一堆晦涩的堆栈信息中,定位一个导致服务中断的OpenClaw工具错…

2026/8/26 7:54:40 阅读更多 →
CRC8校验算法详解:从原理到C语言实现与嵌入式应用

CRC8校验算法详解:从原理到C语言实现与嵌入式应用

1. 项目概述:从校验位到数据守护神在嵌入式开发、通信协议或者任何需要确保数据完整性的场景里,你肯定不止一次遇到过“校验”这个词。数据从A点传到B点,中间可能经过复杂的电路、嘈杂的无线信道,或者仅仅是内存里的一次拷贝&…

2026/8/26 7:54:40 阅读更多 →
STM32 DAC从入门到精通:定时器触发与DMA波形生成实战

STM32 DAC从入门到精通:定时器触发与DMA波形生成实战

1. 项目概述:为什么STM32的DAC值得你花时间? 如果你正在用STM32做项目,无论是想播放一段音频、生成一个可控的电压基准,还是驱动一个需要模拟信号的老式设备,数字模拟转换器(DAC)这个外设迟早会…

2026/8/26 7:54:40 阅读更多 →
AI生成赛季内容工作流:提示词设计与人工校验实战

AI生成赛季内容工作流:提示词设计与人工校验实战

“豆包豆包,帮我生成一份三角洲S11的内容。” 如果你最近在玩赛季制射击游戏,大概率也有过类似的想法:新赛季马上更新,想提前知道有哪些新地图、新玩法、新武器,想整理一份赛季任务清单,想和朋友开黑时直接…

2026/8/26 7:54:40 阅读更多 →
华为OD机试:数据单元替换规则与实现详解

华为OD机试:数据单元替换规则与实现详解

1. 数据单元变化替换问题解析 今天我们来拆解一道华为OD机试中的高频题目——数据单元的变化替换。这道题看似简单,但在实际处理过程中有不少细节需要注意。作为参加过多次机试的老手,我发现很多考生容易在规则优先级和替换模式上栽跟头。 题目本质上是…

2026/8/26 7:54:40 阅读更多 →
向量数据库与RAG知识库搭建:从Embedding到语义搜索实战指南

向量数据库与RAG知识库搭建:从Embedding到语义搜索实战指南

向量数据库最近被聊得很多,尤其是做 AI 知识库、语义搜索、RAG 应用的人,基本绕不开这个词。但很多刚接触的朋友会把它理解成“又一种数据库”,或者以为只要接上向量数据库就等于做好了 AI 搜索。这篇文章想先把概念说清楚,再带你…

2026/8/26 7:53:40 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →