本書以C語(yǔ)言為程序設(shè)計(jì)語(yǔ)言,通過算法、代碼、流程圖等多種表現(xiàn)形式詳細(xì)介紹了數(shù)據(jù)結(jié)構(gòu)的基本概念、邏輯特性和物理特性,對(duì)各種結(jié)構(gòu)定義了相應(yīng)的抽象數(shù)據(jù)類型,并給出了應(yīng)用實(shí)例。在各章節(jié)末尾,還提供了習(xí)題供讀者練習(xí)。
本書可作為高等院校計(jì)算機(jī)及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程的教材,也可作為計(jì)算機(jī)應(yīng)用開發(fā)人員的參考書。
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)及相關(guān)專業(yè)的一門專業(yè)基礎(chǔ)課程,也是重要的核心課程之一。通過數(shù)據(jù)結(jié)構(gòu)課程的學(xué)習(xí),學(xué)生應(yīng)掌握各種基本數(shù)據(jù)結(jié)構(gòu)的類型、存儲(chǔ)方式以及它們的基本操作,同時(shí)該課程也培養(yǎng)學(xué)生利用所學(xué)的概念和理論知識(shí),針對(duì)實(shí)際問題找到簡(jiǎn)潔適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)、存儲(chǔ)方式和方法的能力。掌握數(shù)據(jù)結(jié)構(gòu)知識(shí)是對(duì)程序設(shè)計(jì)人員最重要也是最基本的要求。
數(shù)據(jù)結(jié)構(gòu)一直給人復(fù)雜、難懂的印象,初學(xué)者往往對(duì)基本結(jié)構(gòu)的操作或者實(shí)際問題的處理思路不明確,不知如何下手,導(dǎo)致望而卻步。為了減少讀者學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)的畏難情緒,本書用盡量淺顯易懂的語(yǔ)言描述基本的概念和基礎(chǔ)知識(shí),除了用傳統(tǒng)的算法描述基本操作以外,對(duì)每個(gè)章節(jié)的重點(diǎn)操作都引入了C語(yǔ)言的代碼描述,讀者可以通過直接運(yùn)行代碼查看算法運(yùn)行的結(jié)果,了解操作的過程。本書在介紹理論知識(shí)的同時(shí),還引入了典型的實(shí)際問題,幫助讀者了解具體問題如何用所學(xué)的理論知識(shí)來解決。算法、代碼、流程等多種形式的表現(xiàn),都旨在提高初學(xué)者的程序分析和設(shè)計(jì)能力。每章節(jié)后還附有習(xí)題,以便讀者進(jìn)一步練習(xí)并檢驗(yàn)學(xué)習(xí)效果。
本書由長(zhǎng)期從事數(shù)據(jù)結(jié)構(gòu)課程教學(xué)的老師在總結(jié)了多年的教學(xué)實(shí)踐經(jīng)驗(yàn)的基礎(chǔ)上編寫而成,旨在提高學(xué)生的實(shí)踐動(dòng)手能力和理論聯(lián)系實(shí)際的能力。本書根據(jù)常規(guī)課時(shí)限定,刪去了部分非本科學(xué)生必須掌握的內(nèi)容,并增加了實(shí)際應(yīng)用內(nèi)容,教師可在實(shí)際教學(xué)中進(jìn)行調(diào)整。
本書可作為高等學(xué)校計(jì)算機(jī)及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程的教材,也可以作為計(jì)算機(jī)應(yīng)用開發(fā)人員的參考書。對(duì)于計(jì)算機(jī)及相關(guān)專業(yè),可講授52~64學(xué)時(shí),另進(jìn)行12學(xué)時(shí)左右的上機(jī)練習(xí);對(duì)于其他專業(yè),課時(shí)可適當(dāng)壓縮,講授32~48學(xué)時(shí)。
本書第1、8章由藺冰編寫,第2、4章由王祖儷編寫,第3章由吳春旺編寫,第5、6、7章由王翔編寫,王祖儷負(fù)責(zé)校閱各章,并對(duì)全書統(tǒng)稿、定稿。
由于作者水平有限,加上計(jì)算機(jī)科學(xué)技術(shù)發(fā)展迅速,書中難免有不妥和遺漏之處,懇請(qǐng)廣大讀者賜教。
第1章 緒論 1
1.1 什么是數(shù)據(jù)結(jié)構(gòu) 1
1.1.1 數(shù)據(jù)結(jié)構(gòu)基本概念 1
1.1.2 數(shù)據(jù)結(jié)構(gòu)圖形表示 2
1.2 什么是算法 3
1.2.1 算法概念 3
1.2.2 算法設(shè)計(jì)要求 3
1.2.3 算法復(fù)雜度 4
1.3 C語(yǔ)言要點(diǎn)回顧 7
1.3.1 基本數(shù)據(jù)類型 7
1.3.2 其他復(fù)合數(shù)據(jù)類型 8
1.3.3 指針數(shù)據(jù)類型 10
1.3.4 常用結(jié)構(gòu)及函數(shù) 12
習(xí)題 15
第2章 線性表 17
2.1 線性表的邏輯結(jié)構(gòu) 17
2.1.1 線性表的概念 17
2.1.2 線性表的抽象數(shù)據(jù)類型 18
2.2 線性表的順序結(jié)構(gòu)及基本運(yùn)算實(shí)現(xiàn) 19
2.2.1 線性表的順序表示 19
2.2.2 順序表的基本運(yùn)算 20
2.3 線性表的鏈?zhǔn)浇Y(jié)構(gòu)及基本運(yùn)算實(shí)現(xiàn) 32
2.3.1 單鏈表的表示 32
2.3.2 單鏈表的操作實(shí)現(xiàn) 34
2.3.3 單循環(huán)鏈表 44
2.3.4 雙向鏈表 48
2.3.5 靜態(tài)鏈表 49
2.4 線性表綜合運(yùn)用 52
2.4.1 一元多項(xiàng)式的加減法 52
2.4.2 約瑟夫環(huán) 55
習(xí)題 58
第3章 棧和隊(duì)列 59
3.1 棧的基本概念 59
3.1.1 棧的定義 59
3.1.2 棧的抽象數(shù)據(jù)類型 60
3.2 棧的表示與實(shí)現(xiàn) 60
3.2.1 棧的順序表示 60
3.2.2 棧的鏈?zhǔn)奖硎?63
3.3 棧的應(yīng)用 65
3.3.1 整數(shù)的數(shù)制轉(zhuǎn)換 65
3.3.2 判斷字符串是否為回文 69
3.4 隊(duì)列 70
3.4.1 隊(duì)列的基本定義與抽象數(shù)據(jù)類型 70
3.4.2 鏈隊(duì)列 72
3.4.3 循環(huán)隊(duì)列 80
習(xí)題 87
第4章 數(shù)組 88
4.1 數(shù)組的概念 88
4.2 數(shù)組的順序存儲(chǔ) 89
4.3 矩陣的壓縮存儲(chǔ) 89
4.3.1 對(duì)稱矩陣 90
4.3.2 稀疏矩陣 91
習(xí)題 100
第5章 樹 101
5.1 樹的相關(guān)基本概念 101
5.1.1 樹的定義與基本術(shù)語(yǔ) 101
5.1.2 樹的抽象數(shù)據(jù)類型定義 103
5.1.3 樹的存儲(chǔ)結(jié)構(gòu)表示 105
5.2 二叉樹 109
5.2.1 二叉樹的定義 109
5.2.2 二叉樹的性質(zhì) 112
5.2.3 二叉樹的存儲(chǔ)結(jié)構(gòu) 114
5.3 二叉樹常用操作 117
5.3.1 二叉鏈表結(jié)構(gòu)下的常用操作 117
5.3.2 順序存儲(chǔ)結(jié)構(gòu)下的常用操作 139
5.3.3 反推二叉樹結(jié)構(gòu) 150
5.4 線索二叉樹 151
5.4.1 線索二叉樹原理 151
5.4.2 線索二叉樹的結(jié)構(gòu)實(shí)現(xiàn) 152
5.4.3 線索二叉樹的遍歷 154
5.5 樹、森林和二叉樹的轉(zhuǎn)換 156
5.5.1 樹轉(zhuǎn)換為二叉樹 157
5.5.2 森林轉(zhuǎn)換為二叉樹 157
5.5.3 二叉樹轉(zhuǎn)換為樹 158
5.5.4 二叉樹轉(zhuǎn)換為森林 158
5.5.5 樹和森林的遍歷 159
5.6 哈夫曼樹及其應(yīng)用 159
5.6.1 最優(yōu)二叉樹(哈夫曼樹)的定義 159
5.6.2 最優(yōu)二叉樹(哈夫曼樹)的應(yīng)用 160
5.6.3 最優(yōu)二叉樹(哈夫曼樹)的創(chuàng)建 163
習(xí)題 171
第6章 圖 174
6.1 圖的基本概念 174
6.1.1 圖的定義和術(shù)語(yǔ) 174
6.1.2 圖的抽象數(shù)據(jù)類型定義 179
6.2 圖的存儲(chǔ)結(jié)構(gòu) 181
6.2.1 鄰接矩陣表示法 181
6.2.2 鄰接表/逆鄰接表表示法 186
6.2.3 十字鏈表表示法 190
6.3 圖的遍歷 192
6.3.1 深度優(yōu)先遍歷 193
6.3.2 廣度優(yōu)先遍歷 199
6.4 最小生成樹 202
6.4.1 普里姆(Prim)算法 203
6.4.2 克魯斯卡爾(Kruskal)算法 209
6.5 有向無(wú)環(huán)圖及其應(yīng)用 215
6.5.1 拓?fù)渑判騿栴} 215
6.5.2 關(guān)鍵路徑問題 219
6.6 最短路徑 224
習(xí)題 230
第7章 查找 233
7.1 查找表及其相關(guān)概念 233
7.2 順序表的查找 235
7.3 有序表的查找 237
7.4 索引表的查找 243
7.5 二叉排序樹 245
7.5.1 二叉排序樹的查找 246
7.5.2 二叉排序樹的插入和創(chuàng)建 248
7.5.3 二叉排序樹的刪除 250
7.5.4 二叉排序樹的總結(jié) 257
7.6 平衡二叉樹 257
7.6.1 平衡二叉樹實(shí)現(xiàn)原理 259
7.6.2 平衡二叉樹的實(shí)現(xiàn)代碼 264
7.7 哈希查找 271
7.7.1 哈希查找概述 271
7.7.2 哈希函數(shù)的構(gòu)造方法 273
7.7.3 處理哈希沖突的方法 275
7.7.4 哈希查找的性能分析 279
習(xí)題 280
第8章 排序 282
8.1 排序概述 282
8.2 插入排序 282
8.2.1 直接插入排序 282
8.2.2 希爾排序 284
8.3 交換排序 286
8.3.1 冒泡排序 286
8.3.2 快速排序 288
8.4 選擇排序 290
8.4.1 簡(jiǎn)單選擇排序 290
8.4.2 堆排序 292
8.5 歸并排序 297
8.6 基數(shù)排序 299
8.7 排序方法的總結(jié) 306
習(xí)題 306