Home

Awesome

《数据结构》课本源码与习题解析

项目介绍

本项目中的源码与教材《数据结构-C语言版》[严蔚敏,吴伟民版]以及《数据结构题集-C语言版》[严蔚敏,吴伟民,米宁版]配套。

数据结构教材数据结构题集
数据结构教材数据结构题集

项目结构

本项目包含了教材源码习题源码,并分为4个版本,分别是:CFreeDev-C++CLionVisualC++,其中:

IDE的选择

CFree是一个优秀的国产软件,麻雀虽小五脏俱全,非常适合新手使用。不过该产品早已停更,在win10上有些兼容问题,需要调教。

Dev-C++是一个开源软件,同CFree一样小巧实用。最关键的是,可以兼容win10,推荐使用。

CLion需要掌握一点cmake知识,对笔记本性能要求也略高。不过JetBrains系列的产品,功能优秀没得说,强烈建议尝试。

Microsoft Visual C++是微软出品,该系列号称地表最强,不过复杂度也是很高,对于新手并不友好,需要耐心琢磨。如果将来不是走C/C++/C#等路线,可以先不使用。(注:从2018年开始,计算机二级C语言项目的考试中,已将VC++6换成了Microsoft Visual C++ 2010。所以如果有考级需求的同学,请自行熟悉该IDE)

习题解析中存储了《数据结构题集》中非代码题的解析,对于需要写代码解决的问题,参见 Dev-C++CLionVisualC++ 这三个版本中的源码。

注:
1. "CFree"是完整版本。"Dev-C++"/"CLion"/"VisualC++"是新增的版本,这三个版本最终会取代"CFree"版本。    
2. "CFree"版本既可以用CFree直接打开,也支持用Dev-C++打开,所以当使用CFree遇到兼容问题时,可尝试用Dev-C++。    
3. 上述四个版的代码是同步更新的,但是各版本之间相互独立,没有任何依赖关系,允许单独运行/测试。    
4. 对所有版本的代码均未充分测试,尤其是很多代码没有完成的边界检查(原因是此处以实现算法正确性为目的,而较少考虑程序的健壮性),所以如有BUG请到Issues反馈。    

更新目标

总的目标是保障正确性,提高可读性,降低学习难度,具体来说包含以下几点:

  1. ★★★项目工程化。
  2. 修复一些已知/潜在的BUG。
  3. 简化源码之间的引用关系,争取每个模块都可以单独运行测试。
  4. 修剪被引用源码中的次要内容,使得焦点更聚集,重点更突出。
  5. 增加注释与帮助信息,使源码展示更友好。
  6. 出自教材中的算法,会尽量使其代码与教材一致,如有改动,会在注释中提示。其它算法会视情形书写,不唯一。
  7. 修改部分被引入的结构,这一点需要视不同题目的要求而定;大多数被引入的结构会原封不动地保留下来。

使用方式

将源码克隆/下载到本地后,可以查看各分支内的 README 文件以获取帮助信息

注意事项

  1. 本内容仅限个人学习使用,未经作者许可,不得用于商业用途
  2. 源码仅供参考,别抄作业
  3. 欢迎Star项目,并鼓励在Github提交Issues来反馈问题,在博客上发私信未必可以及时看到
    github

Commit图例

序号emoji在本项目中的含义简写标记
(0):tada:初始化项目:tada:
(1):memo:更新文档,包括但不限于README:memo:
(2):bulb:发布新的源码:bulb:
(3):recycle:重构,主要指修改已有的源码与注释:recycle:
(4):pencil2:校对,主要指更正错别字、修改源码排版、更新注释等:pencil2:
(5):bug:修复代码中的BUG:bug:

相关链接

个人博客

脚注

Commit信息中的emoji参考来源:

附:教材源码目录

内容包含算法备注
01 绪论Status定义一些共享常量和函数
02 线性表SqList顺序表2.3、2.4、2.5、2.6线性表的顺序存储结构
UnionA=A∪B2.1
MergeSqListC=A+B2.2、2.7归并顺序表
LinkList链表2.8、2.9、2.10、2.11线性表的链式存储结构
MergeListC=A+B2.12归并链表
SLinkList静态链表2.13、2.14、2.15、2.16
Difference(A-B)∪(B-A)2.17
DuLinkList双向循环链表2.18、2.19
ELinkList扩展的线性链表2.20
MergeEListC=A+B2.21归并扩展的线性链表
Polynomial一元多项式2.22、2.23
03 栈和队列SqStack顺序存储结构
Conversion进制转换3.1栈的应用
LineEdit行编辑程序3.2栈的应用
Maze迷宫寻路3.3栈的应用
Expression表达式求值3.4栈的应用
Hanoi汉诺塔3.5递归
LinkQueue链列链式存储结构
SqQueue顺序队列循环队列,顺序存储结构
BankQueuing模拟银行排队3.6、3.7队列的应用
04 串SString顺序串4.1、4.2、4.3、4.5顺序存储
HString堆串4.4顺序存储,动态分配内存
LString块链串顺序存储+链式存储
KMPKMP算法4.6、4.7、4.8字符串匹配算法
WordList关键词索引4.9、4.10、4.11、4.12、4.13、4.14堆串和线性表的应用
05 数组和广义表Array多维数组
TSMatrix稀疏矩阵5.1、5.2三元组顺序表存储方式
RLSMatrix稀疏矩阵5.3行逻辑链接的顺序表存储方式
CrossList稀疏矩阵5.4十字链表存储方式
GList-HT广义表5.5、5.6、5.7、5.8头尾链表存储表示
GList-E广义表扩展线性链表存储表示
MPListm元多项式链式存储
06 树和二叉树SqBiTree二叉树顺序存储结构
BiTree二叉树的二叉链表存储结构6.1、6.2、6.3、6.4
BiTriTree二叉树的三叉链表存储结构
BiThrTree线索二叉树6.5、6.6、6.7
PTree树的双亲表存储表示
CTree树的孩子链表(带双亲)的存储表示
CSTree树的二叉链表(孩子-兄弟)结构存储表示
MFSet集合6.8、6.9、6.10、6.11
HuffmanTree赫夫曼树6.12、6.13又称"哈夫曼树"
PowerSet冪集6.14/6.15
NQueensN皇后问题6.16
07 图MGraph图的邻接矩阵存储7.1、7.2、7.4、7.5、7.6有向图、有向网、无向图、无向网
ALGraph图的邻接表存储有向图、有向网、无向图、无向网
OLGraph图的十字链表存储7.3有向图、有向网、无向图、无向网
AMLGraph图的邻接多重表存储无向图、无向网
SpanningTree无向图的生成树7.7、7.8深度优先生成树
StronglyConnectedComponents有向图强连通分量Kosaraju算法和Tarjan算法
MinimumSpanningTree无向网的最小生成树7.9Prim算法和Kruskal算法
ArticulationPoints无向图的关节点7.10、7.11
TopologicalSortingAOV-网的拓扑排序7.12有向图
CriticalPathMethodAOE-网的关键路径7.13、7.14有向网
ShortestPaths最短路径算法7.15、7.16Dijkstra算法和Floyd算法
08 动态存储管理BoundaryTagMethod边界标识法8.1
BuddySystem伙伴系统8.2
GarbageCollection无用单元收集8.3无栈遍历广义表