數據結構——C++語言描述

數據結構——C++語言描述

《數據結構——C++語言描述》是2020年1月電子工業出版社出版的圖書,作者是陳慧南。

基本介紹

  • 書名:數據結構——C++語言描述
  • 作者:陳慧南
  • ISBN:9787121366321
  • 頁數:336
  • 定價:¥59.8
  • 出版社:電子工業出版社
  • 出版時間:2020年1月
  • 開本:16
內容簡介,目錄,

內容簡介

作者依據ACM/IEEE的《計算機科學課程體系規範2013》,參考了近年來國內外很多優秀教材,對《數據結構——使用C++語言描述》一書從教材結構和內容方面都做了很大調整,編寫了本教材。本次編寫保留了經典數據結構和算法知識,引入更多高級數據結構的內容。本教材重視問題求解,反映抽象、封裝和信息隱蔽等現代故姜灶軟體設計理念,重視算法的時間和空間分析,包括查找和排序時間的下界分析。數據結構和算法使用C++語言描述。本教材重視實踐性和程式設計。書中算法都有完整的C++程式,構思精巧、結構清晰、注釋詳細,並且所有程式都已在VC++環境下編譯通過並能正確運行。它們台紋葛既是很好的學習數據結構和算法的示例,也是很好的C++程式設計示例。本教材配有大量的實例和殼章炒圖示,並有豐富的習題和實習題,易教易學。本教材涵蓋計算機學科專業考研大綱數據結構部分的考查內容。

目錄

