前言
數(shù)據(jù)結構研究計算機系統(tǒng)內表示、組織、處理和存儲數(shù)據(jù)的方式,算法則著重于程序處理流程的優(yōu)化,二者相輔相成,共同提高程序的時間與空間效率。數(shù)據(jù)結構課程已經成為高等學校計算機科學與技術、信息管理與信息系統(tǒng)、軟件工程等專業(yè)的核心課程,并有越來越多的專業(yè)技術人員對數(shù)據(jù)結構知識提出了更高的需求。
本書共10章和兩個附錄。第1章緒論,主要介紹學習數(shù)據(jù)結構的意義、數(shù)據(jù)結構的基本概念,算法中的抽象數(shù)據(jù)類型及其在C++語言中的表示與算法實現(xiàn)的原則,算法的定義、特征及效率分析。第2章線性表,主要介紹線性表的基本概念和邏輯結構,線性表的順序存儲結構和鏈表的存儲結構,順序表、單鏈表、雙向鏈表及循環(huán)鏈表的相關操作與C++算法實現(xiàn)。第3章棧與隊列,主要介紹棧和隊列的基本概念、存儲結構和基本操作,以及對應的C++算法實現(xiàn),并以算術表達式轉化和求值為例介紹棧和隊列的應用。第4章串,主要介紹串的定義、特點、存儲結構和基本的串處理操作,以及對應的C++算法實現(xiàn)。第5章數(shù)組和廣義表,主要介紹數(shù)組和廣義表的定義、特點、存儲結構與C++算法實現(xiàn)。第6章樹和二叉樹,主要介紹二叉樹的基本概念、存儲結構及其操作,并研究樹和森林、二叉樹之間的相互轉換方法,以及樹的一個重要應用——最優(yōu)樹和哈夫曼編碼方法。第7章圖,主要介紹圖的基本概念,圖的鄰接矩陣、鄰接表、十字鏈表、鄰接多重表等存儲結構,圖的深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法、最小生成樹算法以及其他應用算法。第8章查找,主要介紹查找的基本概念,靜態(tài)查找表、動態(tài)查找表及哈希表的表示方法,順序查找、折半查找、分塊查找、二叉排序樹、二叉平衡樹、B樹、哈希表等查找方法以及C++算法實現(xiàn)與算法分析。第9章排序,主要介紹排序的基本概念,插入排序、希爾排序、快速排序、直接選擇排序、堆排序、歸并排序、基數(shù)排序的方法與C++算法實現(xiàn),以及各種排序算法的比較分析。第10章是一個綜合案例,通過實際生產問題的求解過程,深化讀者對數(shù)據(jù)結構的理解,提高讀者的綜合應用能力,展示數(shù)據(jù)結構與算法的魅力。附錄A給出本書中算法實現(xiàn)時的文件夾結構,附錄B給出本書中算法實現(xiàn)時C++類中間的UML關系圖。每章習題及其參考答案可以通過掃描每章后所附的二維碼得到。
本書的主要特點如下。
(1) 參照數(shù)據(jù)結構普遍的分類規(guī)范進行內容編排,涵蓋了一般需要掌握的所有基礎數(shù)據(jù)結構與算法,并對算法的效率進行了對比分析。
(2) 實例引入和圖文講解展現(xiàn)了將實際問題轉換為抽象的數(shù)據(jù)結構的方法,并設計了相應的算法。
(3) 基于C++語言面向對象的概念和對象類設計原則進行算法實現(xiàn),體現(xiàn)了面向對象的三大特點——封裝、繼承和多態(tài),利用封裝實現(xiàn)其獨立的原理特點,利用繼承實現(xiàn)各個數(shù)據(jù)結構之間的關聯(lián),利用多態(tài)展現(xiàn)數(shù)據(jù)結構在實際問題中的調用方法。附錄B中涵蓋了各個C++類對應的UML類圖,從中可清晰地看到每個類中的屬性與方法,以及各個類之間的關系。
(4) 為了滿足教學過程中的上機練習需求,書中所有的算法實現(xiàn)均可以通過直接編譯運行,并附上相應的算例和運行結果,便于讀者對比實現(xiàn)。同時,采用.h頭文件與.cpp定義文件分離的方式進行算法實現(xiàn),避免對數(shù)據(jù)結構重復定義,引用位置也在附錄A的文件夾結構中詳細展示。
(5) 建議將書中的數(shù)據(jù)結構進行自主實現(xiàn),但同時本書也介紹了幾種基礎數(shù)據(jù)結構對應的標準模板庫(STL)里的容器,若讀者時間不足,可以在了解后直接使用現(xiàn)有組件。
(6) 每一章最后通過掃描二維碼都有匹配的思考和練習題,包含概念理解、算法拓展、解決實際問題等題型,同時參考答案里附上了每個問題的解題思路、可執(zhí)行的C++代碼及運行結果供讀者參考。
本書內容豐富、結構合理、實用性強,配有電子課件、完整的程序源代碼、習題參考答案等教學資源。
本書由張千帆任主編,莫嘉銘、王翀任副主編。本書的編寫得到了漆鵬飛、吳慶華的支持,并參考了同行專家的著作和成果,在此向他們表示衷心的感謝!
由于作者水平有限,書中難免有不當之處,敬請專家和讀者批評指正。
張千帆2020年5月
目錄
第1章緒論1
1.1數(shù)據(jù)結構與程序設計1
1.1.1學習數(shù)據(jù)結構的意義1
1.1.2數(shù)據(jù)與數(shù)據(jù)結構2
1.1.3數(shù)據(jù)結構的類型4
1.2抽象數(shù)據(jù)類型5
1.2.1C++中的數(shù)據(jù)類型6
1.2.2抽象數(shù)據(jù)類型與C++特性6
1.3算法分析10
1.3.1問題、算法與程序10
1.3.2算法效率的度量10
本章小結14
第2章線性表15
2.1線性表的基本概念15
2.1.1線性表的定義與特點15
2.1.2線性表的存儲結構15
2.2順序表的算法實現(xiàn)17
2.2.1順序表的創(chuàng)建和插入19
2.2.2順序表內結點的查找23
2.2.3順序表內元素的刪除28
2.3單鏈表的算法實現(xiàn)30
2.3.1單鏈表的結點結構和一般形式30
2.3.2單鏈表的創(chuàng)建和插入32
2.3.3單鏈表內數(shù)據(jù)元素的查找37
2.3.4單鏈表內數(shù)據(jù)元素的刪除40
2.3.5單鏈表的合并43
2.4雙向鏈表的算法實現(xiàn)47
2.4.1雙向鏈表的結點結構和一般形式47
2.4.2雙向鏈表的創(chuàng)建和插入49
2.4.3雙向鏈表內元素的查找53
2.4.4雙向鏈表內元素的刪除55
2.5循環(huán)鏈表的算法實現(xiàn)57
2.5.1循環(huán)鏈表的結點結構和一般形式57
2.5.2循環(huán)鏈表的創(chuàng)建58
2.6線性表的應用——一元多項式的存儲和相加63
2.6.1一元多項式的存儲和相加的實現(xiàn)方式63
2.6.2一元多項式的存儲和相加的實現(xiàn)65
2.7STL的使用68
2.7.1STL簡介68
2.7.2STL應用實例68
本章小結69
第3章棧與隊列71
3.1棧的基本概念71
3.1.1棧的定義與特點71
3.1.2棧的兩類存儲結構71
3.2順序棧的算法實現(xiàn)72
3.2.1順序棧的建立和順序棧入棧72
3.2.2順序棧出棧74
3.3隊列的基本概念76
3.3.1隊列的定義與特點76
3.3.2隊列的存儲結構77
3.4順序隊列的算法實現(xiàn)78
3.4.1順序隊列的建立和順序隊列入隊79
3.4.2順序隊列出隊80
3.5循環(huán)隊列的算法實現(xiàn)83
3.5.1循環(huán)隊列的建立和循環(huán)隊列入隊83
3.5.2循環(huán)隊列出隊85
3.6鏈隊列的算法實現(xiàn)87
3.6.1鏈隊列的建立和鏈隊列入隊87
3.6.2鏈隊列出隊88
3.7棧和隊列的應用——算術表達式的轉化和求值89
本章小結96
第4章串97
4.1串的基本概念97
4.1.1串的定義與特點97
4.1.2串的存儲結構98
4.2串的算法實現(xiàn)100
4.2.1串賦值算法100
4.2.2求子串算法102
4.2.3串比較算法104
4.2.4串連接算法106
4.3串的模式匹配算法實現(xiàn)107
4.3.1串的樸素模式匹配算法107
4.3.2改進的模式匹配算法109
本章小結114
第5章數(shù)組和廣義表115
5.1數(shù)組的基本概念115
5.1.1數(shù)組的定義與特點115
5.1.2數(shù)組的存儲結構116
5.2特殊矩陣的壓縮存儲117
5.3矩陣的算法實現(xiàn)120
5.4廣義表的基本概念126
5.4.1廣義表的定義與圖形表示126
5.4.2廣義表的存儲結構127
5.5廣義表的算法實現(xiàn)128
本章小結134
第6章樹和二叉樹135
6.1樹的基本概念135
6.1.1樹的定義與基本術語135
6.1.2樹的表示形式和存儲結構136
6.2二叉樹的基本概念140
6.2.1二叉樹的定義與性質140
6.2.2二叉樹的存儲結構142
6.2.3樹、森林和二叉樹的轉換144
6.2.4二叉樹的遍歷146
6.3二叉樹算法實現(xiàn)147
6.3.1二叉樹的建立147
6.3.2遞歸的二叉樹前序遍歷、中序遍歷、后序遍歷150
6.3.3非遞歸的二叉樹前序遍歷153
6.3.4非遞歸的二叉樹中序遍歷155
6.3.5非遞歸的二叉樹后序遍歷157
6.4哈夫曼樹及其應用161
6.4.1哈夫曼樹與哈夫曼編碼161
6.4.2哈夫曼算法實現(xiàn)162
本章小結168
第7章圖169
7.1圖的基本概念169
7.1.1圖的定義和術語169
7.1.2圖的表示與存儲結構173
7.2圖的構造算法實現(xiàn)176
7.2.1圖的基本類定義176
7.2.2構造順序表存儲的圖179
7.2.3構造鄰接表存儲的無向圖與有向圖182
7.2.4構造十字鏈表存儲的有向圖188
7.2.5構造鄰接多重表存儲的無向圖193
7.3圖的遍歷算法實現(xiàn)197
7.3.1深度優(yōu)先遍歷算法198
7.3.2廣度優(yōu)先遍歷算法200
7.4最小生成樹算法實現(xiàn)204
7.4.1普里姆算法205
7.4.2克魯斯卡爾算法209
7.5圖的應用216
7.5.1拓撲排序216
7.5.2關鍵路徑220
7.5.3最短路徑——迪杰斯克拉算法225
7.5.4最短路徑——弗洛伊德算法229
本章小結234
第8章查找235
8.1查找的基本概念235
8.1.1查找的相關術語235
8.1.2查找表結構236
8.2順序表查找算法實現(xiàn)236
8.3有序順序表的折半查找算法實現(xiàn)240
8.4索引順序表的分塊查找算法實現(xiàn)245
8.4.1索引表245
8.4.2分塊查找算法實現(xiàn)246
8.5二叉排序樹及其算法實現(xiàn)250
8.5.1二叉排序樹及其查找過程250
8.5.2二叉排序樹建立及插入結點的過程251
8.5.3二叉排序樹刪除結點的過程251
8.5.4二叉排序樹的算法實現(xiàn)253
8.6平衡二叉樹及其算法實現(xiàn)258
8.6.1平衡二叉排序樹及其構造258
8.6.2平衡二叉排序樹算法實現(xiàn)261
8.7B樹及其算法實現(xiàn)268
8.7.1B樹268
8.7.2B樹的查找269
8.7.3B樹的插入269
8.7.4B樹的刪除271
8.7.5B樹的算法實現(xiàn)273
8.8哈希查找的算法實現(xiàn)282
8.8.1哈希表282
8.8.2哈希函數(shù)的構造方法282
8.8.3哈希沖突的處理方法283
8.8.4哈希表的算法實現(xiàn)285
本章小結289
第9章排序290
9.1排序的基本概念290
9.1.1排序相關術語介紹290
9.1.2常用的內部排序算法類型簡介291
9.2插入排序的算法實現(xiàn)292
9.2.1直接插入排序292
9.2.2希爾排序295
9.3交換排序的算法實現(xiàn)299
9.4選擇排序的算法實現(xiàn)303
9.4.1直接選擇排序303
9.4.2堆排序306
9.5歸并排序的算法實現(xiàn)313
9.6基數(shù)排序的算法實現(xiàn)316
9.7各種內部排序方法的比較321
9.7.1時間性能321
9.7.2空間性能321
9.7.3排序方法的穩(wěn)定性322
9.8外部排序322
本章小結322
第10章綜合案例323
10.1背景介紹323
10.2問題分解323
10.2.1旅行商問題323
10.2.2動態(tài)規(guī)劃325
10.2.3帶酒店選擇的旅行商問題328
10.3總結與思考331
附錄A文件夾結構332
附錄BUML類圖334
B.1第2章線性表的相關類圖334
B.2第3章棧與隊列的相關類圖336
B.3第4章串的相關類圖337
B.4第5章數(shù)組和廣義表的相關類圖338
B.5第6章樹和二叉樹的相關類圖339
B.6第7章圖的相關類圖341
B.7第8章查找的相關類圖344
B.8第9章排序的相關類圖346
參考文獻347