Data Structure
1.0.0
本項目中的源碼與教材《數據結構-C語言版》[嚴蔚敏,吳偉民版]以及《數據結構題集-C語言版》[嚴蔚敏,吳偉民,米寧版]配套。
| 數據結構教材 | 數據結構題集 |
|---|---|
![]() | ![]() |
本項目包含了教材源碼跟習題源碼,並分為4個版本,分別是: CFree 、 Dev-C++ 、 CLion 、 VisualC++ ,其中:
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++ 、 CLion 、 VisualC++這三個版本中的源碼。
注:
1. "CFree"是完整版本。"Dev-C++"/"CLion"/"VisualC++"是新增的版本,这三个版本最终会取代"CFree"版本。
2. "CFree"版本既可以用CFree直接打开,也支持用Dev-C++打开,所以当使用CFree遇到兼容问题时,可尝试用Dev-C++。
3. 上述四个版的代码是同步更新的,但是各版本之间相互独立,没有任何依赖关系,允许单独运行/测试。
4. 对所有版本的代码均未充分测试,尤其是很多代码没有完成的边界检查(原因是此处以实现算法正确性为目的,而较少考虑程序的健壮性),所以如有BUG请到Issues反馈。
總的目標是保障正確性,提高可讀性,降低學習難度,具體來說包含以下幾點:
將源碼克隆/下載到本地後,可以查看各分支內的README文件以獲取幫助信息

| 序號 | emoji | 在本項目中的含義 | 簡寫標記 |
|---|---|---|---|
| (0) | ? | 初始化項目 | :tada: |
| (1) | 更新文檔,包括但不限於README | :memo: | |
| (2) | 發布新的源碼 | :bulb: | |
| (3) | ♻️ | 重構,主要指修改已有的源碼與註釋 | :recycle: |
| (4) | ✏️ | 校對,主要指更正錯別字、修改源碼排版、更新註釋等 | :pencil2: |
| (5) | ? | 修復代碼中的BUG | :bug: |
個人博客
Commit信息中的emoji參考來源:
| 章 | 節 | 內容 | 包含算法 | 備註 |
|---|---|---|---|---|
| 01 緒論 | Status | 定義一些共享常量和函數 | ||
| 02 線性表 | SqList | 順序表 | 2.3、2.4、2.5、2.6 | 線性表的順序存儲結構 |
| Union | A=A∪B | 2.1 | ||
| MergeSqList | C=A+B | 2.2、2.7 | 歸併順序表 | |
| LinkList | 鍊錶 | 2.8、2.9、2.10、2.11 | 線性表的鍊式存儲結構 | |
| MergeList | C=A+B | 2.12 | 歸併鍊錶 | |
| SLinkList | 靜態鍊錶 | 2.13、2.14、2.15、2.16 | ||
| Difference | (AB)∪(BA) | 2.17 | ||
| DuLinkList | 雙向循環鍊錶 | 2.18、2.19 | ||
| ELinkList | 擴展的線性鍊錶 | 2.20 | ||
| MergeEList | C=A+B | 2.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 | 塊鏈串 | 順序存儲+鍊式存儲 | ||
| KMP | KMP算法 | 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 | 廣義表 | 擴展線性鍊錶存儲表示 | ||
| MPList | m元多項式 | 鍊式存儲 | ||
| 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 | ||
| NQueens | N皇后問題 | 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.9 | Prim算法和Kruskal算法 | |
| ArticulationPoints | 無向圖的關節點 | 7.10、7.11 | ||
| TopologicalSorting | AOV-網的拓撲排序 | 7.12 | 有向圖 | |
| CriticalPathMethod | AOE-網的關鍵路徑 | 7.13、7.14 | 有向網 | |
| ShortestPaths | 最短路徑算法 | 7.15、7.16 | Dijkstra算法和Floyd算法 | |
| 08 動態存儲管理 | BoundaryTagMethod | 邊界標識法 | 8.1 | |
| BuddySystem | 夥伴系統 | 8.2 | ||
| GarbageCollection | 無用單元收集 | 8.3 | 無棧遍歷廣義表 |