本書按照循序漸進的原則介紹線性表、棧、隊列、串、樹、圖等數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)和數(shù)據(jù)運算,對于經(jīng)典算法使用C++構(gòu)造可執(zhí)行的程序,幫助讀者利用最少的時間和空間資源編寫出z優(yōu)秀最合理的程序。本書可以作為高等院校信息管理與信息系統(tǒng)專業(yè)、軟件專業(yè)、計算機專業(yè)的本科教材,也可以作為其他理工科專業(yè)的選修教材。教師可以根據(jù)本學校的專業(yè)特點、學生情況和教學學時,選講部分章節(jié)的內(nèi)容。
前言
數(shù)據(jù)結(jié)構(gòu)研究計算機系統(tǒng)內(nèi)表示、組織、處理和存儲數(shù)據(jù)的方式,算法則著重于程序處理流程的優(yōu)化,二者相輔相成,共同提高程序的時間與空間效率。數(shù)據(jù)結(jié)構(gòu)課程已經(jīng)成為高等學校計算機科學與技術(shù)、信息管理與信息系統(tǒng)、軟件工程等專業(yè)的核心課程,并有越來越多的專業(yè)技術(shù)人員對數(shù)據(jù)結(jié)構(gòu)知識提出了更高的需求。
本書共10章和兩個附錄。第1章緒論,主要介紹學習數(shù)據(jù)結(jié)構(gòu)的意義、數(shù)據(jù)結(jié)構(gòu)的基本概念,算法中的抽象數(shù)據(jù)類型及其在C++語言中的表示與算法實現(xiàn)的原則,算法的定義、特征及效率分析。第2章線性表,主要介紹線性表的基本概念和邏輯結(jié)構(gòu),線性表的順序存儲結(jié)構(gòu)和鏈表的存儲結(jié)構(gòu),順序表、單鏈表、雙向鏈表及循環(huán)鏈表的相關(guān)操作與C++算法實現(xiàn)。第3章棧與隊列,主要介紹棧和隊列的基本概念、存儲結(jié)構(gòu)和基本操作,以及對應(yīng)的C++算法實現(xiàn),并以算術(shù)表達式轉(zhuǎn)化和求值為例介紹棧和隊列的應(yīng)用。第4章串,主要介紹串的定義、特點、存儲結(jié)構(gòu)和基本的串處理操作,以及對應(yīng)的C++算法實現(xiàn)。第5章數(shù)組和廣義表,主要介紹數(shù)組和廣義表的定義、特點、存儲結(jié)構(gòu)與C++算法實現(xiàn)。第6章樹和二叉樹,主要介紹二叉樹的基本概念、存儲結(jié)構(gòu)及其操作,并研究樹和森林、二叉樹之間的相互轉(zhuǎn)換方法,以及樹的一個重要應(yīng)用——最優(yōu)樹和哈夫曼編碼方法。第7章圖,主要介紹圖的基本概念,圖的鄰接矩陣、鄰接表、十字鏈表、鄰接多重表等存儲結(jié)構(gòu),圖的深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法、最小生成樹算法以及其他應(yīng)用算法。第8章查找,主要介紹查找的基本概念,靜態(tài)查找表、動態(tài)查找表及哈希表的表示方法,順序查找、折半查找、分塊查找、二叉排序樹、二叉平衡樹、B樹、哈希表等查找方法以及C++算法實現(xiàn)與算法分析。第9章排序,主要介紹排序的基本概念,插入排序、希爾排序、快速排序、直接選擇排序、堆排序、歸并排序、基數(shù)排序的方法與C++算法實現(xiàn),以及各種排序算法的比較分析。第10章是一個綜合案例,通過實際生產(chǎn)問題的求解過程,深化讀者對數(shù)據(jù)結(jié)構(gòu)的理解,提高讀者的綜合應(yīng)用能力,展示數(shù)據(jù)結(jié)構(gòu)與算法的魅力。附錄A給出本書中算法實現(xiàn)時的文件夾結(jié)構(gòu),附錄B給出本書中算法實現(xiàn)時C++類中間的UML關(guān)系圖。每章習題及其參考答案可以通過掃描每章后所附的二維碼得到。
本書的主要特點如下。
(1) 參照數(shù)據(jù)結(jié)構(gòu)普遍的分類規(guī)范進行內(nèi)容編排,涵蓋了一般需要掌握的所有基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與算法,并對算法的效率進行了對比分析。
(2) 實例引入和圖文講解展現(xiàn)了將實際問題轉(zhuǎn)換為抽象的數(shù)據(jù)結(jié)構(gòu)的方法,并設(shè)計了相應(yīng)的算法。
(3) 基于C++語言面向?qū)ο蟮母拍詈蛯ο箢愒O(shè)計原則進行算法實現(xiàn),體現(xiàn)了面向?qū)ο蟮娜筇攸c——封裝、繼承和多態(tài),利用封裝實現(xiàn)其獨立的原理特點,利用繼承實現(xiàn)各個數(shù)據(jù)結(jié)構(gòu)之間的關(guān)聯(lián),利用多態(tài)展現(xiàn)數(shù)據(jù)結(jié)構(gòu)在實際問題中的調(diào)用方法。附錄B中涵蓋了各個C++類對應(yīng)的UML類圖,從中可清晰地看到每個類中的屬性與方法,以及各個類之間的關(guān)系。
(4) 為了滿足教學過程中的上機練習需求,書中所有的算法實現(xiàn)均可以通過直接編譯運行,并附上相應(yīng)的算例和運行結(jié)果,便于讀者對比實現(xiàn)。同時,采用.h頭文件與.cpp定義文件分離的方式進行算法實現(xiàn),避免對數(shù)據(jù)結(jié)構(gòu)重復定義,引用位置也在附錄A的文件夾結(jié)構(gòu)中詳細展示。
(5) 建議將書中的數(shù)據(jù)結(jié)構(gòu)進行自主實現(xiàn),但同時本書也介紹了幾種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的標準模板庫(STL)里的容器,若讀者時間不足,可以在了解后直接使用現(xiàn)有組件。
(6) 每一章最后通過掃描二維碼都有匹配的思考和練習題,包含概念理解、算法拓展、解決實際問題等題型,同時參考答案里附上了每個問題的解題思路、可執(zhí)行的C++代碼及運行結(jié)果供讀者參考。
本書內(nèi)容豐富、結(jié)構(gòu)合理、實用性強,配有電子課件、完整的程序源代碼、習題參考答案等教學資源。
本書由張千帆任主編,莫嘉銘、王翀任副主編。本書的編寫得到了漆鵬飛、吳慶華的支持,并參考了同行專家的著作和成果,在此向他們表示衷心的感謝!
由于作者水平有限,書中難免有不當之處,敬請專家和讀者批評指正。
張千帆2020年5月
張千帆,基金委A類期刊外審專家,中國建筑第三工程局有限公司企業(yè)管理咨詢顧問。2017年獲得華中科技大學優(yōu)秀教職工,2016年獲得湖北省大學生暑期社會實踐先進工作者、2011年獲得湖北省教育系統(tǒng)先進女教職工、2012年和2007年獲得華中科技大學教學質(zhì)量一等獎、2007年獲得華中科技大學教學競賽一等獎。
1992-1996年就讀于華中科技大學(原華中理工大學)信息管理與信息系統(tǒng)專業(yè),1996年獲得工學學士學位,1999年于華中科技大學管理學院獲得管理科學與工程碩士學位,2003年于華中科技大學管理學院獲得管理科學與工程博士學位,2005年于華中科技大學自動控制系博士后出站。1999年畢業(yè)留校任教至今,一直工作在教學一線,具有扎實的學術(shù)功底和突出的教學能力,獨立主講本科生和研究生課程,其中主講4門本科生課程《數(shù)據(jù)結(jié)構(gòu)》、《管理信息系統(tǒng)》、《《數(shù)據(jù)庫技術(shù)及應(yīng)用》、管理統(tǒng)計學》。作為本科“數(shù)據(jù)結(jié)構(gòu)”課程組組長和MBA“互聯(lián)網(wǎng)環(huán)境中的組織管理”課程組組長,堅持組織新課開設(shè)和課程研討。
主持“信息管理專業(yè)邊界再設(shè)計研究”和“大型實踐教學模式與管理類本科實驗教學中心建設(shè)研究”湖北教改項目2項。
目錄
第1章緒論1
1.1數(shù)據(jù)結(jié)構(gòu)與程序設(shè)計1
1.1.1學習數(shù)據(jù)結(jié)構(gòu)的意義1
1.1.2數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)2
1.1.3數(shù)據(jù)結(jié)構(gòu)的類型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
本章小結(jié)14
第2章線性表15
2.1線性表的基本概念15
2.1.1線性表的定義與特點15
2.1.2線性表的存儲結(jié)構(gòu)15
2.2順序表的算法實現(xiàn)17
2.2.1順序表的創(chuàng)建和插入19
2.2.2順序表內(nèi)結(jié)點的查找23
2.2.3順序表內(nèi)元素的刪除28
2.3單鏈表的算法實現(xiàn)30
2.3.1單鏈表的結(jié)點結(jié)構(gòu)和一般形式30
2.3.2單鏈表的創(chuàng)建和插入32
2.3.3單鏈表內(nèi)數(shù)據(jù)元素的查找37
2.3.4單鏈表內(nèi)數(shù)據(jù)元素的刪除40
2.3.5單鏈表的合并43
2.4雙向鏈表的算法實現(xiàn)47
2.4.1雙向鏈表的結(jié)點結(jié)構(gòu)和一般形式47
2.4.2雙向鏈表的創(chuàng)建和插入49
2.4.3雙向鏈表內(nèi)元素的查找53
2.4.4雙向鏈表內(nèi)元素的刪除55
2.5循環(huán)鏈表的算法實現(xiàn)57
2.5.1循環(huán)鏈表的結(jié)點結(jié)構(gòu)和一般形式57
2.5.2循環(huán)鏈表的創(chuàng)建58
2.6線性表的應(yīng)用——一元多項式的存儲和相加63
2.6.1一元多項式的存儲和相加的實現(xiàn)方式63
2.6.2一元多項式的存儲和相加的實現(xiàn)65
2.7STL的使用68
2.7.1STL簡介68
2.7.2STL應(yīng)用實例68
本章小結(jié)69
第3章棧與隊列71
3.1棧的基本概念71
3.1.1棧的定義與特點71
3.1.2棧的兩類存儲結(jié)構(gòu)71
3.2順序棧的算法實現(xiàn)72
3.2.1順序棧的建立和順序棧入棧72
3.2.2順序棧出棧74
3.3隊列的基本概念76
3.3.1隊列的定義與特點76
3.3.2隊列的存儲結(jié)構(gòu)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棧和隊列的應(yīng)用——算術(shù)表達式的轉(zhuǎn)化和求值89
本章小結(jié)96
第4章串97
4.1串的基本概念97
4.1.1串的定義與特點97
4.1.2串的存儲結(jié)構(gòu)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
本章小結(jié)114
第5章數(shù)組和廣義表115
5.1數(shù)組的基本概念115
5.1.1數(shù)組的定義與特點115
5.1.2數(shù)組的存儲結(jié)構(gòu)116
5.2特殊矩陣的壓縮存儲117
5.3矩陣的算法實現(xiàn)120
5.4廣義表的基本概念126
5.4.1廣義表的定義與圖形表示126
5.4.2廣義表的存儲結(jié)構(gòu)127
5.5廣義表的算法實現(xiàn)128
本章小結(jié)134
第6章樹和二叉樹135
6.1樹的基本概念135
6.1.1樹的定義與基本術(shù)語135
6.1.2樹的表示形式和存儲結(jié)構(gòu)136
6.2二叉樹的基本概念140
6.2.1二叉樹的定義與性質(zhì)140
6.2.2二叉樹的存儲結(jié)構(gòu)142
6.2.3樹、森林和二叉樹的轉(zhuǎn)換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哈夫曼樹及其應(yīng)用161
6.4.1哈夫曼樹與哈夫曼編碼161
6.4.2哈夫曼算法實現(xiàn)162
本章小結(jié)168
第7章圖169
7.1圖的基本概念169
7.1.1圖的定義和術(shù)語169
7.1.2圖的表示與存儲結(jié)構(gòu)173
7.2圖的構(gòu)造算法實現(xiàn)176
7.2.1圖的基本類定義176
7.2.2構(gòu)造順序表存儲的圖179
7.2.3構(gòu)造鄰接表存儲的無向圖與有向圖182
7.2.4構(gòu)造十字鏈表存儲的有向圖188
7.2.5構(gòu)造鄰接多重表存儲的無向圖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圖的應(yīng)用216
7.5.1拓撲排序216
7.5.2關(guān)鍵路徑220
7.5.3最短路徑——迪杰斯克拉算法225
7.5.4最短路徑——弗洛伊德算法229
本章小結(jié)234
第8章查找235
8.1查找的基本概念235
8.1.1查找的相關(guān)術(shù)語235
8.1.2查找表結(jié)構(gòu)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二叉排序樹建立及插入結(jié)點的過程251
8.5.3二叉排序樹刪除結(jié)點的過程251
8.5.4二叉排序樹的算法實現(xiàn)253
8.6平衡二叉樹及其算法實現(xiàn)258
8.6.1平衡二叉排序樹及其構(gòu)造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ù)的構(gòu)造方法282
8.8.3哈希沖突的處理方法283
8.8.4哈希表的算法實現(xiàn)285
本章小結(jié)289
第9章排序290
9.1排序的基本概念290
9.1.1排序相關(guān)術(shù)語介紹290
9.1.2常用的內(nèi)部排序算法類型簡介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各種內(nèi)部排序方法的比較321
9.7.1時間性能321
9.7.2空間性能321
9.7.3排序方法的穩(wěn)定性322
9.8外部排序322
本章小結(jié)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總結(jié)與思考331
附錄A文件夾結(jié)構(gòu)332
附錄BUML類圖334
B.1第2章線性表的相關(guān)類圖334
B.2第3章棧與隊列的相關(guān)類圖336
B.3第4章串的相關(guān)類圖337
B.4第5章數(shù)組和廣義表的相關(guān)類圖338
B.5第6章樹和二叉樹的相關(guān)類圖339
B.6第7章圖的相關(guān)類圖341
B.7第8章查找的相關(guān)類圖344
B.8第9章排序的相關(guān)類圖346
參考文獻347