圖書簡介
本書的特色是在源碼級別而不是算法級別上討論數據結構,給出的程式構建能幫助學生掌握數據結構程式設計和提高綜合運用數據結構的能力。全書共分15章,按照基礎知識、理論知識和套用等3部分來編寫。第一部分包括數據結構的基本概念、C++複習與歸納、遞歸思想,第二部分包括線性數據結構、非線性數據結構,第三部分包括查找、排序等套用。
本書可作為高等院校理論與套用型本科層次計算機相關專業教材,還適用於高職高專層次各類學校參考使用,也可作為計算機崗位培訓和計算機愛好者自學用書。
前言
任何希望掌握電腦程式設計的學生首先要了解由三門課程構成了程式設計理論底層的黃金三角形,分別是高級語言、數據結構、算法設計與分析。高級語言偏重語法的描述和細節程式設計等能力培養,數據結構重點討論程式設計中如何分析、規劃和存儲實現相關的數據以及關係,算法設計則偏重解題思路的實現。大部分算法設計首先依賴於數據結構的構造,這將深遠影響到程式的時間效率和空間效率,以及程式結構的合理性和程式閱讀的簡易性。計算機界著名人士尼克勞斯·沃思(Wirth N.)提出的“算法+數據結構=程式”的觀點正說明數據結構的重要性,即使在面向過程轉向面向對象程式設計的今天,對象底層的函式實現依然能體現這句至理名言的準確性。
本人從事數據結構教學已有近三十年,多年教學實踐中深深體會到數據結構是計算機專業的一門很難的課程,學生普遍反映過於抽象和難以編程實現。這反映了幾個現實問題: 其一,高級語言課程所教授的內容離數據結構編程需求有一定的距離,高級語言教程通常更多討論的是數值計算方面的程式設計範例,對於離散結構的討論相對偏少。其二,算法設計是數據結構的後續課程,很多設計思想在數據結構課程中暫時無法起到引導作用。其三,從數據結構本身看,教材結構或書寫方式有時成了學習過程的阻礙。部分數據結構教材偏重理論,全部用算法表述數據結構相關程式設計思想,導致學生可以模仿編程的範例不夠,實際效果不大理想。部分教材由於源於翻譯國外教材的原因,術語和描述生澀難懂。部分教材重點難點不突出,整體結構不完整,增加了學生的學習困難。
學習數據結構是一種“痛並快樂著”的過程,在學習的時候大部分學生都會感到過於抽象和高深,但是如果能用程式具體實現,就會感到成就感,會多次被計算機科學家的奇思妙想所震撼,會發現程式設計非常的引人入勝,會發現整個過程是充滿挑戰和樂趣的。
本教材最大的特色就是全面給出數據結構的相關程式構建源碼,使得學生有一個可以研究、探討、模仿、提高的平台。提供的程式構建範例都具有實用性和趣味性,覆蓋了多種程式設計方法和界面設計風格,供學生研究使用。
全書體系結構完整、注重原理與實踐結合,重點和難點突出,為學生搭建了一個很全面的學習研究平台。其目標是努力滿足學生易於學習,老師易於組織教學。鑒於部分學生C++的編程能力不能滿足數據結構課程的要求,本教材全面提供了各種程式界面的細節設計。數據輸入方面提供了鍵盤輸入、內部預置、隨機產生、檔案讀入等多種方式供讀者模仿學習。遞歸思想在數據結構的討論中大量出現,本教材單獨一章先行討論,給學生提供了一個良好的基礎。排序在完成線性表之後先講基本部分,體現了線性表的實際使用,而進階部分涉及到更複雜的數據結構,放在大部分數據結構學習完成之後講解。另外為了較為全面地體現數據結構的整體關係,本教材專門討論了廣義表的實現,這部分構成了線性結構和非線性結構的橋樑,供學生了解掌握。
全書共分15章,按照數據結構學習的基礎知識、理論知識和套用等三大部分來編寫。第一部分涉及學習數據結構的基本概念、C++複習與歸納、遞歸思想,第二部分涉及線性數據結構、非線性數據結構,包含線性表、棧、佇列、字元串、二維數組、樹和森林、二叉樹、圖。第三部分涉及查找、排序等基礎套用。為了拓展數據結構的知識,介紹了廣義表和檔案的基礎內容。
本書配有電子教案和程式原始碼,便於老師和學生教學使用。本書採用C++語言編程實現,程式均在VC++6.0下調試運行通過。
數據結構是程式開發的基礎,是進入程式設計殿堂的敲門磚。本教材是我多年來勤懇敬業、認真教學和仔細思考的結晶,在付出了很多艱辛之後終於有了今天的收穫,希望讀者能分享和品味學習的樂趣。
我要感謝我的父母,他們給予了我生命和不斷進步的力量,也希望在此專門表達對我愛妻的感激,能寫出這本教材,也是對她幾十年給我無微不至的關懷和幫助的最好回報,在我的心中她是一個完美的女性,還有我諸多朋友的鼓勵和支持讓我不能忘懷。
我要感謝我多年前在清華大學研習人工智慧研究生課程指導老師石純一教授,他對專業的精通、做事的認真以及平易近人的態度讓我的一生都受益匪淺,那段時光是我一生的回憶和驕傲。
我非常感謝我的領導和同事,在我多年講授數據結構過程中給予我很多的支持和鼓勵。他們是蔣偉榮教授、姜木霖教授、史旅華教授、付勇智教授、陳宇峰教授,還有朱賢成主任、陳利老師、袁科老師、張吳波老師、梅琴老師、裘子煦老師對我的幫助。
本書能夠順利出版,得益於清華大學出版社劉向威博士全力的支持和鼓勵,以及細緻的審稿和深入全面的建議,深深地感謝他。
我要感謝多年來參與程式編寫測試、文字校對的學生團隊,他們當中有許多我的得意弟子。如文貴華、馬哲江、王康、吳倩、張鑫、劉鑫、傅四意、劉傑、陳洪艷、吳清霞、余新、張世傑等等。
本教材由付勇智老師幫助書寫了第2章與第15章,內蒙古師範大學孟繁軍老師幫助書寫了第10章的部分程式源碼,其他部分由本人完成。
各位老師可以來信聯繫程式源碼和其他教學資料,希望讀者提出寶貴的意見和建議,以便再版時改進和提高。
馬春江於湖北汽車工業學院
2012年5月
目錄
第1章數據結構基礎
1.1面式思維和點式思維
1.2數據結構背景
1.3數據結構的套用案例
1.4數據結構基本概念
1.5邏輯結構分類
1.6存儲結構分類
1.7數據結構基本操作
1.8算法和算法效率分析基礎
1.9對象的設計
1.10C++語言常見知識點複習系統程式構建
1.11本章總結
習題
第2章遞歸思想與程式構建
2.1引言
2.2簡單遞歸思想
2.3複雜遞歸思想
2.4遞歸思想套用的程式構建
2.5本章總結
習題
第3章線性表的構造與套用
3.1引言
3.2線性表的邏輯結構
3.3線性表的順序存儲
3.4線性表的連結存儲
3.5線性表連結存儲的變形
3.6線性表的靜態鍊表實現
3.7線性表的套用案例
3.8線性表套用的程式構建
3.9本章總結
習題
第4章排序程式設計初步
4.1引言
4.2排序操作的基本概念
4.3基本排序算法設計
4.3.1排序算法設計基礎
4.3.2直接插入排序(Direct Insert Sorting)
4.3.3簡單選擇排序(Simple Select Sorting)
4.3.4冒泡排序(Bubble Sorting)
4.3.5靜態鍊表插入排序(Static Link Insert Sorting)
4.4基本排序程式設計實現
4.5排序的套用案例
4.6基本排序套用的程式構建
4.7本章總結
習題
第5章棧的構造與套用
5.1引言
5.2棧的邏輯結構
5.3棧的順序存儲
5.4棧的連結存儲
5.5棧的套用案例
5.6棧套用的程式構建
5.7本章總結
習題
第6章佇列的構造與套用
6.1引言
6.2佇列的邏輯結構
6.3佇列的順序存儲
6.4佇列的環狀順序存儲
6.5佇列的連結存儲
6.6佇列的套用案例
6.7佇列套用的程式構建
6.8本章總結
習題
第7章串的構造與套用
7.1引言
7.2串的邏輯結構
7.3串的順序存儲
7.4串的連結存儲
7.5串的索引存儲
7.6串的套用案例
7.7串套用的程式構建
7.8本章總結
習題
第8章二維數組的構造與套用
8.1引言
8.2二維數組的邏輯結構
8.3二維數組的順序存儲
8.4特殊矩陣的壓縮存儲
8.5稀疏矩陣的壓縮存儲
8.6稀疏矩陣的十字鍊表存儲
8.7二維數組的套用案例
8.8程式設計案例小型遊戲推箱子軟體
8.9本章總結
習題
第9章廣義表的構造與套用
9.1引言
9.2廣義表的邏輯結構
9.3廣義表的連結存儲
9.4表結構的套用案例
9.5廣義表套用的程式構建
9.6本章總結
習題
第10章樹和森林的構造與套用
10.1引言
10.2樹的邏輯結構
10.3樹的順序存儲
10.4樹的連結存儲
10.5樹的順序和連結聯合存儲法
10.6樹的套用案例
10.7本章總結
習題
第11章二叉樹的構造與套用
11.1引言
11.2二叉樹的邏輯結構
11.3二叉樹的順序存儲
11.4二叉樹的連結存儲
11.5二叉樹的根序遍歷和程式設計
11.5.1根序遍歷的定義和遞歸算法實現
11.5.2根序遍歷的非遞歸算法實現
11.6二叉樹的層次遍歷和程式設計
11.7二叉樹其他相關程式構建
11.8線索二叉樹
11.8.1線索二叉樹的定義、邏輯結構及存儲結構
11.8.2線索二叉樹的算法設計
11.9二叉樹的套用案例
11.10樹、森林和二叉樹的關係
11.11二叉樹套用的程式構建
11.12本章總結
習題
第12章圖的構造與套用
12.1引言
12.2圖的邏輯結構
12.3圖的順序存儲
12.4圖的連結存儲
12.5遍歷操作的程式設計
12.6公路網最短路徑的研究
12.7AOV網與拓撲排序的研究
12.8圖套用的程式構建
12.8.1最小生成樹的定義
12.8.2構造最小生成樹的Prim算法
12.8.3構造最小生成樹的Kruskal算法
12.9本章總結
習題
第13章查找程式設計
13.1引言
13.2查找的基本概念
13.3基於靜態數據結構的查找
13.3.1靜態查找表與順序查找
13.3.2有序表的折半查找
13.3.3有序表的斐波那契查找和插值查找
13.3.4分塊查找
13.4基於動態數據結構的查找
13.4.1二叉排序樹與相應的查找技術
13.4.2平衡二叉樹
13.5基於哈希表結構的查找
13.5.1哈希表的定義和構成
13.5.2常見的哈希函式
13.5.3哈希表的查找過程和衝突解決方法
13.6基於字元串結構的快速查找
13.7查找的套用案例
13.8查找套用的程式構建
13.9本章總結
習題
第14章排序程式設計進階
14.1引言
14.2折半插入排序技術
14.3希爾排序技術
14.4快速排序技術
14.5樹形選擇排序技術
14.6堆排序技術
14.7歸併排序技術
14.8基數排序技術
14.9複雜排序程式設計實現
14.10複雜排序套用的程式構建
14.11本章總結
習題
第15章檔案結構初步
15.1引言
15.2檔案的邏輯結構
15.3順序檔案
15.4索引檔案
15.5索引順序存取方法檔案
15.6虛擬存儲存取方法檔案
15.7直接存取檔案(散列檔案)
15.8多重表檔案和倒排檔案
15.9檔案的套用案例
15.10檔案套用的程式構建
15.11本章總結
習題
參考文獻