本實驗指導(dǎo)教程是配合計算機及相關(guān)專業(yè)的“數(shù)據(jù)結(jié)構(gòu)”課程而編寫的。在內(nèi)容編排方面,按照循序漸進、由淺入深的順序設(shè)計、選取案例。全書共分兩個部分:第一部分為“數(shù)據(jù)結(jié)構(gòu)實驗”;第二部分為“數(shù)據(jù)結(jié)構(gòu)課程設(shè)計”。
第一部分(包括第1~8章)針對每個知識點,首先給出明確的要求,隨后設(shè)計基礎(chǔ)實驗,特別是前幾章在基礎(chǔ)實驗之后,設(shè)計了若干應(yīng)用案例。這樣有利于學(xué)生明確知識點在應(yīng)用中如何使用,消除迷茫感、增強學(xué)習(xí)興趣。
第二部分(即第9章)是課程設(shè)計,介紹在一個項目中如何選擇和使用多種基本的數(shù)據(jù)結(jié)構(gòu),介紹如何有效地將它們?nèi)诤显谝黄穑鉀Q實際的復(fù)雜應(yīng)用問題。
本書可作為高等院校計算機及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程的實驗教材。
要學(xué)好數(shù)據(jù)結(jié)構(gòu),僅僅通過課堂教學(xué)或自學(xué)獲取理論知識是遠(yuǎn)遠(yuǎn)不夠的,還必須加強實際動手能力的訓(xùn)練。只有通過實驗課調(diào)試和運行已有的各種典型算法和已編寫的程序,從成功和失敗的經(jīng)驗中得到鍛煉,才能熟練掌握和運用理論知識解決軟件開發(fā)中的實際問題,達到學(xué)以致用的目的。
本實驗指導(dǎo)教程是配合計算機及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程而編寫的。本書在內(nèi)容編排方面,按照循序漸進、由淺入深的順序設(shè)計、選取案例。根據(jù)教學(xué)內(nèi)容,針對學(xué)生的實際情況,本書在內(nèi)容編排上共分兩個部分。第一部分為"數(shù)據(jù)結(jié)構(gòu)實驗";第二部分為"數(shù)據(jù)結(jié)構(gòu)課程設(shè)計"。
第一部分(包括第1~8章)針對每個知識點,首先給出明確的要求,隨后設(shè)計基礎(chǔ)實驗,特別是前幾章在基礎(chǔ)實驗之后,設(shè)計了若干應(yīng)用案例。這樣有利于學(xué)生明確知識點在應(yīng)用中如何使用,消除學(xué)生的迷茫感、增強學(xué)生的學(xué)習(xí)興趣。
第二部分(即第9章)是課程設(shè)計,介紹在一個項目中如何選擇和使用多種基本數(shù)據(jù)結(jié)構(gòu),介紹如何有效地將它們?nèi)诤显谝黄鸾鉀Q實際的復(fù)雜應(yīng)用問題。這有利于學(xué)生更深層次地掌握數(shù)據(jù)結(jié)構(gòu)原理及其應(yīng)用范圍和過程。
本書具有以下特點。
(1)基于案例驅(qū)動的教學(xué)內(nèi)容設(shè)計。在實驗案例的選擇方面,不僅有針對知識點的基礎(chǔ)案例,而且有對應(yīng)的應(yīng)用案例,從而使學(xué)生能夠消除畏難情緒。我們在該實驗教材的編寫過程中,選擇案例時由淺入深并精心設(shè)計了應(yīng)用案例,以確保應(yīng)用的完整性。
(2)提供大量的源代碼和開發(fā)案例。在該實驗教材的編寫中,摒棄了偽代碼的描述,全部采用C語言源代碼,這些源代碼都是經(jīng)過調(diào)試并且在教學(xué)過程中已經(jīng)應(yīng)用的,學(xué)生可以直接分析和模仿。同時,在重要的章節(jié),都提供了較為深入的設(shè)計案例,例如多項式的運算、括號匹配判斷系統(tǒng)、迷宮求解系統(tǒng)、*短路徑求解等,為學(xué)生提供了更為深入的源碼討論和模仿的機會,極大地提高了教材的全面性、深入性和綜合性。
(3)提供典型的課程設(shè)計內(nèi)容。為了更好地提高學(xué)生的專業(yè)技能訓(xùn)練水平以及提高學(xué)生的學(xué)習(xí)興趣,在本書的編寫過程中,編寫成員根據(jù)自己多年教學(xué)的積累,整理出了適合計算機專業(yè)學(xué)生實際情況的課程設(shè)計題目,并提供了相應(yīng)的解決思路和源代碼,為學(xué)生提供了很好的學(xué)習(xí)機會和訓(xùn)練機會。
前 言
數(shù)據(jù)結(jié)構(gòu)是計算機及相關(guān)專業(yè)中一門重要的專業(yè)基礎(chǔ)課程。用計算機解決實際問題時,就要涉及數(shù)據(jù)的表示及數(shù)據(jù)的處理,而這正是數(shù)據(jù)結(jié)構(gòu)課程的主要研究對象。通過對數(shù)據(jù)結(jié)構(gòu)知識內(nèi)容的學(xué)習(xí),可以為后續(xù)課程,尤其是軟件方面的課程打下堅實的基礎(chǔ),同時,也提供了必要的技能訓(xùn)練。此課程的學(xué)習(xí)質(zhì)量將直接影響計算機軟件系列課程的學(xué)習(xí)效果,因此,數(shù)據(jù)結(jié)構(gòu)課程在計算機專業(yè)中具有舉足輕重的作用。
根據(jù)我們多年的教學(xué)經(jīng)驗,認(rèn)為學(xué)生學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的主要困難在于解題。學(xué)生在解題中經(jīng)常會出現(xiàn)錯誤,原因在于實踐能力不足。
要學(xué)好數(shù)據(jù)結(jié)構(gòu),僅僅通過課堂教學(xué)或自學(xué)獲取理論知識是遠(yuǎn)遠(yuǎn)不夠的,還必須加強實際動手能力的訓(xùn)練。只有通過實驗課調(diào)試和運行已有的各種典型算法和已編寫的程序,從成功和失敗的經(jīng)驗中得到鍛煉,才能熟練掌握和運用理論知識解決軟件開發(fā)中的實際問題,達到學(xué)以致用的目的。
本實驗指導(dǎo)教程是配合計算機及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程而編寫的。本書在內(nèi)容編排方面,按照循序漸進、由淺入深的順序設(shè)計、選取案例。根據(jù)教學(xué)內(nèi)容,針對學(xué)生的實際情況,本書在內(nèi)容編排上共分兩個部分。第一部分為"數(shù)據(jù)結(jié)構(gòu)實驗";第二部分為"數(shù)據(jù)結(jié)構(gòu)課程設(shè)計"。
第一部分(包括第1~8章)針對每個知識點,首先給出明確的要求,隨后設(shè)計基礎(chǔ)實驗,特別是前幾章在基礎(chǔ)實驗之后,設(shè)計了若干應(yīng)用案例。這樣有利于學(xué)生明確知識點在應(yīng)用中如何使用,消除學(xué)生的迷茫感、增強學(xué)生的學(xué)習(xí)興趣。
第二部分(即第9章)是課程設(shè)計,介紹在一個項目中如何選擇和使用多種基本數(shù)據(jù)結(jié)構(gòu),介紹如何有效地將它們?nèi)诤显谝黄鸾鉀Q實際的復(fù)雜應(yīng)用問題。這有利于學(xué)生更深層次地掌握數(shù)據(jù)結(jié)構(gòu)原理及其應(yīng)用范圍和過程。
本書具有以下特點。
(1) 基于案例驅(qū)動的教學(xué)內(nèi)容設(shè)計。在實驗案例的選擇方面,不僅有針對知識點的基礎(chǔ)案例,而且有對應(yīng)的應(yīng)用案例,從而使學(xué)生能夠消除畏難情緒。我們在該實驗教材的編寫過程中,選擇案例時由淺入深并精心設(shè)計了應(yīng)用案例,以確保應(yīng)用的完整性。
(2) 提供大量的源代碼和開發(fā)案例。在該實驗教材的編寫中,摒棄了偽代碼的描述,全部采用C語言源代碼,這些源代碼都是經(jīng)過調(diào)試并且在教學(xué)過程中已經(jīng)應(yīng)用的,學(xué)生可以直接分析和模仿。同時,在重要的章節(jié),都提供了較為深入的設(shè)計案例,例如多項式的運算、括號匹配判斷系統(tǒng)、迷宮求解系統(tǒng)、最短路徑求解等,為學(xué)生提供了更為深入的源碼討論和模仿的機會,極大地提高了教材的全面性、深入性和綜合性。
(3) 提供典型的課程設(shè)計內(nèi)容。為了更好地提高學(xué)生的專業(yè)技能訓(xùn)練水平以及提高學(xué)生的學(xué)習(xí)興趣,在本書的編寫過程中,編寫成員根據(jù)自己多年教學(xué)的積累,整理出了適合計算機專業(yè)學(xué)生實際情況的課程設(shè)計題目,并提供了相應(yīng)的解決思路和源代碼,為學(xué)生提供了很好的學(xué)習(xí)機會和訓(xùn)練機會。
本書提供案例程序的源代碼(可運行),并贈送C++版案例實驗教程。讀者可以從清華大學(xué)出版社的網(wǎng)站下載。
本書可作為高等院校計算機及相關(guān)專業(yè)數(shù)據(jù)結(jié)構(gòu)課程的實驗教材。
由于編者水平有限,錯誤和不當(dāng)之處在所難免,希望讀者批評指正。
編 者
第1章 順序表 1
實驗1 順序表的實現(xiàn) 2
1.實驗?zāi)康?2
2.實驗內(nèi)容 2
3.算法設(shè)計 2
4.程序?qū)崿F(xiàn) 3
5.運行程序 5
實驗2 順序表的應(yīng)用--集合運算 5
1.實驗?zāi)康?5
2.實驗內(nèi)容 5
3.算法設(shè)計 5
4.程序?qū)崿F(xiàn) 6
5.運行程序 8
實驗3 順序表的應(yīng)用--回文數(shù)猜想 8
1.問題描述 8
2.基本要求 8
3.算法設(shè)計 8
4.程序?qū)崿F(xiàn) 9
5.運行程序 10
第2章 鏈表 11
實驗1 單鏈表的實現(xiàn) 12
1.實驗?zāi)康?12
2.實驗內(nèi)容 12
3.算法設(shè)計 12
4.程序?qū)崿F(xiàn) 13
5.運行程序 15
實驗2 單鏈表的應(yīng)用--約瑟夫問題 16
1.問題描述 16
2.基本要求 16
3.算法設(shè)計 16
4.程序?qū)崿F(xiàn) 16
5.運行程序 17
實驗3 單鏈表的應(yīng)用--多項式求和 18
1.問題描述 18
2.基本要求 18
3.算法設(shè)計 18
4.實現(xiàn)程序 18
5.運行程序 21
第3章 棧 23
實驗1 順序棧的實現(xiàn) 24
1.實驗?zāi)康?24
2.實驗內(nèi)容 24
3.算法設(shè)計 24
4.程序?qū)崿F(xiàn) 25
5.運行程序 26
實驗2 鏈棧的實現(xiàn) 26
1.實驗?zāi)康?26
2.實驗內(nèi)容 26
3.算法設(shè)計 27
4.程序?qū)崿F(xiàn) 27
5.程序運行 28
實驗3 棧的應(yīng)用--數(shù)制轉(zhuǎn)換 28
1.問題描述 28
2.基本要求 28
3.算法設(shè)計 29
4.程序?qū)崿F(xiàn) 29
5.運行程序 30
實驗4 棧的應(yīng)用--括號匹配問題 30
1.問題描述 30
2.基本要求 30
3.算法設(shè)計 30
4.程序?qū)崿F(xiàn) 30
5.運行程序 31
實驗5 棧的應(yīng)用--表達式求值 32
1.問題描述 32
2.基本要求 32
3.算法設(shè)計 32
4.程序?qū)崿F(xiàn) 32
5.運行程序 34
第4章 隊列 35
實驗1 循環(huán)隊列的實現(xiàn) 36
1.實驗?zāi)康?36
2.實驗內(nèi)容 36
3.算法設(shè)計 36
4.程序?qū)崿F(xiàn) 37
5.運行程序 38
實驗2 鏈隊列的實現(xiàn) 39
1.實驗?zāi)康?39
2.實驗內(nèi)容 39
3.算法設(shè)計 39
4.程序?qū)崿F(xiàn) 39
5.運行程序 41
實驗3 隊列的應(yīng)用--優(yōu)先隊列 41
1.問題描述 41
2.基本要求 41
3.算法設(shè)計 41
4.實現(xiàn)程序 42
5.運行程序 44
實驗4 隊列的應(yīng)用--雙端隊列 45
1.問題描述 45
2.基本要求 45
3.算法設(shè)計 45
4.程序?qū)崿F(xiàn) 45
5.運行程序 48
第5章 二叉樹 49
實驗1 二叉樹的建立 50
1.實驗?zāi)康?50
2.實驗內(nèi)容 50
3.算法設(shè)計 50
4.程序?qū)崿F(xiàn) 51
5.運行程序 51
實驗2 二叉樹的遍歷 52
1.實驗?zāi)康?52
2.實驗內(nèi)容 52
3.算法設(shè)計 52
4.程序?qū)崿F(xiàn) 53
5.運行程序 55
實驗3 二叉樹的高度、節(jié)點數(shù)、葉子
節(jié)點數(shù) 55
1.實驗?zāi)康?55
2.實驗內(nèi)容 55
3.算法設(shè)計 55
4.程序?qū)崿F(xiàn) 55
5.運行程序 57
實驗4 堆 57
1.問題描述 57
2.基本要求 57
3.算法設(shè)計 57
4.程序?qū)崿F(xiàn) 58
5.運行程序 60
第6章 圖 61
實驗1 圖的鄰接矩陣表示 62
1.實驗?zāi)康?62
2.實驗內(nèi)容 62
3.實現(xiàn)提示 62
4.程序?qū)崿F(xiàn) 62
5.運行程序 64
實驗2 圖的鄰接表表示 64
1.實驗?zāi)康?64
2.實驗內(nèi)容 64
3.實現(xiàn)提示 64
4.程序?qū)崿F(xiàn) 64
5.運行程序 66
實驗3 圖的深度優(yōu)先搜索 67
1.問題描述 67
2.基本要求 67
3.實現(xiàn)提示 67
4.程序?qū)崿F(xiàn) 67
5.運行程序 69
第7章 排序 71
實驗1 冒泡排序 72
1.實驗?zāi)康?72
2. 實驗內(nèi)容 72
3.實現(xiàn)提示 72
4.程序?qū)崿F(xiàn) 73
5.運行程序 74
實驗2 插入排序、選擇排序 74
1.實驗?zāi)康?74
2.實驗內(nèi)容 74
3.實現(xiàn)提示 75
4.程序?qū)崿F(xiàn) 75
5.運行程序 76
實驗3 歸并排序 76
1.實驗?zāi)康?76
2.實驗內(nèi)容 76
3.實現(xiàn)提示 76
4.實現(xiàn)程序 76
5.運行程序 78
實驗4 快速排序 78
1.實驗?zāi)康?78
2.實驗內(nèi)容 79
3.實現(xiàn)提示 79
4.程序?qū)崿F(xiàn) 79
5.運行程序 80
實驗5 堆排序 81
1.實驗?zāi)康?81
2.實驗內(nèi)容 81
3.實現(xiàn)提示 81
4.程序?qū)崿F(xiàn) 81
5.運行程序 82
第8章 查找 83
實驗1 折半查找 84
1.實驗?zāi)康?84
2.實驗內(nèi)容 84
3.實現(xiàn)提示 84
4.程序?qū)崿F(xiàn) 85
5.運行程序 86
實驗2 二叉排序樹查找 87
1.實驗?zāi)康?87
2.實驗內(nèi)容 87
3.實現(xiàn)提示 87
4.程序?qū)崿F(xiàn) 87
5.運行程序 89
實驗3 哈希查找 89
1.實驗?zāi)康?89
2.實驗內(nèi)容 89
3.實現(xiàn)提示 90
4.程序?qū)崿F(xiàn) 90
5.運行程序 91
第9章 課程設(shè)計 93
問題1 學(xué)生成績管理 94
1.問題描述 94
2.任務(wù)要求 94
3.程序?qū)崿F(xiàn) 95
4.運行結(jié)果 98
問題2 數(shù)據(jù)庫管理系統(tǒng) 98
1.問題描述 98
2.任務(wù)要求 98
3.分析與實現(xiàn) 99
4.程序?qū)崿F(xiàn) 101
5.運行結(jié)果 116
問題3 馬踏棋盤 117
1.問題描述 117
2.任務(wù)要求 117
3.分析與實現(xiàn) 117
4.運行結(jié)果 120
問題4 停車場管理 121
1.問題描述 121
2.任務(wù)要求 121
3.分析與實現(xiàn) 122
4.運行結(jié)果 126
問題5 大整數(shù)計算器 126
1.問題描述 126
2. 任務(wù)要求 127
3.分析與實現(xiàn) 127
4.運行結(jié)果 132
問題6 魔方陣 132
1.問題描述 132
2.任務(wù)要求 133
3.分析與實現(xiàn) 133
4.運行結(jié)果 134
問題7 本科生導(dǎo)師制問題 134
1.問題描述 134
2.任務(wù)要求 135
3.分析與實現(xiàn) 135
4.運行結(jié)果 144
問題8 電文的編碼和譯碼 145
1.問題描述 145
2.任務(wù)要求 145
3.分析與實現(xiàn) 145
4.運行結(jié)果 148
問題9 家族關(guān)系查詢系統(tǒng) 149
1.問題描述 149
2.任務(wù)要求 149
3.分析與實現(xiàn) 149
4.運行結(jié)果 161
問題10 地鐵建設(shè)問題 162
1.問題描述 162
2.任務(wù)要求 162
3.分析與實現(xiàn) 162
4.運行結(jié)果 165
問題11 校園導(dǎo)航 165
1.問題描述 165
2.任務(wù)要求 165
3.分析與實現(xiàn) 166
4.運行結(jié)果 169
參考文獻 170
第1章 順 序 表
本章要點
(1) 順序表的概念。
(2) 順序表的存儲。
(3) 順序表各種操作的實現(xiàn)。
學(xué)習(xí)目標(biāo)
(1) 理解順序表和線性表的區(qū)別和聯(lián)系。
(2) 掌握順序存儲結(jié)構(gòu)的數(shù)據(jù)類型定義方法。
(3) 掌握順序存儲結(jié)構(gòu)各種操作的實現(xiàn)。
(4) 掌握如何使用順序表來解決相關(guān)的應(yīng)用問題。
基本知識點
順序表是指線性表的順序存儲結(jié)構(gòu),順序表用一組地址連續(xù)的存儲單元依次存放線性表中的數(shù)據(jù)元素。順序存儲使用簡便、無須為表示表中元素間的邏輯關(guān)系而額外增加存儲空間,并且可以實現(xiàn)隨機存取。
實驗1 順序表的實現(xiàn)
1.實驗?zāi)康?br />
(1) 掌握順序表的存儲結(jié)構(gòu)。
(2) 驗證順序表及其基本操作的實現(xiàn)。
(3) 理解算法與程序的關(guān)系,能夠?qū)㈨樞虮硭惴ㄞD(zhuǎn)換為對應(yīng)的程序。
2.實驗內(nèi)容
(1) 初始化順序表。
(2) 在順序表的第i位插入元素。
(3) 刪除順序表的第i個元素。
(4) 輸出順序表。
(5) 判斷順序表是否為空。
(6) 判斷順序表是否滿。
(7) 求順序表第i個元素的值。
(8) 查找值為x的元素。
3.算法設(shè)計
用結(jié)構(gòu)體來描述順序表,結(jié)構(gòu)體中包括表的大小、存放數(shù)據(jù)的數(shù)組、表的最大容量三個數(shù)據(jù)屬性。
為簡單起見,本實驗假定線性表的數(shù)據(jù)元素為int型。
結(jié)構(gòu)體的定義如下:
typedef int dataType;
typedef struct {
dataType *data;
int size;
int maxSize;
} SqList;
應(yīng)實現(xiàn)順序表的初始化、插入、刪除、判空、判滿、求值、查找、輸出等操作。
(1) void InitList(SqList *l):初始化順序表。
(2) void Insert(SqList *l, int k, dataType x):在順序表l的第k個位置插入元素x。
(3) void Delete(SqList *l, int k):刪除順序表l的第k個元素。
(4) int Empty(SqList *l):判斷順序表是否為空。
(5) int Full(SqList *l):判斷順序表是否滿。
(6) dataType GetData(SqList *l, int i):求順序表l中第i個元素的值。
(7) int locate(SqList *l, dataType x):在順序表l中查找值為x的元素。
(8) void Print(SqList *l):輸出順序表。
4.程序?qū)崿F(xiàn)
程序完整的實現(xiàn)代碼如下:
#include
#include
#define INIT_SIZE 100
typedef int dataType;
typedef struct {
dataType *data;
int size;
int maxSize;
} SqList;
//初始化順序表
void InitList(SqList *l) {
l->data = (dataType*)malloc(INIT_SIZE * sizeof(dataType));
l->size = 0;
l->maxSize = INIT_SIZE;
}
//在順序表l的第k個位置插入元素x
void Insert(SqList *l, int k, dataType x) {
if (k<1 || k>l->size+1) exit(1);
if (l->size == l->maxSize) exit(1);
for (int i=l->size; i>=k; i--)
l->data[i] = l->data[i-1];
l->data[k-1] = x;
l->size++;
}
//刪除順序表l的第k個元素
void Delete(SqList *l, int k) {
if (k<1 || k>l->size) exit(1);
for (int i=k; isize; i++)
l->data[i-1] = l->data[i];
l->size--;
}
//判斷順序表是否為空
int Empty(SqList *l) {
return l->size == 0;
}
//判斷順序表是否滿
int Full(SqList *l) {
return l->size == l->maxSize;
}
//求順序表l中第i個元素的值
dataType GetData(SqList *l, int i) {
if (i<1 || i>l->size) exit(1);
return l->data[i-1];
}
//在順序表l中查找值為x的元素
int locate(SqList *l, dataType x) {
for (int i=0; isize; i++)
if (l->data[i] == x)
return i + 1;
return 0;
}
//輸出順序表
void Print(SqList *l) {
for (int i=0; isize; i++)
printf("%d ", l->data[i]);
printf("\n");
}
int main() {
SqList list, *pList=&list;
InitList(pList);
Insert(pList, 1, 10);
Insert(pList, 1, 20);
Delete(pList, 2);
Insert(pList, 1, 30);
Insert(pList, 1, 40);
Print(pList);
printf("%d", GetData(pList, 2));
}