数据结构三重门:强效入门·考研通关·编程实践
正版全新
¥
62.57
7.0折
¥
89
全新
库存11件
作者孙逊
出版社清华大学出版社
ISBN9787302715696
出版时间2022-12
装帧其他
开本16开
纸张纯质纸
定价89元
货号5035293
上书时间2026-06-03
商品详情
- 品相描述:全新
- 商品描述
-
【书 名】 数据结构三重门:强效入门·考研通关·编程实践
【书 号】 9787302715696
【出 版 社】 清华大学出版社
【作 者】 孙逊
【出版日期】 2026-05-01
【开 本】 16开
【定 价】 89.00元
【编辑推荐】
深入浅出,通俗讲解数据结构
【内容简介】
本书围绕“初学者学数据结构为什么难”这一痛点展开,致力于解决学习中常见的“理论抽象、代码晦涩、实践与概念脱节”等问题,提供一条循序渐进、清晰易懂的学习路径。全书以C语言为主要描述语言,系统讲解从线性表、栈与队列、树与二叉树、图,到查找与排序等核心内容;每章都包含概念讲解、代码实现、实例分析以及小结,读者既能用通俗案例建立直观理解,也能直接运行书中经过完整调试的代码,在动手实践中体会不同数据结构的价值。与偏重理论推导的教材不同,本书强调“深入浅出、学以致用”,在关键难点处配合类比、图示与分步提示,帮助读者自然跨越理解障碍。本书适合学习过一门编程语言的读者,包括计算机专业的本科学生、想转行做开发的非专业人员、为计算机专业考研做准备的学生。
【目录】
目录
第1章 前置知识点梳理 / 001
1.1 指针 / 001
1.1.1 指针有什么用 / 001
1.1.2 指针的声明 / 002
1.1.3 指针的赋值 / 002
1.1.4 解引用指针 / 003
1.1.5 指针简单应用:两个变量值的交换 / 004
1.1.6 野指针与空指针 / 006
1.2 动态内存分配 / 007
1.2.1 内存布局 / 007
1.2.2 动态内存分配实现 / 008
1.2.3 二级指针 / 010
1.3 结构体 / 011
1.3.1 结构体的定义 / 012
1.3.2 结构体的初始化与使用 / 012
1.3.3 结构体与指针 / 013
1.3.4 typedef / 014
1.4 本章小结 / 016
第2章 数据结构概述 / 017
2.1 数据与结构 / 017
2.1.1 什么是数据? / 017
2.1.2 什么是结构? / 017
2.2 数据结构中的数据与常规数据的区别 / 018
2.3 数据结构与算法的关系 / 018
2.4 算法分析 / 019
2.4.1 算法的时间复杂度与语句频度 / 020
2.4.2 算法的时间复杂度定义 / 021
2.4.3 *好、*坏和平均时间复杂度 / 022
2.4.4 不同算法时间复杂度举例 / 023
2.4.5 算法的空间复杂度 / 029
2.5 本章小结 / 031
第3章 线性表 / 032
3.1 线性表的顺序表示与实现 / 032
3.1.1 顺序表的结构与表示 / 033
3.1.2 顺序表的基本操作 / 034
3.2 线性表的链式表示与实现 / 043
3.2.1 链表的结构与表示 / 044
3.2.2 单链表 / 045
3.2.3 循环链表 / 058
3.2.4 双向链表 / 064
3.3 顺序表与链表的对比 / 070
3.4 本章小结 / 071
第4章 栈与队列 / 072
4.1 栈的表示与实现 / 072
4.1.1 栈的定义 / 072
4.1.2 栈的顺序结构实现 / 074
4.1.3 栈的链式结构实现 / 080
4.1.4 栈与递归:隐藏在背后的“栈结构” / 084
4.1.5 栈在表达式求值中的应用 / 090
4.2 队列的表示与实现 / 098
4.2.1 队列的定义 / 098
4.2.2 队列的顺序结构实现 / 101
4.2.3 循环队列:解决“假溢出”的优雅方案 / 107
4.2.4 队列的链式结构实现 / 109
4.3 栈与队列的对比 / 114
4.4 本章小结 / 115
第5章 树与二叉树 / 116
5.1 树与二叉树的定义 / 116
5.1.1 树的定义 / 116
5.1.2 二叉树的定义 / 117
5.1.3 特殊二叉树 / 118
5.2 二叉树的实现与遍历 / 120
5.2.1 二叉树的存储结构 / 120
5.2.2 二叉树的遍历 / 123
5.2.3 二叉树的遍历代码实现-递归方式 / 127
5.2.4 二叉树的遍历代码实现-非递归方式 / 128
5.2.5 根据遍历结果推导二叉树 / 133
5.2.6 线索二叉树 / 135
5.3 哈夫曼树 / 141
5.3.1 案例引入 / 142
5.3.2 哈夫曼树的基本概念 / 143
5.3.3 哈夫曼树的定义与构造 / 144
5.3.4 哈夫曼树的代码实现 / 145
5.3.5 哈夫曼编码 / 147
5.4 树、二叉树与森林 / 151
5.4.1 树与二叉树的转换 / 152
5.4.2 森林与二叉树的转换 / 154
5.4.3 树、森林、二叉树的遍历 / 156
5.5 本章小结 / 157
第6章 图 / 158
6.1 图的基本概念 / 159
6.1.1 图的定义 / 159
6.1.2 图的基本术语 / 160
6.2 图的存储结构 / 163
6.2.1 邻接矩阵 / 164
6.2.2 邻接表 / 169
6.2.3 十字链表 / 178
6.2.4 邻接多重表 / 182
6.3 图的遍历 / 184
6.3.1 深度优先遍历 / 185
6.3.2 广度优先遍历 / 189
6.4 *小生成树 / 192
6.4.1 普里姆算法 / 193
6.4.2 克鲁斯卡尔算法 / 198
6.5 *短路径 / 203
6.5.1 迪杰斯特拉算法 / 204
6.5.2 弗洛伊德算法 / 208
6.6 拓扑排序与关键路径 / 212
6.6.1 拓扑排序 / 213
6.6.2 关键路径 / 220
6.7 本章小结 / 230
第7章 查找 / 231
7.1 线性表的查找 / 232
7.1.1 顺序查找 / 233
7.1.2 折半查找 / 234
7.2 二叉排序树 / 236
7.2.1 二叉排序树的查找 / 237
7.2.2 二叉排序树的插入与创建 / 240
7.2.3 二叉排序树的删除 / 243
7.3 平衡二叉树 / 246
7.3.1 平衡二叉树的定义与术语 / 247
7.3.2 平衡二叉树的平衡调整方法 / 248
7.4 B树与B+树 / 254
7.4.1 B树的操作 / 256
7.4.2 B+树 / 263
7.5 散列表 / 264
7.5.1 散列表的相关概念 / 265
7.5.2 散列表函数的构造方法 / 267
7.5.3 散列表处理冲突的方法 / 268
7.5.4 散列表的查找 / 272
7.5.5 散列表平均查找长度的计算 / 272
7.6 本章小结 / 274
第8章 排序 / 275
8.1 简单的排序算法 / 276
8.1.1 冒泡排序 / 276
8.1.2 插入排序 / 279
8.1.3 折半插入排序 / 281
8.1.4 简单选择排序 / 282
8.2 堆与堆排序 / 284
8.3 高效的排序算法 / 289
8.3.1 希尔排序 / 289
8.3.2 归并排序 / 292
8.3.3 快速排序 / 295
8.4 基数排序 / 298
8.5 外部排序 / 302
8.5.1 外部排序基本思路 / 302
8.5.2 多路平衡归并排序 / 305
8.5.3 置换-选择排序 / 307
8.5.4 *佳归并树 / 309
8.6 本章小结 / 310
【前言】
前言
很多同学第*次打开数据结构的教材,都会有一种相同的感觉:明明每个字都认识,连在一起却像“天书”。更让人沮丧的是,你越努力,越觉得自己“不适合学计算机”。但我想先把结论写在前面:数据结构难,并不等于你不行;很多时候,是我们走错了学习路径。
我之所以想写这本《数据结构三重门:强效入门·考研通关·编程实践》,并不是因为我当年学得有多好,恰恰相反,我就是那个曾经听不懂数据结构的人。
1. 我当年为什么听不懂数据结构
回想读书时的经历,我后来把“听不懂”的原因,拆成了三个非常具体的问题:
第*,很多教材写的是伪代码。
伪代码当然有价值,它更抽象、更容易表达算法思想。但对于初学者而言,抽象往往意味着“无处落脚”。你看懂了流程,却不知道如何把它写成能跑的程序;你以为自己懂了,一到写代码就卡住。
第二,课堂上往往不细讲代码。
有的课更强调概念、定义、性质、复杂度推导,而“实现细节”被一句“这个大家课后看看”带过。可对初学者来说,数据结构的灵魂就在实现里:指针怎么连、内存怎么分配、边界怎么处理、错误怎么规避、变量怎么变化……这些不讲清楚,理解就很难稳固。
第三,数据结构的前置要求是 C 语言,但很多同学的 C 语言基础并不牢固。
我当年学 C 语言的时候,老师讲到结构体的时候,一学期就结束了。于是很多在数据结构代码里“理所当然”的语法,对我来说完全陌生:
结构体指针为什么用 ->符号?这是不是伪代码?
动态内存分配是什么?为什么 malloc 看起来像“咒语”?
链表为什么要手动管理内存?
这些疑问没有被及时补齐,后面所有内容都会越学越虚,越学越慌。
后来我在 B 站做课程时,看着评论区和弹幕里一条条“我也是这样”“老师也没讲”“代码看不懂”,我才确认:时至今日,这些问题在不少课堂中仍然存在。
2. 我为什么决定把这门课“重新讲一遍”
2024 年我入职高校,第*次排到数据结构课,那一刻我心里有个很明确的念头:不能让更多同学重复我当年的经历。
所以我给自己定了一个非常“笨”的目标:不靠“讲懂”,要靠“做出来”;不靠“听懂”,要靠“跑通”。
为此,我做了几件当时看起来很费劲,但后来证明非常值得的事:
我认真准备每一章,把抽象过程拆成“能一步步执行”的过程。
我制作更通俗的幻灯片,并尽量用动画把变化过程呈现出来。
我把每一个数据结构、每一种典型算法,都写成可以运行的 C 语言实现,并在课堂上带着同学一起看代码、理解代码、运行代码、观察结果。
我在课程中专门安排了C语言的复习(很多同学其实是“第*次真正学会C语言”),把指针、结构体指针、动态内存分配等关键前置知识补齐,让同学至少能看懂、能调试、能改动。
坦白讲,第*次讲这门课一定有瑕疵:节奏、例子、板书、讲法都需要磨,但让我非常欣慰的是学生的接受度不错。后来我把课程上传到 B 站,又收到了很多超出预期的反馈,播放量也证明,原来有这么多人需要一套“更可落地、更贴近初学者”的数据结构讲法。
我也因此越来越清晰地意识到,市面上许多书对“可实现代码”的重视仍然不够。不少内容写得很系统、很严谨,但对“怎么把它真正写出来”讲得太少。于是我常常想,要是能有一本书,把数据结构写成“能跟着做、能跑通、能调试、能复盘”的样子,该多好。
很凑巧的是,就在这个时候,清华大学出版社的申美莹老师通过 B 站联系到我,问我是否有写书的意愿。
我一直很感激这份邀请,因为那段时间,我的人生正处在很艰难的阶段:
2021 年 9 月我因偏瘫入院,2022 年 3 月出院。工作没了,收入没了,我甚至一度无法正常工作。那段日子里,我*大的任务不是“进步”,而是努力生活、努力活着。我一点点恢复走路,一点点回到讲台。直到今天,我的左手依然无法敲键盘—而这本书中十几万字、上百张图,我几乎都是用右手一点一点完成的。
更困难的其实不是身体,而是心态。生病后,我变得很不自信,甚至可以说是自卑。曾经那个在人群里“闪闪发光”的自己,仿佛被按下了静音键。也正因为如此,我格外感谢那些在我*低谷的时候伸手支持我的人:申美莹老师、出版社的伙伴们、以及 B 站里无数鼓励我、支持我的同学们。
写这本书,对我来说不仅是一次写作任务,更像是一次重新站起来的过程。也因此,我更希望它不是一本“看完就算”的书,而是能真正帮到同学们的书—让数据结构不再是大多数计算机专业同学口中“难啃的骨头”。
3. 我希望它能解决什么问题
如果用一句话概括本书,我想它更像一门可以跟着跑通的课,而不仅是一本写得很对的书。为此,本书有三个我*看重的特点。
特色一:对基础薄弱的同学更友好—先把“门槛”填平
我不会假设你已经掌握了所有 C 语言细节。书中会从指针基础开始,把结构体指针、动态内存分配等关键点讲清楚,因为它们不是可有可无的语法,而是数据结构实现的地基。
我更希望读者的体验是:一路看得懂、一路写得出,而不是一开始就被语法劝退。
特色二:书中代码全部可运行—用实现把理解落地
这本书里出现的代码,我都尽量写成可以直接编译运行的实现,而不是停留在伪代码层面。原因很简单:数据结构不是背出来的,而是写出来的。
当你亲手把链表连起来、把栈和队列跑起来、把树遍历走通、把图的搜索打印出来,你会获得一种非常踏实的理解—这种理解不会因为考试结束而消失,它会变成你写程序时的直觉。
特色三:讲课式的“从0到1”学习路径—过程可视化、强调调试与运行
我希望读者读这本书时,有一种“老师就在旁边带着你学”的感觉:不仅给结论,更给过程;不仅讲是什么,更讲为什么这样写;不仅给代码,更解释变量如何变化、指针如何移动、边界如何处理。
同时我也非常建议你在阅读时打开编译器:跑代码、单步调试、观察变化。很多你在纸面上觉得抽象的内容,会在调试窗口里变得清清楚楚。
4. 你可以怎么用这本书
本书既适合具备一定 C 语言基础、希望入门数据结构的同学,也可以作为高校教材之外的参考书使用。只要你愿意跟着把代码跑起来、把过程走一遍,你会发现:数据结构并没有想象中那么难。
书中也提供了配套课件(PPT / PDF / Keynote)和讲解视频,扫描前言后的二维码可获取资源。你完全可以把它当作“书 + 课”的组合来学:看书 → 跑代码 → 对照课件动画 → 再回到书里复盘,效果会更好。
对于备考的同学来说,这本书也能作为知识点复习的参考资料。只要把核心结构与典型算法真正理解并实现,考试及格并不是难事;而如果你的目标是更扎实的能力(例如考研408 数据结构部分的理解与复盘),本书也可以提供一个更偏实现视角的补充。
5. 如何把数据结构学成会用的能力
为了让你的学习更可执行,这里给出一个非常具体的建议流程(你可以照着做):
(1)先学会“读代码”:遇到看不懂的语法别硬扛,回到前置内容把指针、结构体指针、动态内存分配等知识补齐。
(2)每一章至少跑通一次代码:不要只看结果,要能解释每一步在做什么。
(3)用调试器看过程:单步走、看变量变化,看指针指向哪里,看内存什么时候分配、什么时候释放。
(4)做一点点改造:比如改接口、加一个功能、换一组测试数据。只要能改动,说明你真的掌握了。
(5)*后再去做题:做题是检验理解是否真实的*好方式。很多时候我们“以为懂了”,题目会告诉你其实还差哪一步。
6. 学完本书,你应当具备的能力(给自己一个可检验的目标)
当你认真学完并消化本书的知识后,我希望你至少能做到:
能用 C 语言实现并调试常见线性结构(顺序/链式思维),理解指针与动态内存管理在其中的作用。
能独立实现并使用栈、队列解决典型问题(例如表达式求值等“过程型”问题),能把“抽象规则”写成“可运行程序”。
能写出树与图相关的核心操作与典型算法的基本实现,并能解释其执行过程。
能在题目或实际编程中,知道什么时候该用哪种结构,并能进行基本的时间复杂度分析。
能把数据结构当作编程能力的一部分,而不是考试前的短期记忆。
写到这里,我想再重复一次我*想对读者说的话:如果你曾经在数据结构面前感到挫败,这不是你的问题。你需要的往往不是更聪明,而是一条更清晰、更落地的学习路径。
希望这本书和配套课程,能成为那条路上的一盏灯。也祝你在学习数据结构的过程中,慢一点、稳一点,但每一步都算数。
— 孙逊
2026年4月
以下为对购买帮助不大的评价