本書以提高學生的算法設計與分析能力為主旨, 全面地介紹了程序設計的基礎知識、各種常用的數據結構以及排序、查找的各種算法及它們的應用。為了方便教學, 各數據結構類型和基本運算首先用類C代碼加以描述, 并作了詳細的注解。全書既注重原理, 又強調實踐, 配有大量的圖表和習題, 概念講解清楚, 邏輯性強, 可讀性好。
既注重原理,又強調實踐,配有大量的圖表和習題,概念講解清楚,邏輯性強,可讀性好
大數據時代已經到來,數據與算法是數據科學與工程的重要內容,而“數據結構”是計算機算法設計的重要理論和方法基礎,它不僅是計算機類專業的核心課程,而且已成為其他專業的重要教學內容。“數據結構與算法”的教學目的是:讓學生學會分析需要計算機處理的數據對象的特性,以選擇適當的數據結構、存儲結構從而選擇相應的算法;初步掌握算法性能分析的方法;初步掌握將實際問題求解轉化為算法,進而轉化為計算機程序的能力;通過本課程的學習,使學生獲得更進一步的程序設計技能訓練,提高編程能力,進而提高計算機軟件工程能力。
長久以來由于數據結構課程自身的抽象和嚴密,以及數據結構開設的時間通常在大一的第二學期,教師感覺數據結構難教,學生普遍反映數據結構難學,學生很難獨立完成算法的實現。基于上述問題我們在編寫本教材時充分考慮了學生的知識結構和教師的教學方法。本教材的編寫遵循的原則是:既注重原理又注重實踐;既注重抽象思維又注重形象思維;既方便自學又方便教學。本書的編寫有以下特色。
(1)采用“任務驅動”方式來設計教學內容。除第1章外,在每一章,必要的基礎知識介紹后都安排了一個問題作為學習完本章后要解決的“任務”。該問題具有兩個特征:①有一定的趣味性,能較好地激發學生的學習興趣和解決問題的動力;②綜合性較強,問題的解決需要使用到本章中的知識。
(2)利用教材中的“思考”標志,提出問題拓展學生思維。“思考”不同于“習題”,“習題”的作用代替不了“思考”,因為“習題”在每個章節之后,一般要等到講完一個章節才會遇到,因此“習題”對于課堂教學是滯后的。采用提示“思考”的方式可以在教學中恰到好處地啟發學生的思維。教材使用“思考”標志通常有3種情況:一是提醒學生注意;二是啟發學生基于當前知識基礎進一步思考;三是提示本教材沒有講授的內容以引導學有余力的學生拓展自身知識面。另外,這些標志為“思考”的問題,可方便地應用于“翻轉課堂”教學模式。
(3)在計算機專業的核心基礎課程中增加計算機科學文化的知識,使學生在學習本教材的過程中,不但能學到專業知識,還能了解計算機科學發展歷史的相關知識和數據結構課程與其他課程的聯系;對提高學生學習本課程的興趣,拓寬學生的知識面大有好處。
全書共分8章:第1章介紹數據結構和算法分析的基本概念及程序設計基礎;第2~4章介紹線性結構及一部分與線性結構密切相關的非線性結構;第5章和第6章分別介紹樹形結構和圖結構;第7章和第8章分別介紹排序和查找。
本書可作為技術應用型本科院校計算機專業教材,也可為參加全國計算機軟件水平程序員級別考試提供參考,還可供廣大從事計算機應用的科技人員參考。本書講授60課時左右,除第1章外每章可安排2課時上機實習。
本書是由文益民、張瑞霞、李健三位在多年從事計算機專業數據結構課程教學的經驗基礎上,經過多次反復磋商和共同討論而定稿。全書由桂林電子科技大學文益民整體構思、統稿、修改,易新河、文博奚等為本書的編輯、排版做了很多工作。
由于編著者水平有限,書中難免存在不足和疏漏之處,殷切期望廣大讀者批評指正。
文益民
2017年1月于桂林電子科技大學
第1章緒論
1.1數據結構的基本概念
1.1.1數據結構的實例
1.1.2數據結構的概念
1.1.3學習數據結構的理由
1.2算法分析的基本概念
1.2.1算法
1.2.2算法效率的分析
1.2.3算法效率的評價
1.3程序設計基礎
1.3.1軟件工程的基本概念
1.3.2軟件設計基礎
1.3.3編碼基礎
1.3.4計算機體系結構基礎
習題1
第2章線性表
2.1線性表的基本概念
2.1.1線性表的基本運算
2.1.2一個有趣的問題
2.2線性表的順序表示
2.2.1順序表
2.2.2順序表的基本運算
2.2.3順序表的算法分析
2.3線性表的鏈式表示
2.3.1線性鏈表
2.3.2線性鏈表的基本運算
2.3.3順序表和鏈式表的比較
2.4雙鏈表和循環鏈表
2.4.1雙鏈表
2.4.2循環鏈表
2.5線性表的應用
習題2
第3章棧和隊列
3.1棧的概念及運算
3.1.1棧的概念
3.1.2棧的基本運算
3.1.3一個有趣的問題
3.2棧的存儲和實現
3.2.1棧的順序表示
3.2.2棧的鏈式表示
3.3棧的應用
3.3.1數制轉換
3.3.2表達式求值
3.3.3棧與遞歸
3.3.4回溯法
3.4隊列的概念及基本運算
3.4.1隊列的概念
3.4.2隊列的基本運算
3.4.3一個有趣的問題
3.5隊列的存儲結構及運算
3.5.1隊列的順序表示
3.5.2循環隊列
3.5.3隊列的鏈式表示
3.6隊列的應用
習題3
第4章串、廣義表及數組
4.1串的定義和基本運算
4.1.1串的定義
4.1.2串的基本運算
4.1.3一個有趣的問題
4.1.4串的定長順序存儲
4.1.5模式匹配
4.1.6串的鏈式存儲結構
4.1.7串的應用
4.2廣義表
4.2.1廣義表的定義
4.2.2廣義表的存儲
4.3數組
4.3.1數組的定義和存儲
4.3.2特殊矩陣的壓縮存儲
習題4
第5章樹
5.1樹的概念及基本運算
5.1.1樹的概念
5.1.2樹的基本術語
5.1.3樹的基本運算
5.1.4一個有趣的問題
5.1.5樹的存儲
5.2二叉樹的概念與性質
5.2.1二叉樹的概念及基本運算
5.2.2二叉樹的性質
5.2.3二叉樹的存儲
5.3二叉樹的遍歷
5.4二叉樹遍歷算法的應用
5.5線索二叉樹
5.6樹和二叉樹
5.6.1樹與二叉樹的轉換
5.6.2二叉樹與森林的轉換
5.7哈夫曼樹及其應用
5.8樹的應用
習題5
第6章圖
6.1圖的概念及運算
6.1.1圖的概念
6.1.2圖的基本運算
6.1.3一個有趣的問題
6.2圖的存儲
6.2.1數組表示
6.2.2鄰接表表示
6.3圖的遍歷
6.3.1深度優先搜索遍歷
6.3.2廣度優先搜索遍歷
6.4圖的連通性問題
6.4.1無向圖的連通性
6.4.2最小生成樹
6.4.3Prim算法
6.4.4Kruskal算法
6.5最短路徑
6.5.1單源點最短路徑
6.5.2任意一對頂點之間的最短路徑
6.6有向無環圖的應用
6.6.1AOV網
6.6.2拓撲排序
6.6.3AOE網
6.6.4關鍵路徑
6.7圖的應用
習題6
第7章排序
7.1排序的基本概念
7.2一個有趣的問題
7.3插入排序
7.3.1直接插入排序
7.3.2折半插入排序
7.3.3希爾排序
7.4交換排序
7.4.1冒泡排序
7.4.2快速排序
7.5選擇排序
7.5.1直接選擇排序
7.5.2樹形選擇排序
7.5.3堆排序
7.6歸并排序
7.7排序的應用
7.8各種排序方法的綜合比較
習題7
第8章查找
8.1查找的基本概念
8.2一個有趣的問題
8.3靜態查找表
8.3.1順序查找法
8.3.2折半查找法
8.3.3分塊查找法
8.4動態查找表
8.5B-樹
8.6哈希表
8.6.1哈希法與哈希表
8.6.2沖突處理的方法
8.6.3哈希函數的構造方法
8.6.4哈希表的查找
8.7查找的應用
習題8
參考文獻