从“会写代码”到“能管理内存”,你需要跨过链表这道坎
很多 C 语言学习者都有一个通病:指针的概念懂了,函数也能写,但一旦涉及复杂的内存结构,比如需要动态维护一个列表、一个队列,或者处理不同数据类型的通用存储时,就彻底懵了。本章的核心任务,就是填补这个能力缺口。它不只是讲语法,而是带你从零开始,亲手构建一套完整的数据结构库。你会发现,真正的难点不在于写出节点,而在于处理指针的指针、边界条件的判断,以及如何将业务逻辑与底层存储解耦。
适合有一定 C 基础(熟悉结构体、指针、动态内存分配 malloc/free)的学习者。如果你看到多级指针还发怵,建议先回头复习一下指针的本质,否则后续的双链表操作会让你非常痛苦。本章不需要你有多深的数据结构理论功底,但需要你有足够的耐心去推导每一个指针的指向变化。
先看单链表,再看双链表,最后思考 void* 的妙用
学习顺序至关重要。建议优先攻克单链表部分。从创建节点开始,逐步深入到插入、删除、遍历等核心操作函数。单链表是基础,其中的逻辑——特别是头插法、尾插法以及删除指定节点时如何处理前驱指针——是后续所有复杂结构的基石。不要跳步,务必手敲并调试通过第 6 到 9 节的功能函数,直到你能独立写出一个健壮的单链表完整代码。
在熟练掌握单链表后,再进入双链表的学习。双链表的优势在于可以双向遍历和更方便的删除操作,但代价是代码复杂度上升。重点对比单链表与双链表在插入和删除节点时的代码差异,理解“prev”和“next”指针如何协作以减少边界判断的繁琐。最后,务必细读关于“为什么将 data 定义为 void 指针类型”的章节。这是本章的升华点,它教会你如何设计通用链表,让同一套链表代码能存储 int、struct 或任意类型数据,这是从“写死代码”走向“框架设计”的关键一步。
学完能做什么,以及如何配合资料练习
完成本章后,你将能够独立实现基于链表的基础数据结构,如栈和队列,并能理解 Linux 内核或开源项目中常见的链表实现原理(如 Linux kernel 的 list_head)。你不再害怕复杂的指针操作,而是能从容地管理堆内存中的节点关系。
资料包中的代码片段是参考,不是答案。建议在每节视频讲解完核心逻辑后,先关闭视频,尝试自己在 IDE 中从零编写该功能函数。遇到段错误(Segmentation Fault)时,使用 gdb 或打印指针地址进行调试,记录报错时的指针状态,这比直接看代码有用得多。特别是双链表的完整代码部分,建议对照视频逐行分析,理清每个节点的链接变化,确保你真正理解了“断开”与“重连”的时机。
课程目录
1 多线程、网络编程、数据库、数据结构 (15:40) 2 数据结构、顺序表、链表 (21:27) 3 链表基础知识 与 单链表 (22:24) 4 单链表基本操作函数 1——创建节点 (22:00) 5 单链表基本操作 2 —— 插入节点、删除节点 (28:44) 6 单链表功能函数 1 (24:43) 7 单链表功能函数 2 (25:15) 8 单链表功能函数 3 (17:06) 9 单链表的完整代码 (27:10) 10 为什么将data定义为void指针类型 (21:24) 11 双链表基本操作函数 1——创建节点 (16:21) 12 双链表基本操作函数 2 —— 插入节点、删除节点 (31:46) 13 双链表功能函数 1 (24:56) 14 双链表的功能函数 2 (18:50) 15 双链表功能函数 3 (27:06) 16 双链表完整代码 (20:00) 17 内核链表的原理 (17:23) 18 内核链表的基本操作 (29:03) 19 内核链表的使用案例 1 (25:58) 20 内核链表使用案例 2 (13:07)