第1章 概論 1
1.1 問題求解方法 1
1.1.1 問題和問題求解 1
1.1.2 問題求解過程 1
1.1.3 計算機求解臘拘問題的過程 2
1.2 什麼是數據結構 2
1.2.1 算法與數據結構 2
1.2.2 數據結構基本概念 3
1.2.3 數據的邏輯結構 4
1.2.4 數據的存儲表示 5
1.2.5 數據結構的操作 6
1.3 數據抽象和抽象數據類型 7
1.3.1 數據抽象和過程抽象 7
1.3.2 模組化、封裝與信息隱蔽 7
1.3.3 數據類型和抽象數據類型 8
1.4.1 面向對象方法的由來 10
1.4.2 面向對象方法的基本思想 10
1.4.3 面向對象方法的基本要素 11
1.4.4 抽象數據類型和面向對象方法 12
1.4.5 C++語言對抽象數據類型的支持 13
1.5 描述數據結構和算法 13
1.5.1 數據結構的規範 13
1.5.2 實現數據結構 14
1.6 算法分析的基本方法 15
1.6.1 算法及其性能標準 15
1.6.2 算法的時間複雜度 16
1.6.3 漸近時間複雜度 18
1.6.4 最好、最壞和平均情況時間複雜度 19
1.6.5 算法按時間複雜度分類 19
1.6.6 算法的空間複雜度 19
本章小結 20
習題1 20
第2章 數組和鍊表 22
2.1 兩種基本的存儲表示方式 22
2.2 結構和類 22
2.2.1 結構 22
2.2.2 結構表示元素 23
2.3 指針和動態存儲分配 24
2.3.1 指碑埋肯凳針 24
2.3.2 動態存儲分配 25
2.3.3 靜態變數和動態變數 26
2.4 數組 26
2.4.1 一維數組 26
2.4.2 二維數組 27
2.4.3 多維數組 28
2.4.4 數驗葛乎組和指針 28
2.4.5 固定長度數組和可變長度數組 28
2.5 鍊表 29
2.5.1 指向結構的指針 30
2.5.2 單鍊表 30
2.5.3 帶表頭結點煮船罪舟的單鍊表 33
2.5.4 單循環鍊表 33
2.5.5 雙向鍊表 33
2.6 採用模擬指針的鍊表 35
2.6.1 結點結構 35
2.6.2 可用空間表 35
2.7 異常處理 37
本章小結 38
習題2 38
第3章 棧和佇列 40
3.1 棧 40
3.1.1 棧ADT 40
3.1.2 棧的順序表示 41
3.1.3 棧的連結表示 44
3.2 佇列 47
3.2.1 佇列ADT 47
3.2.2 佇列的順序表示 48
3.2.3 佇列的連結表示 51
3.3 表達式計算 51
3.3.1 表達式 51
3.3.2 中綴表達式轉換為後綴表達式 52
3.3.3 計算後綴表達式的值 55
3.4 演示與測試 58
本章小結 61
習題3 61
第4章 遞歸 63
4.1 遞歸和遞歸算法 63
4.1.1 遞歸的概念 63
4.1.2 遞歸算法示例 64
4.2 歸納證明 66
4.3 遞推關係 67
4.4 實現遞歸 67
4.4.1 函式調用和系統棧 68
4.4.2 遞歸函式的性能 69
4.4.3 尾遞歸 69
4.4.4 消去遞歸 70
本章小結 70
習題4 70
第5章 線性表和串 72
5.1 線性表 72
5.1.1 線性表ADT 72
5.1.2 線性表的順序表示 73
5.1.3 線性表的連結表示 76
5.1.4 兩種存儲表示的比較 79
5.2 一元多項式算術運算 80
5.2.1 多項式ADT 80
5.2.2 多項式的連結表示 80
5.2.3 項結點類 81
5.2.4 多項式類 82
5.2.5 多項式的輸入和輸出 83
5.2.6 多項式相加 84
5.2.7 多項式相乘 85
5.2.8 重載運算符 86
5.3 串 86
5.3.1 串ADT 86
5.3.2 串的存儲表示 87
5.3.3 串運算的實現 88
5.3.4 簡單模式匹配算法 89
5.3.5 KMP算法 91
本章小結 95
習題5 95
第6章 數組和廣義表 97
6.1 數組作為抽象數據類型 97
6.1.1 數組ADT 97
6.1.2 一維數組的C++類 98
6.2 矩陣 99
6.2.1 矩陣的概念 99
6.2.2 矩陣ADT 99
6.2.3 矩陣的二維數組表示 100
6.3 特殊矩陣 101
6.3.1 對稱矩陣 101
6.3.2 帶狀矩陣 102
6.4 稀疏矩陣 103
6.4.1 稀疏矩陣的三元組表 103
6.4.2 稀疏矩陣轉置 105
6.4.3 稀疏矩陣相加 107
6.4.4 稀疏矩陣相乘 108
6.5 稀疏矩陣的正交鍊表 109
6.5.1 正交鍊表結構 109
6.5.2 正交鍊表結點類 110
6.5.3 正交鍊表類 111
6.5.4 建立正交鍊表 111
6.5.5 輸出正交鍊表 113
6.6 廣義表 113
6.6.1 廣義表的概念 113
6.6.2 廣義表ADT 114
6.6.3 廣義表的存儲表示 115
6.6.4 廣義表算法 116
本章小結 116
習題6 117
第7章 樹 118
7.1 樹的基本概念 118
7.1.1 樹的定義 118
7.1.2 基本術語 119
7.2 二叉樹 120
7.2.1 二叉樹的定義 120
7.2.2 二叉樹的性質 121
7.2.3 二叉樹ADT 122
7.2.4 二叉樹的存儲表示 123
7.2.5 二叉樹類 123
7.2.6 實現二叉樹的基本操作 124
7.3 二叉樹的遍歷 126
7.3.1 二叉樹遍歷算法 126
7.3.2 二叉樹遍歷的遞歸算法 128
7.3.3 二叉樹遍歷的套用實例 129
7.4 二叉樹遍歷的非遞歸算法 131
7.4.1 遍歷器類 131
7.4.2 中序遍歷器類 132
7.4.3 後序遍歷器類 134
7.5 二叉線索樹 136
7.5.1 二叉線索樹的定義 136
7.5.2 構造中序線索樹 137
7.5.3 遍歷中序線索樹 138
7.6 樹和森林 139
7.6.1 森林與二叉樹的轉換 139
7.6.2 樹和森林的存儲表示 141
7.6.3 樹和森林的遍歷 142
本章小結 143
習題7 143
第8章 樹的套用 145
8.1 堆 145
8.1.1 堆的定義 145
8.1.2 堆的順序表示 145
8.1.3 向下調整和建堆操作 145
8.2 優先權佇列 147
8.2.1 優先權佇列ADT 147
8.2.2 優先權佇列類 148
8.2.3 實現優先權佇列 148
8.3 哈夫曼樹和哈夫曼編碼 150
8.3.1 樹的路徑長度 151
8.3.2 哈夫曼算法 152
8.3.3 哈夫曼樹類 152
8.3.4 構造哈夫曼樹 153
8.3.5 哈夫曼編碼 155
8.3.6 哈夫曼編碼算法 156
8.4 並查集和等價關係 156
8.4.1 並查集ADT 157
8.4.2 並查集的存儲表示 157
8.4.3 並查集類 158
8.4.4 Union和Find函式 159
8.4.5 改進的Union和Find函式 159
8.4.6 按等價關係分組 160
本章小結 161
習題8 161
第9章 字典和查找 162
9.1 字典及其表示 162
9.1.1 字典 162
9.1.2 字典查找 163
9.1.3 字典ADT 163
9.1.4 字典的存儲表示 164
9.2 順序查找 165
9.2.1 無序表的順序查找 165
9.2.2 有序表的順序查找 165
9.2.3 平均查找長度 166
9.2.4 自組織表 166
9.3 二分查找 167
9.3.1 二分查找算法 167
9.3.2 對半查找算法 168
9.3.3 二叉判定樹 169
9.3.4 斐波那契查找算法 170
9.3.5 插值查找 172
9.4 分塊查找 172
9.5 查找算法的時間複雜度下界 173
本章小結 174
習題9 174
第10章 二叉查找樹 175
10.1 二叉查找樹表示字典 175
10.1.1 二叉查找樹的定義 175
10.1.2 二叉查找樹的查找操作 176
10.1.3 二叉查找樹的插入操作 177
10.1.4 二叉查找樹的刪除操作 178
10.1.5 二叉查找樹的高度 179
10.2 二叉平衡樹 179
10.2.1 二叉平衡樹的定義 179
10.2.2 二叉平衡樹類 180
10.2.3 二叉平衡樹的平衡旋轉 181
10.2.4 二叉平衡樹的插入操作 185
10.2.5 二叉平衡樹的刪除操作 187
10.2.6 二叉平衡樹的高度 189
10.3 伸展樹 190
10.3.1 自調節樹和伸展樹 190
10.3.2 伸展樹的伸展操作 191
10.3.3 伸展樹類 193
10.3.4 旋轉的實現 193
10.3.5 伸展樹的插入操作 194
10.3.6 分攤時間分析 195
10.4 紅黑樹 195
10.4.1 紅黑樹的定義 195
10.4.2 紅黑樹的查找操作 196
10.4.3 紅黑樹的插入操作 196
10.4.4 紅黑樹的刪除操作 198
10.4.5 紅黑樹的高度 199
本章小結 199
習題10 199
第11章 多叉查找樹 201
11.1 m叉查找樹 201
11.2 B?樹 202
11.2.1 B?樹的定義 203
11.2.2 B?樹的高度 203
11.2.3 B?樹的查找操作 203
11.2.4 B?樹的插入操作 204
11.2.5 B?樹的刪除操作 206
11.2.6 B?樹類 207
11.2.7 B?樹的查找操作 208
11.2.8 B?樹的插入函式 209
11.2.9 B?樹的刪除函式 210
11.3 鍵樹 212
11.3.1 鍵樹的定義 212
11.3.2 雙鏈樹 213
11.3.3 Trie樹 214
11.3.4 Trie樹的查找操作 216
11.3.5 Trie樹的插入操作 216
11.3.6 Trie樹的刪除操作 217
11.3.7 Trie樹性能分析 217
本章小結 218
習題11 218
第12章 跳表和散列表 219
12.1 跳表 219
12.1.1 跳表的概念 219
12.1.2 跳表類 221
12.1.3 跳表的查找函式 222
12.1.4 跳表的插入函式 223
12.1.5 跳表的刪除函式 224
12.1.6 性能分析 224
12.2 散列表 224
12.2.1 散列技術 225
12.2.2 散列函式 226
12.2.3 拉鏈法 227
12.2.4 開地址法 228
12.2.5 線性探查法 228
12.2.6 其他開地址法 231
12.2.7 性能分析 233
本章小結 233
習題12 234
第13章 圖 235
13.1 圖的基本概念 235
13.1.1 圖的定義與術語 235
13.1.2 圖的抽象數據類型 237
13.2 圖的存儲結構 238
13.2.1 圖的矩陣表示 238
13.2.2 圖的鄰接矩陣實現 239
13.2.3 圖的鄰接表表示 241
13.2.4 圖的鄰接表實現 242
13.2.5 有向圖的正交鍊表表示 245
13.2.6 無向圖的鄰接多重表表示 245
13.3 圖的遍歷 246
13.3.1 擴充的圖類 246
13.3.2 深度優先遍歷 247
13.3.3 廣度優先遍歷 248
13.3.4 基本遍歷方法 249
13.4 拓撲排序 250
13.4.1 AOV網路 250
13.4.2 拓撲排序算法 252
13.4.3 拓撲排序算法實現 252
13.5 關鍵路徑 254
13.5.1 AOE網 254
13.5.2 關鍵路徑算法 255
13.5.3 關鍵路徑算法實現 257
13.6 最小代價生成樹 258
13.6.1 基本概念 258
13.6.2 普里姆算法 258
13.6.4 算法正確性 262
13.7 單源最短路徑 262
13.7.1 最短路徑問題 262
13.7.3 數據結構選擇 263
13.7.4 迪傑斯特拉算法實現 264
13.8 所有頂點之間的最短路徑 266
13.8.2 弗洛伊德算法實現 267
本章小結 268
習題13 268
第14章 內排序 270
14.1 基本概念 270
14.2 插入排序 271
14.2.1 直接插入排序 271
14.2.2 順序表的直接插入排序 272
14.2.3 單鍊表的直接插入排序 273
14.2.4 希爾排序 274
14.2.5 對半插入排序 276
14.3 選擇排序 276
14.3.1 簡單選擇排序 276
14.3.2 堆排序 277
14.4 交換排序 278
14.4.1 冒泡排序 278
14.4.2 快速排序 280
14.4.3 快速排序性能分析 281
14.5 兩路合併排序 283
14.5.1 合併兩個有序序列 284
14.5.2 兩路合併排序疊代算法 284
14.5.3 兩路合併排序遞歸算法 285
14.5.4 單鍊表兩路合併排序 285
14.6 排序算法的時間複雜度下界 287
14.7 基數排序 288
14.7.1 分配排序 289
14.7.2 基數排序算法 289
14.7.3 基數排序實現 290
本章小結 292
習題14 292
第15章 檔案和外排序 294
15.1 輔助存儲器簡介 294
15.1.1 主存儲器和輔助存儲器 294
15.1.2 磁碟存儲器 294
15.2 檔案 295
15.2.1 檔案的基本概念 295
15.2.2 檔案的組織方式 296
15.3 檔案的索引結構 298
15.3.1 靜態索引結構 298
15.3.2 動態索引結構 299
15.4 外排序 300
15.4.1 外排序的基本過程 300
15.4.2 初始遊程的生成 300
15.4.3 多路合併 302
15.4.4 最佳合併樹 304
本章小結 304
習題15 305
第16章 實習指導和實習題 306
16.1 實習目的、要求和步驟 306
16.2 面向對象表示法 307
16.3 實習報告和範例 308
16.3.1 實習報告 308
16.3.2 實習題範例 309
16.3.3 實習報告範例 309
16.4 實習題 312
實習1 C++語言的類及模板的使用 312
實習2 數組和鍊表操作 313
實習3 棧、佇列及表達式計算 313
實習4 線性表的操作及套用 314
實習5 一元多項式的相加和相乘 314
實習6 對稱矩陣和稀疏矩陣的 壓縮存儲 315
實習7 字元串操作和文本 處理 315
實習8 二叉樹操作和哈夫曼編碼 315
實習9 有序表查找 316
實習10 B?樹檢索 317
實習11 散列表查找 317
實習12 圖的操作及套用 318
實習13 內排序算法及其性能比較 318
實習14 置換選擇和K路合併的 外排序算法 318
附錄A 程式測試和調試 319
A.1 面向對象程式測試 319
A.2 程式測試步驟 319
A.3 測試方法 320
A.4 程式調試 321
附錄B 2019年計算機考研大綱與教材內容對照 323
B.1 2019年計算機考研大綱 323
B.2 教材內容對2019年計算機考研大綱的適應性 324
參考文獻 326,
第1章 概論 1
1.1 問題求解方法 1
1.1.1 問題和問題求解 1
1.1.2 問題求解過程 1
1.1.3 計算機求解問題的過程 2
1.2 什麼是數據結構 2
1.2.1 算法與數據結構 2
1.2.2 數據結構基本概念 3
1.2.3 數據的邏輯結構 4
1.2.4 數據的存儲表示 5
1.2.5 數據結構的操作 6
1.3 數據抽象和抽象數據類型 7
1.3.1 數據抽象和過程抽象 7
1.3.2 模組化、封裝與信息隱蔽 7
1.3.3 數據類型和抽象數據類型 8
1.4.1 面向對象方法的由來 10
1.4.2 面向對象方法的基本思想 10
1.4.3 面向對象方法的基本要素 11
1.4.4 抽象數據類型和面向對象方法 12
1.4.5 C++語言對抽象數據類型的支持 13
1.5 描述數據結構和算法 13
1.5.1 數據結構的規範 13
1.5.2 實現數據結構 14
1.6 算法分析的基本方法 15
1.6.1 算法及其性能標準 15
1.6.2 算法的時間複雜度 16
1.6.3 漸近時間複雜度 18
1.6.4 最好、最壞和平均情況時間複雜度 19
1.6.5 算法按時間複雜度分類 19
1.6.6 算法的空間複雜度 19
本章小結 20
習題1 20
第2章 數組和鍊表 22
2.1 兩種基本的存儲表示方式 22
2.2 結構和類 22
2.2.1 結構 22
2.2.2 結構表示元素 23
2.3 指針和動態存儲分配 24
2.3.1 指針 24
2.3.2 動態存儲分配 25
2.3.3 靜態變數和動態變數 26
2.4 數組 26
2.4.1 一維數組 26
2.4.2 二維數組 27
2.4.3 多維數組 28
2.4.4 數組和指針 28
2.4.5 固定長度數組和可變長度數組 28
2.5 鍊表 29
2.5.1 指向結構的指針 30
2.5.2 單鍊表 30
2.5.3 帶表頭結點的單鍊表 33
2.5.4 單循環鍊表 33
2.5.5 雙向鍊表 33
2.6 採用模擬指針的鍊表 35
2.6.1 結點結構 35
2.6.2 可用空間表 35
2.7 異常處理 37
本章小結 38
習題2 38
第3章 棧和佇列 40
3.1 棧 40
3.1.1 棧ADT 40
3.1.2 棧的順序表示 41
3.1.3 棧的連結表示 44
3.2 佇列 47
3.2.1 佇列ADT 47
3.2.2 佇列的順序表示 48
3.2.3 佇列的連結表示 51
3.3 表達式計算 51
3.3.1 表達式 51
3.3.2 中綴表達式轉換為後綴表達式 52
3.3.3 計算後綴表達式的值 55
3.4 演示與測試 58
本章小結 61
習題3 61
第4章 遞歸 63
4.1 遞歸和遞歸算法 63
4.1.1 遞歸的概念 63
4.1.2 遞歸算法示例 64
4.2 歸納證明 66
4.3 遞推關係 67
4.4 實現遞歸 67
4.4.1 函式調用和系統棧 68
4.4.2 遞歸函式的性能 69
4.4.3 尾遞歸 69
4.4.4 消去遞歸 70
本章小結 70
習題4 70
第5章 線性表和串 72
5.1 線性表 72
5.1.1 線性表ADT 72
5.1.2 線性表的順序表示 73
5.1.3 線性表的連結表示 76
5.1.4 兩種存儲表示的比較 79
5.2 一元多項式算術運算 80
5.2.1 多項式ADT 80
5.2.2 多項式的連結表示 80
5.2.3 項結點類 81
5.2.4 多項式類 82
5.2.5 多項式的輸入和輸出 83
5.2.6 多項式相加 84
5.2.7 多項式相乘 85
5.2.8 重載運算符 86
5.3 串 86
5.3.1 串ADT 86
5.3.2 串的存儲表示 87
5.3.3 串運算的實現 88
5.3.4 簡單模式匹配算法 89
5.3.5 KMP算法 91
本章小結 95
習題5 95
第6章 數組和廣義表 97
6.1 數組作為抽象數據類型 97
6.1.1 數組ADT 97
6.1.2 一維數組的C++類 98
6.2 矩陣 99
6.2.1 矩陣的概念 99
6.2.2 矩陣ADT 99
6.2.3 矩陣的二維數組表示 100
6.3 特殊矩陣 101
6.3.1 對稱矩陣 101
6.3.2 帶狀矩陣 102
6.4 稀疏矩陣 103
6.4.1 稀疏矩陣的三元組表 103
6.4.2 稀疏矩陣轉置 105
6.4.3 稀疏矩陣相加 107
6.4.4 稀疏矩陣相乘 108
6.5 稀疏矩陣的正交鍊表 109
6.5.1 正交鍊表結構 109
6.5.2 正交鍊表結點類 110
6.5.3 正交鍊表類 111
6.5.4 建立正交鍊表 111
6.5.5 輸出正交鍊表 113
6.6 廣義表 113
6.6.1 廣義表的概念 113
6.6.2 廣義表ADT 114
6.6.3 廣義表的存儲表示 115
6.6.4 廣義表算法 116
本章小結 116
習題6 117
第7章 樹 118
7.1 樹的基本概念 118
7.1.1 樹的定義 118
7.1.2 基本術語 119
7.2 二叉樹 120
7.2.1 二叉樹的定義 120
7.2.2 二叉樹的性質 121
7.2.3 二叉樹ADT 122
7.2.4 二叉樹的存儲表示 123
7.2.5 二叉樹類 123
7.2.6 實現二叉樹的基本操作 124
7.3 二叉樹的遍歷 126
7.3.1 二叉樹遍歷算法 126
7.3.2 二叉樹遍歷的遞歸算法 128
7.3.3 二叉樹遍歷的套用實例 129
7.4 二叉樹遍歷的非遞歸算法 131
7.4.1 遍歷器類 131
7.4.2 中序遍歷器類 132
7.4.3 後序遍歷器類 134
7.5 二叉線索樹 136
7.5.1 二叉線索樹的定義 136
7.5.2 構造中序線索樹 137
7.5.3 遍歷中序線索樹 138
7.6 樹和森林 139
7.6.1 森林與二叉樹的轉換 139
7.6.2 樹和森林的存儲表示 141
7.6.3 樹和森林的遍歷 142
本章小結 143
習題7 143
第8章 樹的套用 145
8.1 堆 145
8.1.1 堆的定義 145
8.1.2 堆的順序表示 145
8.1.3 向下調整和建堆操作 145
8.2 優先權佇列 147
8.2.1 優先權佇列ADT 147
8.2.2 優先權佇列類 148
8.2.3 實現優先權佇列 148
8.3 哈夫曼樹和哈夫曼編碼 150
8.3.1 樹的路徑長度 151
8.3.2 哈夫曼算法 152
8.3.3 哈夫曼樹類 152
8.3.4 構造哈夫曼樹 153
8.3.5 哈夫曼編碼 155
8.3.6 哈夫曼編碼算法 156
8.4 並查集和等價關係 156
8.4.1 並查集ADT 157
8.4.2 並查集的存儲表示 157
8.4.3 並查集類 158
8.4.4 Union和Find函式 159
8.4.5 改進的Union和Find函式 159
8.4.6 按等價關係分組 160
本章小結 161
習題8 161
第9章 字典和查找 162
9.1 字典及其表示 162
9.1.1 字典 162
9.1.2 字典查找 163
9.1.3 字典ADT 163
9.1.4 字典的存儲表示 164
9.2 順序查找 165
9.2.1 無序表的順序查找 165
9.2.2 有序表的順序查找 165
9.2.3 平均查找長度 166
9.2.4 自組織表 166
9.3 二分查找 167
9.3.1 二分查找算法 167
9.3.2 對半查找算法 168
9.3.3 二叉判定樹 169
9.3.4 斐波那契查找算法 170
9.3.5 插值查找 172
9.4 分塊查找 172
9.5 查找算法的時間複雜度下界 173
本章小結 174
習題9 174
第10章 二叉查找樹 175
10.1 二叉查找樹表示字典 175
10.1.1 二叉查找樹的定義 175
10.1.2 二叉查找樹的查找操作 176
10.1.3 二叉查找樹的插入操作 177
10.1.4 二叉查找樹的刪除操作 178
10.1.5 二叉查找樹的高度 179
10.2 二叉平衡樹 179
10.2.1 二叉平衡樹的定義 179
10.2.2 二叉平衡樹類 180
10.2.3 二叉平衡樹的平衡旋轉 181
10.2.4 二叉平衡樹的插入操作 185
10.2.5 二叉平衡樹的刪除操作 187
10.2.6 二叉平衡樹的高度 189
10.3 伸展樹 190
10.3.1 自調節樹和伸展樹 190
10.3.2 伸展樹的伸展操作 191
10.3.3 伸展樹類 193
10.3.4 旋轉的實現 193
10.3.5 伸展樹的插入操作 194
10.3.6 分攤時間分析 195
10.4 紅黑樹 195
10.4.1 紅黑樹的定義 195
10.4.2 紅黑樹的查找操作 196
10.4.3 紅黑樹的插入操作 196
10.4.4 紅黑樹的刪除操作 198
10.4.5 紅黑樹的高度 199
本章小結 199
習題10 199
第11章 多叉查找樹 201
11.1 m叉查找樹 201
11.2 B?樹 202
11.2.1 B?樹的定義 203
11.2.2 B?樹的高度 203
11.2.3 B?樹的查找操作 203
11.2.4 B?樹的插入操作 204
11.2.5 B?樹的刪除操作 206
11.2.6 B?樹類 207
11.2.7 B?樹的查找操作 208
11.2.8 B?樹的插入函式 209
11.2.9 B?樹的刪除函式 210
11.3 鍵樹 212
11.3.1 鍵樹的定義 212
11.3.2 雙鏈樹 213
11.3.3 Trie樹 214
11.3.4 Trie樹的查找操作 216
11.3.5 Trie樹的插入操作 216
11.3.6 Trie樹的刪除操作 217
11.3.7 Trie樹性能分析 217
本章小結 218
習題11 218
第12章 跳表和散列表 219
12.1 跳表 219
12.1.1 跳表的概念 219
12.1.2 跳表類 221
12.1.3 跳表的查找函式 222
12.1.4 跳表的插入函式 223
12.1.5 跳表的刪除函式 224
12.1.6 性能分析 224
12.2 散列表 224
12.2.1 散列技術 225
12.2.2 散列函式 226
12.2.3 拉鏈法 227
12.2.4 開地址法 228
12.2.5 線性探查法 228
12.2.6 其他開地址法 231
12.2.7 性能分析 233
本章小結 233
習題12 234
第13章 圖 235
13.1 圖的基本概念 235
13.1.1 圖的定義與術語 235
13.1.2 圖的抽象數據類型 237
13.2 圖的存儲結構 238
13.2.1 圖的矩陣表示 238
13.2.2 圖的鄰接矩陣實現 239
13.2.3 圖的鄰接表表示 241
13.2.4 圖的鄰接表實現 242
13.2.5 有向圖的正交鍊表表示 245
13.2.6 無向圖的鄰接多重表表示 245
13.3 圖的遍歷 246
13.3.1 擴充的圖類 246
13.3.2 深度優先遍歷 247
13.3.3 廣度優先遍歷 248
13.3.4 基本遍歷方法 249
13.4 拓撲排序 250
13.4.1 AOV網路 250
13.4.2 拓撲排序算法 252
13.4.3 拓撲排序算法實現 252
13.5 關鍵路徑 254
13.5.1 AOE網 254
13.5.2 關鍵路徑算法 255
13.5.3 關鍵路徑算法實現 257
13.6 最小代價生成樹 258
13.6.1 基本概念 258
13.6.2 普里姆算法 258
13.6.4 算法正確性 262
13.7 單源最短路徑 262
13.7.1 最短路徑問題 262
13.7.3 數據結構選擇 263
13.7.4 迪傑斯特拉算法實現 264
13.8 所有頂點之間的最短路徑 266
13.8.2 弗洛伊德算法實現 267
本章小結 268
習題13 268
第14章 內排序 270
14.1 基本概念 270
14.2 插入排序 271
14.2.1 直接插入排序 271
14.2.2 順序表的直接插入排序 272
14.2.3 單鍊表的直接插入排序 273
14.2.4 希爾排序 274
14.2.5 對半插入排序 276
14.3 選擇排序 276
14.3.1 簡單選擇排序 276
14.3.2 堆排序 277
14.4 交換排序 278
14.4.1 冒泡排序 278
14.4.2 快速排序 280
14.4.3 快速排序性能分析 281
14.5 兩路合併排序 283
14.5.1 合併兩個有序序列 284
14.5.2 兩路合併排序疊代算法 284
14.5.3 兩路合併排序遞歸算法 285
14.5.4 單鍊表兩路合併排序 285
14.6 排序算法的時間複雜度下界 287
14.7 基數排序 288
14.7.1 分配排序 289
14.7.2 基數排序算法 289
14.7.3 基數排序實現 290
本章小結 292
習題14 292
第15章 檔案和外排序 294
15.1 輔助存儲器簡介 294
15.1.1 主存儲器和輔助存儲器 294
15.1.2 磁碟存儲器 294
15.2 檔案 295
15.2.1 檔案的基本概念 295
15.2.2 檔案的組織方式 296
15.3 檔案的索引結構 298
15.3.1 靜態索引結構 298
15.3.2 動態索引結構 299
15.4 外排序 300
15.4.1 外排序的基本過程 300
15.4.2 初始遊程的生成 300
15.4.3 多路合併 302
15.4.4 最佳合併樹 304
本章小結 304
習題15 305
第16章 實習指導和實習題 306
16.1 實習目的、要求和步驟 306
16.2 面向對象表示法 307
16.3 實習報告和範例 308
16.3.1 實習報告 308
16.3.2 實習題範例 309
16.3.3 實習報告範例 309
16.4 實習題 312
實習1 C++語言的類及模板的使用 312
實習2 數組和鍊表操作 313
實習3 棧、佇列及表達式計算 313
實習4 線性表的操作及套用 314
實習5 一元多項式的相加和相乘 314
實習6 對稱矩陣和稀疏矩陣的 壓縮存儲 315
實習7 字元串操作和文本 處理 315
實習8 二叉樹操作和哈夫曼編碼 315
實習9 有序表查找 316
實習10 B?樹檢索 317
實習11 散列表查找 317
實習12 圖的操作及套用 318
實習13 內排序算法及其性能比較 318
實習14 置換選擇和K路合併的 外排序算法 318
附錄A 程式測試和調試 319
A.1 面向對象程式測試 319
A.2 程式測試步驟 319
A.3 測試方法 320
A.4 程式調試 321
附錄B 2019年計算機考研大綱與教材內容對照 323
B.1 2019年計算機考研大綱 323
B.2 教材內容對2019年計算機考研大綱的適應性 324
參考文獻 326
2.1 兩種基本的存儲表示方式 22
2.2 結構和類 22
2.2.1 結構 22
2.2.2 結構表示元素 23
2.3 指針和動態存儲分配 24
2.3.1 指針 24
2.3.2 動態存儲分配 25
2.3.3 靜態變數和動態變數 26
2.4 數組 26
2.4.1 一維數組 26
2.4.2 二維數組 27
2.4.3 多維數組 28
2.4.4 數組和指針 28
2.4.5 固定長度數組和可變長度數組 28
2.5 鍊表 29
2.5.1 指向結構的指針 30
2.5.2 單鍊表 30
2.5.3 帶表頭結點的單鍊表 33
2.5.4 單循環鍊表 33
2.5.5 雙向鍊表 33
2.6 採用模擬指針的鍊表 35
2.6.1 結點結構 35
2.6.2 可用空間表 35
2.7 異常處理 37
本章小結 38
習題2 38
第3章 棧和佇列 40
3.1 棧 40
3.1.1 棧ADT 40
3.1.2 棧的順序表示 41
3.1.3 棧的連結表示 44
3.2 佇列 47
3.2.1 佇列ADT 47
3.2.2 佇列的順序表示 48
3.2.3 佇列的連結表示 51
3.3 表達式計算 51
3.3.1 表達式 51
3.3.2 中綴表達式轉換為後綴表達式 52
3.3.3 計算後綴表達式的值 55
3.4 演示與測試 58
本章小結 61
習題3 61
第4章 遞歸 63
4.1 遞歸和遞歸算法 63
4.1.1 遞歸的概念 63
4.1.2 遞歸算法示例 64
4.2 歸納證明 66
4.3 遞推關係 67
4.4 實現遞歸 67
4.4.1 函式調用和系統棧 68
4.4.2 遞歸函式的性能 69
4.4.3 尾遞歸 69
4.4.4 消去遞歸 70
本章小結 70
習題4 70
第5章 線性表和串 72
5.1 線性表 72
5.1.1 線性表ADT 72
5.1.2 線性表的順序表示 73
5.1.3 線性表的連結表示 76
5.1.4 兩種存儲表示的比較 79
5.2 一元多項式算術運算 80
5.2.1 多項式ADT 80
5.2.2 多項式的連結表示 80
5.2.3 項結點類 81
5.2.4 多項式類 82
5.2.5 多項式的輸入和輸出 83
5.2.6 多項式相加 84
5.2.7 多項式相乘 85
5.2.8 重載運算符 86
5.3 串 86
5.3.1 串ADT 86
5.3.2 串的存儲表示 87
5.3.3 串運算的實現 88
5.3.4 簡單模式匹配算法 89
5.3.5 KMP算法 91
本章小結 95
習題5 95
第6章 數組和廣義表 97
6.1 數組作為抽象數據類型 97
6.1.1 數組ADT 97
6.1.2 一維數組的C++類 98
6.2 矩陣 99
6.2.1 矩陣的概念 99
6.2.2 矩陣ADT 99
6.2.3 矩陣的二維數組表示 100
6.3 特殊矩陣 101
6.3.1 對稱矩陣 101
6.3.2 帶狀矩陣 102
6.4 稀疏矩陣 103
6.4.1 稀疏矩陣的三元組表 103
6.4.2 稀疏矩陣轉置 105
6.4.3 稀疏矩陣相加 107
6.4.4 稀疏矩陣相乘 108
6.5 稀疏矩陣的正交鍊表 109
6.5.1 正交鍊表結構 109
6.5.2 正交鍊表結點類 110
6.5.3 正交鍊表類 111
6.5.4 建立正交鍊表 111
6.5.5 輸出正交鍊表 113
6.6 廣義表 113
6.6.1 廣義表的概念 113
6.6.2 廣義表ADT 114
6.6.3 廣義表的存儲表示 115
6.6.4 廣義表算法 116
本章小結 116
習題6 117
第7章 樹 118
7.1 樹的基本概念 118
7.1.1 樹的定義 118
7.1.2 基本術語 119
7.2 二叉樹 120
7.2.1 二叉樹的定義 120
7.2.2 二叉樹的性質 121
7.2.3 二叉樹ADT 122
7.2.4 二叉樹的存儲表示 123
7.2.5 二叉樹類 123
7.2.6 實現二叉樹的基本操作 124
7.3 二叉樹的遍歷 126
7.3.1 二叉樹遍歷算法 126
7.3.2 二叉樹遍歷的遞歸算法 128
7.3.3 二叉樹遍歷的套用實例 129
7.4 二叉樹遍歷的非遞歸算法 131
7.4.1 遍歷器類 131
7.4.2 中序遍歷器類 132
7.4.3 後序遍歷器類 134
7.5 二叉線索樹 136
7.5.1 二叉線索樹的定義 136
7.5.2 構造中序線索樹 137
7.5.3 遍歷中序線索樹 138
7.6 樹和森林 139
7.6.1 森林與二叉樹的轉換 139
7.6.2 樹和森林的存儲表示 141
7.6.3 樹和森林的遍歷 142
本章小結 143
習題7 143
第8章 樹的套用 145
8.1 堆 145
8.1.1 堆的定義 145
8.1.2 堆的順序表示 145
8.1.3 向下調整和建堆操作 145
8.2 優先權佇列 147
8.2.1 優先權佇列ADT 147
8.2.2 優先權佇列類 148
8.2.3 實現優先權佇列 148
8.3 哈夫曼樹和哈夫曼編碼 150
8.3.1 樹的路徑長度 151
8.3.2 哈夫曼算法 152
8.3.3 哈夫曼樹類 152
8.3.4 構造哈夫曼樹 153
8.3.5 哈夫曼編碼 155
8.3.6 哈夫曼編碼算法 156
8.4 並查集和等價關係 156
8.4.1 並查集ADT 157
8.4.2 並查集的存儲表示 157
8.4.3 並查集類 158
8.4.4 Union和Find函式 159
8.4.5 改進的Union和Find函式 159
8.4.6 按等價關係分組 160
本章小結 161
習題8 161
第9章 字典和查找 162
9.1 字典及其表示 162
9.1.1 字典 162
9.1.2 字典查找 163
9.1.3 字典ADT 163
9.1.4 字典的存儲表示 164
9.2 順序查找 165
9.2.1 無序表的順序查找 165
9.2.2 有序表的順序查找 165
9.2.3 平均查找長度 166
9.2.4 自組織表 166
9.3 二分查找 167
9.3.1 二分查找算法 167
9.3.2 對半查找算法 168
9.3.3 二叉判定樹 169
9.3.4 斐波那契查找算法 170
9.3.5 插值查找 172
9.4 分塊查找 172
9.5 查找算法的時間複雜度下界 173
本章小結 174
習題9 174
第10章 二叉查找樹 175
10.1 二叉查找樹表示字典 175
10.1.1 二叉查找樹的定義 175
10.1.2 二叉查找樹的查找操作 176
10.1.3 二叉查找樹的插入操作 177
10.1.4 二叉查找樹的刪除操作 178
10.1.5 二叉查找樹的高度 179
10.2 二叉平衡樹 179
10.2.1 二叉平衡樹的定義 179
10.2.2 二叉平衡樹類 180
10.2.3 二叉平衡樹的平衡旋轉 181
10.2.4 二叉平衡樹的插入操作 185
10.2.5 二叉平衡樹的刪除操作 187
10.2.6 二叉平衡樹的高度 189
10.3 伸展樹 190
10.3.1 自調節樹和伸展樹 190
10.3.2 伸展樹的伸展操作 191
10.3.3 伸展樹類 193
10.3.4 旋轉的實現 193
10.3.5 伸展樹的插入操作 194
10.3.6 分攤時間分析 195
10.4 紅黑樹 195
10.4.1 紅黑樹的定義 195
10.4.2 紅黑樹的查找操作 196
10.4.3 紅黑樹的插入操作 196
10.4.4 紅黑樹的刪除操作 198
10.4.5 紅黑樹的高度 199
本章小結 199
習題10 199
第11章 多叉查找樹 201
11.1 m叉查找樹 201
11.2 B?樹 202
11.2.1 B?樹的定義 203
11.2.2 B?樹的高度 203
11.2.3 B?樹的查找操作 203
11.2.4 B?樹的插入操作 204
11.2.5 B?樹的刪除操作 206
11.2.6 B?樹類 207
11.2.7 B?樹的查找操作 208
11.2.8 B?樹的插入函式 209
11.2.9 B?樹的刪除函式 210
11.3 鍵樹 212
11.3.1 鍵樹的定義 212
11.3.2 雙鏈樹 213
11.3.3 Trie樹 214
11.3.4 Trie樹的查找操作 216
11.3.5 Trie樹的插入操作 216
11.3.6 Trie樹的刪除操作 217
11.3.7 Trie樹性能分析 217
本章小結 218
習題11 218
第12章 跳表和散列表 219
12.1 跳表 219
12.1.1 跳表的概念 219
12.1.2 跳表類 221
12.1.3 跳表的查找函式 222
12.1.4 跳表的插入函式 223
12.1.5 跳表的刪除函式 224
12.1.6 性能分析 224
12.2 散列表 224
12.2.1 散列技術 225
12.2.2 散列函式 226
12.2.3 拉鏈法 227
12.2.4 開地址法 228
12.2.5 線性探查法 228
12.2.6 其他開地址法 231
12.2.7 性能分析 233
本章小結 233
習題12 234
第13章 圖 235
13.1 圖的基本概念 235
13.1.1 圖的定義與術語 235
13.1.2 圖的抽象數據類型 237
13.2 圖的存儲結構 238
13.2.1 圖的矩陣表示 238
13.2.2 圖的鄰接矩陣實現 239
13.2.3 圖的鄰接表表示 241
13.2.4 圖的鄰接表實現 242
13.2.5 有向圖的正交鍊表表示 245
13.2.6 無向圖的鄰接多重表表示 245
13.3 圖的遍歷 246
13.3.1 擴充的圖類 246
13.3.2 深度優先遍歷 247
13.3.3 廣度優先遍歷 248
13.3.4 基本遍歷方法 249
13.4 拓撲排序 250
13.4.1 AOV網路 250
13.4.2 拓撲排序算法 252
13.4.3 拓撲排序算法實現 252
13.5 關鍵路徑 254
13.5.1 AOE網 254
13.5.2 關鍵路徑算法 255
13.5.3 關鍵路徑算法實現 257
13.6 最小代價生成樹 258
13.6.1 基本概念 258
13.6.2 普里姆算法 258
13.6.4 算法正確性 262
13.7 單源最短路徑 262
13.7.1 最短路徑問題 262
13.7.3 數據結構選擇 263
13.7.4 迪傑斯特拉算法實現 264
13.8 所有頂點之間的最短路徑 266
13.8.2 弗洛伊德算法實現 267
本章小結 268
習題13 268
第14章 內排序 270
14.1 基本概念 270
14.2 插入排序 271
14.2.1 直接插入排序 271
14.2.2 順序表的直接插入排序 272
14.2.3 單鍊表的直接插入排序 273
14.2.4 希爾排序 274
14.2.5 對半插入排序 276
14.3 選擇排序 276
14.3.1 簡單選擇排序 276
14.3.2 堆排序 277
14.4 交換排序 278
14.4.1 冒泡排序 278
14.4.2 快速排序 280
14.4.3 快速排序性能分析 281
14.5 兩路合併排序 283
14.5.1 合併兩個有序序列 284
14.5.2 兩路合併排序疊代算法 284
14.5.3 兩路合併排序遞歸算法 285
14.5.4 單鍊表兩路合併排序 285
14.6 排序算法的時間複雜度下界 287
14.7 基數排序 288
14.7.1 分配排序 289
14.7.2 基數排序算法 289
14.7.3 基數排序實現 290
本章小結 292
習題14 292
第15章 檔案和外排序 294
15.1 輔助存儲器簡介 294
15.1.1 主存儲器和輔助存儲器 294
15.1.2 磁碟存儲器 294
15.2 檔案 295
15.2.1 檔案的基本概念 295
15.2.2 檔案的組織方式 296
15.3 檔案的索引結構 298
15.3.1 靜態索引結構 298
15.3.2 動態索引結構 299
15.4 外排序 300
15.4.1 外排序的基本過程 300
15.4.2 初始遊程的生成 300
15.4.3 多路合併 302
15.4.4 最佳合併樹 304
本章小結 304
習題15 305
第16章 實習指導和實習題 306
16.1 實習目的、要求和步驟 306
16.2 面向對象表示法 307
16.3 實習報告和範例 308
16.3.1 實習報告 308
16.3.2 實習題範例 309
16.3.3 實習報告範例 309
16.4 實習題 312
實習1 C++語言的類及模板的使用 312
實習2 數組和鍊表操作 313
實習3 棧、佇列及表達式計算 313
實習4 線性表的操作及套用 314
實習5 一元多項式的相加和相乘 314
實習6 對稱矩陣和稀疏矩陣的 壓縮存儲 315
實習7 字元串操作和文本 處理 315
實習8 二叉樹操作和哈夫曼編碼 315
實習9 有序表查找 316
實習10 B?樹檢索 317
實習11 散列表查找 317
實習12 圖的操作及套用 318
實習13 內排序算法及其性能比較 318
實習14 置換選擇和K路合併的 外排序算法 318
附錄A 程式測試和調試 319
A.1 面向對象程式測試 319
A.2 程式測試步驟 319
A.3 測試方法 320
A.4 程式調試 321
附錄B 2019年計算機考研大綱與教材內容對照 323
B.1 2019年計算機考研大綱 323
B.2 教材內容對2019年計算機考研大綱的適應性 324
參考文獻 326,
第1章 概論 1
1.1 問題求解方法 1
1.1.1 問題和問題求解 1
1.1.2 問題求解過程 1
1.1.3 計算機求解問題的過程 2
1.2 什麼是數據結構 2
1.2.1 算法與數據結構 2
1.2.2 數據結構基本概念 3
1.2.3 數據的邏輯結構 4
1.2.4 數據的存儲表示 5
1.2.5 數據結構的操作 6
1.3 數據抽象和抽象數據類型 7
1.3.1 數據抽象和過程抽象 7
1.3.2 模組化、封裝與信息隱蔽 7
1.3.3 數據類型和抽象數據類型 8
1.4.1 面向對象方法的由來 10
1.4.2 面向對象方法的基本思想 10
1.4.3 面向對象方法的基本要素 11
1.4.4 抽象數據類型和面向對象方法 12
1.4.5 C++語言對抽象數據類型的支持 13
1.5 描述數據結構和算法 13
1.5.1 數據結構的規範 13
1.5.2 實現數據結構 14
1.6 算法分析的基本方法 15
1.6.1 算法及其性能標準 15
1.6.2 算法的時間複雜度 16
1.6.3 漸近時間複雜度 18
1.6.4 最好、最壞和平均情況時間複雜度 19
1.6.5 算法按時間複雜度分類 19
1.6.6 算法的空間複雜度 19
本章小結 20
習題1 20
第2章 數組和鍊表 22
2.1 兩種基本的存儲表示方式 22
2.2 結構和類 22
2.2.1 結構 22
2.2.2 結構表示元素 23
2.3 指針和動態存儲分配 24
2.3.1 指針 24
2.3.2 動態存儲分配 25
2.3.3 靜態變數和動態變數 26
2.4 數組 26
2.4.1 一維數組 26
2.4.2 二維數組 27
2.4.3 多維數組 28
2.4.4 數組和指針 28
2.4.5 固定長度數組和可變長度數組 28
2.5 鍊表 29
2.5.1 指向結構的指針 30
2.5.2 單鍊表 30
2.5.3 帶表頭結點的單鍊表 33
2.5.4 單循環鍊表 33
2.5.5 雙向鍊表 33
2.6 採用模擬指針的鍊表 35
2.6.1 結點結構 35
2.6.2 可用空間表 35
2.7 異常處理 37
本章小結 38
習題2 38
第3章 棧和佇列 40
3.1 棧 40
3.1.1 棧ADT 40
3.1.2 棧的順序表示 41
3.1.3 棧的連結表示 44
3.2 佇列 47
3.2.1 佇列ADT 47
3.2.2 佇列的順序表示 48
3.2.3 佇列的連結表示 51
3.3 表達式計算 51
3.3.1 表達式 51
3.3.2 中綴表達式轉換為後綴表達式 52
3.3.3 計算後綴表達式的值 55
3.4 演示與測試 58
本章小結 61
習題3 61
第4章 遞歸 63
4.1 遞歸和遞歸算法 63
4.1.1 遞歸的概念 63
4.1.2 遞歸算法示例 64
4.2 歸納證明 66
4.3 遞推關係 67
4.4 實現遞歸 67
4.4.1 函式調用和系統棧 68
4.4.2 遞歸函式的性能 69
4.4.3 尾遞歸 69
4.4.4 消去遞歸 70
本章小結 70
習題4 70
第5章 線性表和串 72
5.1 線性表 72
5.1.1 線性表ADT 72
5.1.2 線性表的順序表示 73
5.1.3 線性表的連結表示 76
5.1.4 兩種存儲表示的比較 79
5.2 一元多項式算術運算 80
5.2.1 多項式ADT 80
5.2.2 多項式的連結表示 80
5.2.3 項結點類 81
5.2.4 多項式類 82
5.2.5 多項式的輸入和輸出 83
5.2.6 多項式相加 84
5.2.7 多項式相乘 85
5.2.8 重載運算符 86
5.3 串 86
5.3.1 串ADT 86
5.3.2 串的存儲表示 87
5.3.3 串運算的實現 88
5.3.4 簡單模式匹配算法 89
5.3.5 KMP算法 91
本章小結 95
習題5 95
第6章 數組和廣義表 97
6.1 數組作為抽象數據類型 97
6.1.1 數組ADT 97
6.1.2 一維數組的C++類 98
6.2 矩陣 99
6.2.1 矩陣的概念 99
6.2.2 矩陣ADT 99
6.2.3 矩陣的二維數組表示 100
6.3 特殊矩陣 101
6.3.1 對稱矩陣 101
6.3.2 帶狀矩陣 102
6.4 稀疏矩陣 103
6.4.1 稀疏矩陣的三元組表 103
6.4.2 稀疏矩陣轉置 105
6.4.3 稀疏矩陣相加 107
6.4.4 稀疏矩陣相乘 108
6.5 稀疏矩陣的正交鍊表 109
6.5.1 正交鍊表結構 109
6.5.2 正交鍊表結點類 110
6.5.3 正交鍊表類 111
6.5.4 建立正交鍊表 111
6.5.5 輸出正交鍊表 113
6.6 廣義表 113
6.6.1 廣義表的概念 113
6.6.2 廣義表ADT 114
6.6.3 廣義表的存儲表示 115
6.6.4 廣義表算法 116
本章小結 116
習題6 117
第7章 樹 118
7.1 樹的基本概念 118
7.1.1 樹的定義 118
7.1.2 基本術語 119
7.2 二叉樹 120
7.2.1 二叉樹的定義 120
7.2.2 二叉樹的性質 121
7.2.3 二叉樹ADT 122
7.2.4 二叉樹的存儲表示 123
7.2.5 二叉樹類 123
7.2.6 實現二叉樹的基本操作 124
7.3 二叉樹的遍歷 126
7.3.1 二叉樹遍歷算法 126
7.3.2 二叉樹遍歷的遞歸算法 128
7.3.3 二叉樹遍歷的套用實例 129
7.4 二叉樹遍歷的非遞歸算法 131
7.4.1 遍歷器類 131
7.4.2 中序遍歷器類 132
7.4.3 後序遍歷器類 134
7.5 二叉線索樹 136
7.5.1 二叉線索樹的定義 136
7.5.2 構造中序線索樹 137
7.5.3 遍歷中序線索樹 138
7.6 樹和森林 139
7.6.1 森林與二叉樹的轉換 139
7.6.2 樹和森林的存儲表示 141
7.6.3 樹和森林的遍歷 142
本章小結 143
習題7 143
第8章 樹的套用 145
8.1 堆 145
8.1.1 堆的定義 145
8.1.2 堆的順序表示 145
8.1.3 向下調整和建堆操作 145
8.2 優先權佇列 147
8.2.1 優先權佇列ADT 147
8.2.2 優先權佇列類 148
8.2.3 實現優先權佇列 148
8.3 哈夫曼樹和哈夫曼編碼 150
8.3.1 樹的路徑長度 151
8.3.2 哈夫曼算法 152
8.3.3 哈夫曼樹類 152
8.3.4 構造哈夫曼樹 153
8.3.5 哈夫曼編碼 155
8.3.6 哈夫曼編碼算法 156
8.4 並查集和等價關係 156
8.4.1 並查集ADT 157
8.4.2 並查集的存儲表示 157
8.4.3 並查集類 158
8.4.4 Union和Find函式 159
8.4.5 改進的Union和Find函式 159
8.4.6 按等價關係分組 160
本章小結 161
習題8 161
第9章 字典和查找 162
9.1 字典及其表示 162
9.1.1 字典 162
9.1.2 字典查找 163
9.1.3 字典ADT 163
9.1.4 字典的存儲表示 164
9.2 順序查找 165
9.2.1 無序表的順序查找 165
9.2.2 有序表的順序查找 165
9.2.3 平均查找長度 166
9.2.4 自組織表 166
9.3 二分查找 167
9.3.1 二分查找算法 167
9.3.2 對半查找算法 168
9.3.3 二叉判定樹 169
9.3.4 斐波那契查找算法 170
9.3.5 插值查找 172
9.4 分塊查找 172
9.5 查找算法的時間複雜度下界 173
本章小結 174
習題9 174
第10章 二叉查找樹 175
10.1 二叉查找樹表示字典 175
10.1.1 二叉查找樹的定義 175
10.1.2 二叉查找樹的查找操作 176
10.1.3 二叉查找樹的插入操作 177
10.1.4 二叉查找樹的刪除操作 178
10.1.5 二叉查找樹的高度 179
10.2 二叉平衡樹 179
10.2.1 二叉平衡樹的定義 179
10.2.2 二叉平衡樹類 180
10.2.3 二叉平衡樹的平衡旋轉 181
10.2.4 二叉平衡樹的插入操作 185
10.2.5 二叉平衡樹的刪除操作 187
10.2.6 二叉平衡樹的高度 189
10.3 伸展樹 190
10.3.1 自調節樹和伸展樹 190
10.3.2 伸展樹的伸展操作 191
10.3.3 伸展樹類 193
10.3.4 旋轉的實現 193
10.3.5 伸展樹的插入操作 194
10.3.6 分攤時間分析 195
10.4 紅黑樹 195
10.4.1 紅黑樹的定義 195
10.4.2 紅黑樹的查找操作 196
10.4.3 紅黑樹的插入操作 196
10.4.4 紅黑樹的刪除操作 198
10.4.5 紅黑樹的高度 199
本章小結 199
習題10 199
第11章 多叉查找樹 201
11.1 m叉查找樹 201
11.2 B?樹 202
11.2.1 B?樹的定義 203
11.2.2 B?樹的高度 203
11.2.3 B?樹的查找操作 203
11.2.4 B?樹的插入操作 204
11.2.5 B?樹的刪除操作 206
11.2.6 B?樹類 207
11.2.7 B?樹的查找操作 208
11.2.8 B?樹的插入函式 209
11.2.9 B?樹的刪除函式 210
11.3 鍵樹 212
11.3.1 鍵樹的定義 212
11.3.2 雙鏈樹 213
11.3.3 Trie樹 214
11.3.4 Trie樹的查找操作 216
11.3.5 Trie樹的插入操作 216
11.3.6 Trie樹的刪除操作 217
11.3.7 Trie樹性能分析 217
本章小結 218
習題11 218
第12章 跳表和散列表 219
12.1 跳表 219
12.1.1 跳表的概念 219
12.1.2 跳表類 221
12.1.3 跳表的查找函式 222
12.1.4 跳表的插入函式 223
12.1.5 跳表的刪除函式 224
12.1.6 性能分析 224
12.2 散列表 224
12.2.1 散列技術 225
12.2.2 散列函式 226
12.2.3 拉鏈法 227
12.2.4 開地址法 228
12.2.5 線性探查法 228
12.2.6 其他開地址法 231
12.2.7 性能分析 233
本章小結 233
習題12 234
第13章 圖 235
13.1 圖的基本概念 235
13.1.1 圖的定義與術語 235
13.1.2 圖的抽象數據類型 237
13.2 圖的存儲結構 238
13.2.1 圖的矩陣表示 238
13.2.2 圖的鄰接矩陣實現 239
13.2.3 圖的鄰接表表示 241
13.2.4 圖的鄰接表實現 242
13.2.5 有向圖的正交鍊表表示 245
13.2.6 無向圖的鄰接多重表表示 245
13.3 圖的遍歷 246
13.3.1 擴充的圖類 246
13.3.2 深度優先遍歷 247
13.3.3 廣度優先遍歷 248
13.3.4 基本遍歷方法 249
13.4 拓撲排序 250
13.4.1 AOV網路 250
13.4.2 拓撲排序算法 252
13.4.3 拓撲排序算法實現 252
13.5 關鍵路徑 254
13.5.1 AOE網 254
13.5.2 關鍵路徑算法 255
13.5.3 關鍵路徑算法實現 257
13.6 最小代價生成樹 258
13.6.1 基本概念 258
13.6.2 普里姆算法 258
13.6.4 算法正確性 262
13.7 單源最短路徑 262
13.7.1 最短路徑問題 262
13.7.3 數據結構選擇 263
13.7.4 迪傑斯特拉算法實現 264
13.8 所有頂點之間的最短路徑 266
13.8.2 弗洛伊德算法實現 267
本章小結 268
習題13 268
第14章 內排序 270
14.1 基本概念 270
14.2 插入排序 271
14.2.1 直接插入排序 271
14.2.2 順序表的直接插入排序 272
14.2.3 單鍊表的直接插入排序 273
14.2.4 希爾排序 274
14.2.5 對半插入排序 276
14.3 選擇排序 276
14.3.1 簡單選擇排序 276
14.3.2 堆排序 277
14.4 交換排序 278
14.4.1 冒泡排序 278
14.4.2 快速排序 280
14.4.3 快速排序性能分析 281
14.5 兩路合併排序 283
14.5.1 合併兩個有序序列 284
14.5.2 兩路合併排序疊代算法 284
14.5.3 兩路合併排序遞歸算法 285
14.5.4 單鍊表兩路合併排序 285
14.6 排序算法的時間複雜度下界 287
14.7 基數排序 288
14.7.1 分配排序 289
14.7.2 基數排序算法 289
14.7.3 基數排序實現 290
本章小結 292
習題14 292
第15章 檔案和外排序 294
15.1 輔助存儲器簡介 294
15.1.1 主存儲器和輔助存儲器 294
15.1.2 磁碟存儲器 294
15.2 檔案 295
15.2.1 檔案的基本概念 295
15.2.2 檔案的組織方式 296
15.3 檔案的索引結構 298
15.3.1 靜態索引結構 298
15.3.2 動態索引結構 299
15.4 外排序 300
15.4.1 外排序的基本過程 300
15.4.2 初始遊程的生成 300
15.4.3 多路合併 302
15.4.4 最佳合併樹 304
本章小結 304
習題15 305
第16章 實習指導和實習題 306
16.1 實習目的、要求和步驟 306
16.2 面向對象表示法 307
16.3 實習報告和範例 308
16.3.1 實習報告 308
16.3.2 實習題範例 309
16.3.3 實習報告範例 309
16.4 實習題 312
實習1 C++語言的類及模板的使用 312
實習2 數組和鍊表操作 313
實習3 棧、佇列及表達式計算 313
實習4 線性表的操作及套用 314
實習5 一元多項式的相加和相乘 314
實習6 對稱矩陣和稀疏矩陣的 壓縮存儲 315
實習7 字元串操作和文本 處理 315
實習8 二叉樹操作和哈夫曼編碼 315
實習9 有序表查找 316
實習10 B?樹檢索 317
實習11 散列表查找 317
實習12 圖的操作及套用 318
實習13 內排序算法及其性能比較 318
實習14 置換選擇和K路合併的 外排序算法 318
附錄A 程式測試和調試 319
A.1 面向對象程式測試 319
A.2 程式測試步驟 319
A.3 測試方法 320
A.4 程式調試 321
附錄B 2019年計算機考研大綱與教材內容對照 323
B.1 2019年計算機考研大綱 323
B.2 教材內容對2019年計算機考研大綱的適應性 324
參考文獻 326

相關詞條

熱門詞條

聯絡我們