産品特色
內容簡介
《大話數據結構》為超級暢銷書《大話設計模式》作者程傑潛心三年推齣的扛鼎之作!以一個計算機教師教學為場景,講解數據結構和相關算法的知識。通篇以一種趣味方式來敘述,大量引用瞭各種各樣的生活知識來類比,並充分運用圖形語言來體現抽象內容,對數據結構所涉及到的一些經典算法做到逐行分析、多算法比較。與市場上的同類數據結構圖書相比,本書內容趣味易讀,算法講解細緻深刻,是一本非常適閤自學的讀物。
作者簡介
程傑,一個被讀者譽為很適閤寫IT技術書的傢夥。《大話設計模式》作者。此書07年末齣版至今已經簡體版印刷9次、繁體版印刷6次,取得瞭較好的成績,開創瞭一種適閤國人閱讀的趣味講解IT知識的風格模式。其本人參與過政府、證券、遊戲、交通等多種行業的軟件開發及項目管理工作,也曾做過軟件培訓的教師。因曾有過兩年半高中數學教學的獨特經曆,使得其書作當中處處以初學者視角考慮和分析問題,他成為瞭當前很受歡迎的IT技術圖書作者之一。
內頁插圖
目錄
第1章 數據結構緒論
1.1 開場白
1.2 你數據結構怎麼學的?
1.3 數據結構起源
1.4 基本概念和術語
1.4.1 數據
1.4.2 數據元素
1.4.3 數據項
1.4.4 數據對象
1.4.5 數據結構
1.5 邏輯結構與物理結構
1.5.1 邏輯結構
1.5.2 物理結構
1.6 抽象數據類型
1.6.1 數據類型
1.6.2 抽象數據類型
1.7 總結迴顧
1.8 結尾語
第2章 算法
2.1 開場白
2.2 數據結構與算法關係
2.3 兩種算法的比較
2.4 算法定義
2.5 算法的特性
2.5.1 輸入輸齣
2.5.2 有窮性
2.5.3 確定性
2.5.4 可行性
2.6 算法設計的要求
2.6.1 正確性
2.6.2 可讀性
2.6.3 健壯性
2.6.4 時間效率高和存儲量低
2.7 算法效率的度量方法
2.7.1 事後統計方法
2.7.2 事前分析估算方法
2.8 函數的漸近增長
2.9 算法時間復雜度
2.9.1 算法時間復雜度定義
2.9.2 推導大O階方法
2.9.3 常數階
2.9.4 綫性階
2.9.5 對數階
2.9.6 平方階
2.10 常見的時間復雜度
2.11 最壞情況與平均情況
2.12 算法空間復雜度
2.13 總結迴顧
2.14 結尾語
第3章 綫性錶
3.1 開場白
3.2 綫性錶的定義
3.3 綫性錶的抽象數據類型
3.4 綫性錶的順序存儲結構
3.4.1 順序存儲定義
3.4.2 順序存儲方式
3.4.3 數據長度與綫性錶長度區彆
3.4.4 地址計算方法
3.5 順序存儲結構的插入與刪除
3.5.1 獲得元素操作
3.5.2 插入操作
3.5.3 刪除操作
3.5.4 綫性錶順序存儲結構的優缺點
3.6 綫性錶的鏈式存儲結構
3.6.1 順序存儲結構不足的解決辦法
3.6.2 綫性錶鏈式存儲結構定義
3.6.3 頭指針與頭結點的異同
3.6.4 綫性錶鏈式存儲結構代碼描述
3.7 單鏈錶的讀取
3.8 單鏈錶的插入與刪除
3.8.1 單鏈錶的插入
3.8.2 單鏈錶的刪除
3.9 單鏈錶的整錶創建
3.10 單鏈錶的整錶刪除
3.11 單鏈錶結構與順序存儲結構優缺點
3.12 靜態鏈錶
3.12.1 靜態鏈錶的插入操作
3.12.2 靜態鏈錶的刪除操作
3.12.3 靜態鏈錶優缺點
3.13 循環鏈錶
3.14 雙嚮鏈錶
3.15 總結迴顧
3.16 結尾語
第4章 棧與隊列
4.1 開場白
4.2 棧的定義
4.2.1 棧的定義
4.2.2 進棧齣棧變化形式
4.3 棧的抽象數據類型
4.4 棧的順序存儲結構及實現
4.4.1 棧的順序存儲結構
4.4.2 棧的順序存儲結構進棧操作
4.4.3 棧的順序存儲結構齣棧操作
4.5 兩棧共享空間
4.6 棧的鏈式存儲結構及實現
4.6.1 棧的鏈式存儲結構
4.6.2 棧的鏈式存儲結構進棧操作
4.6.3 棧的鏈式存儲結構齣棧操作
4.7 棧的作用
4.8 棧的應用--遞歸
4.8.1 斐波那契數列實現
4.8.2 遞歸定義
4.9 棧的應用--四則運算錶達式求值
4.9.1 後綴(逆波蘭)錶示法定義
4.9.2 後綴錶達式計算結果
4.9.3 中綴錶達式轉後綴錶達式
4.10 隊列的定義
4.11 隊列的抽象數據類型
4.12 循環隊列
4.12.1 隊列順序存儲的不足
4.12.2 循環隊列定義
4.13 隊列的鏈式存儲結構及實現
4.13.1 隊列鏈式存儲結構入隊操作
4.13.2 隊列鏈式存儲結構齣隊操作
4.14 總結迴顧
4.15 結尾語
第5章 串
5.1開場白
05.2 串的定義
5.3 串的比較
5.4 串的抽象數據類型
5.5 串的存儲結構
5.5.1 串的順序存儲結構
5.5.2 串的鏈式存儲結構
5.6 樸素的模式匹配算法
5.7 KMP模式匹配算法
5.7.1 KMP模式匹配算法原理
5.7.2 next數組值推導
5.7.3 KMP模式匹配算法實現
5.7.4 KMP模式匹配算法改進
5.7.5 nextval數組值推導
5.8 總結迴顧
5.9 結尾語
第6章 樹
6.1 開場白
6.2 樹的定義
6.2.1 結點分類
6.2.2 結點間關係
6.2.3 樹的其他相關概念
6.3 樹的抽象數據類型
6.4 樹的存儲結構
6.4.1 雙親錶示法
6.4.2 孩子錶示法
6.4.3 孩子兄弟錶示法
6.5 二叉樹的定義
6.5.1 二叉樹特點
6.5.2 特殊二叉樹
6.6 二叉樹的性質
6.6.1 二叉樹性質1
6.6.2 二叉樹性質2
6.6.3 二叉樹性質3
6.6.4 二叉樹性質4
6.6.5 二叉樹性質5
6.7 二叉樹的存儲結構
6.7.1 二叉樹順序存儲結構
6.7.2 二叉鏈錶
6.8 遍曆二叉樹
6.8.1 二叉樹遍曆原理
6.8.2 二叉樹遍曆方法
6.8.3 前序遍曆算法
6.8.4 中序遍曆算法
6.8.5 後序遍曆算法
6.8.6 推導遍曆結果
6.9 二叉樹的建立
6.10 綫索二叉樹
6.10.1 綫索二叉樹原理
6.10.2 綫索二叉樹結構實現
6.11 樹、森林與二叉樹的轉換
6.11.1 樹轉換為二叉樹
6.11.2 森林轉換為二叉樹
6.11.3 二叉樹轉換為樹
6.11.4 二叉樹轉換為森林
6.11.5 樹與森林的遍曆
6.12 赫夫曼樹及其應用
6.12.1 赫夫曼樹
6.12.2 赫夫曼樹定義與原理
6.12.3 赫夫曼編碼
6.13 總結迴顧
6.14 結尾語
第7章 圖
7.1 開場白
7.2 圖的定義
7.2.1 各種圖定義
7.2.2 圖的頂點與邊間關係
7.2.3 連通圖相關術語
7.2.4 圖的定義與術語總結
7.3 圖的抽象數據類型
7.4 圖的存儲結構
7.4.1 鄰接矩陣
7.4.2 鄰接錶
7.4.3 十字鏈錶
7.4.4 鄰接多重錶
7.4.5 邊集數組
7.5 圖的遍曆
7.5.1 深度優先遍曆
7.5.2 廣度優先遍曆
7.6 最小生成樹
7.6.1 普裏姆(Prim)算法
7.6.2 剋魯斯卡爾(Kruskal)算法
7.7 最短路徑
7.7.1 迪傑斯特拉(Dijkstra)算法
7.7.2 弗洛伊德(Floyd)算法
7.8 拓撲排序
7.8.1 拓撲排序介紹
7.8.2 拓撲排序算法
7.9 關鍵路徑
7.9.1 關鍵路徑算法原理
7.9.2 關鍵路徑算法
7.10 總結迴顧
7.11 結尾語
第8章 查找
8.1 開場白
8.2 查找概論
8.3 順序錶查找
8.3.1 順序錶查找算法
8.3.2 順序錶查找優化
8.4 有序錶查找
8.4.1 摺半查找
8.4.2 插值查找
8.4.3 斐波那契查找
8.5 綫性索引查找
8.5.1 稠密索引
8.5.2 分塊索引
8.5.3 倒排索引
8.6 二叉排序樹
8.6.1 二叉排序樹查找操作
8.6.2 二叉排序樹插入操作
8.6.3 二叉排序樹刪除操作
8.6.4 二叉排序樹總結
8.7 平衡二叉樹(AVL樹)
8.7.1 平衡二叉樹實現原理
8.7.2 平衡二叉樹實現算法
8.8 多路查找樹(B樹)
8.8.1 2-3樹
8.8.2 2-3-4樹
8.8.3 B樹
8.8.4 B+樹
8.9 散列錶查找(哈希錶)概述
8.9.1 散列錶查找定義
8.9.2 散列錶查找步驟
8.10 散列函數的構造方法
8.10.1 直接定址法
8.10.2 數字分析法
8.10.3 平方取中法
8.10.4 摺疊法
8.10.5 除留餘數法
8.10.6 隨機數法
8.11 處理散列衝突的方法
8.11.1 開放定址法
8.11.2 再散列函數法
8.11.3 鏈地址法
8.11.4 公共溢齣區法
8.12 散列錶查找實現
8.12.1 散列錶查找算法實現
8.12.2 散列錶查找性能分析
8.13 總結迴顧
8.14 結尾語
第9章 排序
9.1 開場白
9.2 排序的基本概念與分類
9.2.1 排序的穩定性
9.2.2 內排序與外排序
9.2.3 排序用到的結構與函數
9.3 冒泡排序
9.3.1 最簡單排序實現
9.3.2 冒泡排序算法
9.3.3 冒泡排序優化
9.3.4 冒泡排序復雜度分析
9.4 簡單選擇排序
9.4.1 簡單選擇排序算法
9.4.2 簡單選擇排序復雜度分析
9.5 直接插入排序
9.5.1 直接插入排序算法
9.5.2 直接插入排序復雜度分析
9.6 希爾排序
9.6.1 希爾排序原理
9.6.2 希爾排序算法
9.6.3 希爾排序復雜度分析
9.7 堆 排 序
9.7.1 堆排序算法
9.7.2 堆排序復雜度分析
9.8 歸並排序
9.8.1 歸並排序算法
9.8.2 歸並排序復雜度分析
9.8.3 非遞歸實現歸並排序
9.9 快速排序
9.9.1 快速排序算法
9.9.2 快速排序復雜度分析
9.9.3 快速排序優化
1.優化選取樞軸
2.優化不必要的交換
3.優化小數組時的排序方案
4.優化遞歸操作
9.10 總結迴顧
9.11 結尾語
附錄 參考文獻
前言/序言
本書起因
大傢好!我是《大話設計模式》(2008年初齣版)的作者,三年來,承濛廣大讀者的厚愛,《大話設計模式》取得瞭較大的成功。僅在當當網,截止本文寫作時,就已經有1073次評論,705次5星評價,位居五星圖書榜計算機/網絡類的纍計總榜第二名。此書已經成為國內原創計算機類圖書最暢銷的書籍之一。
對於這樣一個自己喜歡做、可以做得好,而且已經得到瞭市場廣泛認可,為很多朋友提供幫助的事情,我沒有理由不去繼續做下去。這就是我準備再寫書的原因。
我曾做過調查,數據結構的學習者大多都有這樣的感慨:數據結構很重要,一定要學好,但數據結構比較抽象,有些算法理解起來很睏難,學得很纍。可我更希望傳達這樣的信息:數據結構非常有趣,很多算法是智慧的結晶,學習它是去感受計算機編程技術的魅力,在理解掌握它的同時,整個過程都是一種愉悅的精神感受,而非枯燥乏味的一門課程。因此我決定寫作一本關於數據結構有趣的書。
不過現實總比理想來得更“現實”。要想把書寫好,談何容易,我需要突破很多睏難……嗐!不管如何,現在您看到瞭本書,那就說明我已經剋服瞭睏難戰勝瞭自己。希望您可以喜歡上這本書。
本書定位
本書的定位就是一本適閤讀者自學數據結構的書籍,它有區彆於教材,希望給大傢另一種閱讀體驗。
通常講解數據結構的圖書都是以教材的方式呈現。在寫作前,我購買或在圖書館藉閱瞭十幾本非常好的數據結構相關教材用來為寫作本書做準備。但經過認真閱讀後,我發現,它們大多不是一本好的“自學讀物”。
我沒有輕視這些好書的意思,不過教材和自學讀物,所麵嚮的讀者是完全不同的。
好的教材應該是提綱挈領、重點突齣,一定要留齣思考的空間,否則就沒必要再聽老師上課瞭。很多內容的講解是由老師在課堂完成,教材中有練習、課後習題、思考題等,這些大多可以通過老師來解答。比如我們中學時的語文、數學課本,很薄的一本書通常要用一學期、甚至一年的時間來學習,這就是因為它們是教材而不是自學讀物。如果是小說,可能一兩天就讀完瞭。
好的自學讀物的目標是讓初學者“獨自”全盤掌握知識,需要強調“獨自”一詞,這就說明讀者在閱讀時,是完全依靠自己的力量來嚮未知發齣挑戰。因此書中內容,要麼不寫,寫瞭就應該寫透。如果讀者在閱讀時總是疑惑重重,那麼這本書就有很大的問題瞭。
我也就是在基於這樣的認識,決心將《大話數據結構》真正寫成一本關於數據結構和算法的自學讀物來展開寫作的。
本書特色
1.趣味引導
大部分的編程類圖書,在內容上基本都是直奔主題。但是尼采曾說過:“人們無法理解他沒有經曆過的事情。”換句話說,我們隻接受過去早已理解的事物相關的信息。這是一種比較學習過程,在這個過程中,大腦尋找每條信息之間的聯係。所以教育專傢普遍認為,吸引學生的注意力,比較好的辦法是用他們比較熟知的知識開始。
因此在本書中,我會用一個故事、一個趣味題目、一部電影的介紹等形式來作為每一章甚至很多小節的開頭,選擇的內容也多多少少與要講的主題內容相關。這並不是多餘,而是有意為之。事實上,這樣的形式在我的前一本書中已經得到瞭普遍認可。
2.圖文並茂
西方有句諺語,“A picture is worth a thousand words.(一圖值韆言)”。用上韆個字描述不明白的東西,很可能一張圖就能解釋清楚。
我非常認可這個觀點,所以本書雖沒有達到每一頁都有圖,但基本做到瞭絕大部分講解都有相關圖示,關鍵算法更是通過多圖逐步分解剖析。盡管這帶來瞭寫作上的難度,但卻可以達到較好的效果。畢竟,讀者通過本書開始學習數據結構時,要從一無所知或略知一二到完全理解,甚至掌握應用,是需要一個比較艱苦的過程,用大量的圖示可以減少這個過程的長度。
3.代碼詳解
我在寫作中盡量摒棄瞭傳統數據結構教材的“重理論思想而輕代碼講解”的作法。在準備數據結構寫作時我發現,很多教材對數據結構理論和算法設計思想講得比較好,可一到實際代碼時,有的把代碼貼齣來加少量注釋,有的直接用僞代碼形式。這對於上課的學生還好,畢竟有老師在課堂中去詳解代碼編寫原理,可是對於初學數據結構和算法的自學者而言,如果書中不去解釋代碼某些細節為什麼那樣編寫的原因,甚至代碼根本不可能在某個編譯器中運行通過,其挫摺感是很強烈的。比如即使理解瞭圖結構中的最短路徑求解原理,也可能無法寫齣最短路徑的算法。
我把代碼在運行過程中變量的變化融入到整個算法設計思想的講解中,配閤相應的示意圖,會幫助大傢更加容易理解算法的實質。這種講解模式在本書的第6、7、8、9章的很多復雜算法中有具體體現,越是復雜的代碼越是講解細緻。這算是本書的一個特色,希望對讀者有幫助。
4.形式新穎
我把本書的內容虛構成瞭一個老師上課的場景,所有內容都通過這位老師錶達齣來,書中的文字非常口語化,這樣做的目的是為瞭更加直觀地讓讀者感覺,自己是在學習,是在上課。有人可能會說,現在的課堂大都是讓人昏昏欲睡,把讀者帶入上課場景,不是更加讓讀者犯睏嗎?我覺得如果你的學習經曆中聽過一些優秀老師的課,你就不會下這樣的結論。好的老師講課,是可以做到引人入勝的。
有人可能會問,我為什麼不用《大話設計模式》中的對話形式,而采用講課形式呢?這是對數據結構這門學問的特點考慮的。設計模式主要都是思想體現,通常會仁者見仁、智者見智,用對話展開比較容易;而數據結構中更多的是定義、術語、經典算法等,這些公認的知識,可討論的地方並不多,更多的是需要把它講清楚。讓兩個人在一起討論某個設計模式的優缺點,會非常閤適,而討論數據結構定義的好壞,就沒有太大意義瞭,不如讓一個老師告訴學生數據結構的定義好在哪裏更符閤實際。因此用傳統的講課形式會好一些。
另外,本書沒有習題,有思考的題目也一定會給齣某種答案。但本書每個復雜知識點的末尾,都會提供另一本書的進一步閱讀建議。這也是基於它是一本自學讀物的原則。讀者閱讀本書可能是任何時間任何地方,如果書中存在沒有解答的習題,碰到瞭睏難是沒法及時找到老師來幫助的,因此本書盡量避免讓讀者有這樣的睏惑存在。如果需要練習的同學,我覺得還是應該考慮再去買本習題集來學習。學習數據結構和算法,做題和上機寫代碼非常有必要,從這個角度也說明,閱讀完本書其實也隻是完成入門而已。
本書既然是以老師上課的形式來進行,那就免不瞭要融入一名教師除瞭授業解惑以外,還要傳達一些個人價值觀的體現。書中很多細微處,如對某位科學傢的尊敬、對某個算法的推崇、對勤奮勵誌故事的講述等都在錶達著一個老師嚮學生傳遞真、善、美的意願。我始終認為,讀者拿到的雖然隻是一本沒有錶情、不會說話的書,但其實也是在隔空與另一個朋友交流。人與人的交流不可能隻是就事論事,一定會有情感的溝通,這種情感如果能産生共鳴、達成互信,就會讓事情(比如學習數據結構與算法這件事)本身更容易理解和接受。
本書內容
本書主要是按照教育部關於計算機專業數據結構課程大綱的要求略微增減來組織內容的。
主要包括:數據結構介紹,算法推導大O階的方法,綫性錶結構的介紹,順序結構與鏈式結構差異,棧與隊列的應用,串的樸素模式匹配、KMP模式匹配算法,樹結構的介紹,二叉樹前中後序遍曆,綫索二叉樹,赫夫曼樹及應用,圖結構的介紹,圖的深度、廣度遍曆,最小生成樹兩種算法,最短路徑兩種算法,拓撲排序與關鍵路徑算法,查找應用的相關介紹,摺半查找、插值查找、斐波那契查找等靜態查找,稠密索引、分塊索引、倒排索引等索引技術,二叉排序樹、平衡二叉樹等動態查找,B樹、B+樹技術,散列錶技術,排序應用的相關介紹,冒泡、選擇、插入等簡單排序,希爾、堆、歸並、快速等改進排序,各位排序算法的對比等。
本書讀者
數據結構是計算機軟件相關專業的基礎課程,幾乎可以說,要想從事編程工作,無論你是否是科班齣身,都不可以繞過這部分知識。因此,適閤閱讀本書的讀者非常廣泛,包括在讀的本專科、中專職高技校等計算機專業學生、想轉行做開發的非專業人員、欲考計算機研究生的應屆或在職人員,以及工作後需要補學或溫習數據結構和算法的程序員等各類讀者。
本書對讀者的技術背影要求比較低,隻要是學過一門高級編程語言,例如C、C++、Java、C#、VB等就可以開始閱讀本書。不過由於當中涉及到比較復雜的算法知識,需要讀者有一定的數學修養和邏輯思維能力,否則可能書籍的後半部分閱讀起來會比較吃力。
本書研讀方法
事實上,任何有難度的知識和技巧,都不是那麼容易被掌握的。我盡管已經朝著通俗易懂的方嚮努力,可有些數據結構,特彆是經典算法,是幾代科學傢的智慧結晶,因此要掌握它們還是需要讀者的全力投入。
美國暢銷書《如何閱讀一本書》中提到“閱讀可以是一件主動的事,閱讀越主動,效果越好。拿同樣的書給背景相近的兩個人閱讀,一個人卻比另一個人從書中得到瞭更多,這是因為,首先在於這人的主動,其次,在於他在閱讀中的每一種活動都參與瞭更多的技巧。這兩件事是息息相關的。閱讀是一個復雜的活動,就跟寫作一樣,包含瞭大量不同的活動。要達成良好的閱讀,這些活動都是不可或缺的。一個人越能良好運作這些活動,閱讀的效果也就越好。”
我當然希望讀者在閱讀本書後收獲巨大,但這顯然是一廂情願。要想獲得更多,您可能也需要付齣類似我寫作一樣的力氣來閱讀,例如摘抄文字、眉批心得、稿紙演算、代碼輸入電腦,以及您自己在編程工作中的運用等。這些相應活動的執行,將會使您得到巨大的收獲。
作為作者,建議本書的研讀方法為:
1.復習C語言的基礎知識。如果你掌握的是彆的語言也不要緊,適當瞭解一些C語言和你掌握的編程語言的語法差異還是有必要的。甚至將本書代碼改造成另一種語言本身就是一種非常好的學習方法。
2.閱讀第一遍時,建議從頭至尾進行。如果你對前麵的知識有足夠瞭解,當然可以跳過直接閱讀後麵的章節。不過若要學習一門完整的知識並形成體係。通讀本書,還是最好的學習方法。
3.閱讀時,摘抄是非常好的習慣。“最淡的墨水也勝於最強的記憶!”有不少讀者會認為摘抄瞭將來也不會再去看,有什麼必要,但其實在寫字的過程就是大腦學習的過程,寫字在減緩你閱讀的速度,從而讓你更好地消化閱讀的內容。相信大傢都能理解,“囫圇吞棗”和“慢慢品味”的差異,學習同樣如此。
4.閱讀每一章時,特彆是在閱讀算法的推導過程時,一定要在電腦中運行代碼(本書源碼的下載地址可以到http://cj723.cnblogs.com中的《大話數據結構相關主題》中找到),瞭解代碼的運行過程。本書的很多算法都做到瞭逐行講解,但單純閱讀可能真的很難達到理解的程度(這是紙質書無法剋服的缺陷),需要你通過開發工具調試,並設置斷點和逐行執行,並參照書中的講解,觀察變量的變化情況來理解算法的編寫原理。
5.閱讀完每一章時,一定要在理解基礎上記憶一些關鍵東西。最佳的效果就是你可以不看書也做到一點不錯地默寫齣相關算法。
6.閱讀完每一章時,一定要適當練習。本書沒有提供練習題,但市場上相關的數據結構習題集比比皆是,可以選擇嘗試。另外互聯網上也可以獲得足夠的習題來給你練習。練習的目的是為瞭檢測自己是否真的完全理解瞭書中的內容。事實上很多時候,閱讀中的人們隻是自我感覺理解,而並非真正的明白。
7.學習不可能一蹴而就,數據結構和算法如果通過一本書就可以掌握,那本身就是笑話。本書附錄提供瞭本書寫作時的參考書目,基本都是最優秀的數據結構或相關的中文書籍各有側重,建議大傢可以適當地閱讀。
8.在之後的編程學習和工作中,盡量把已經學到的數據結構和算法知識運用到現實開發中。遺忘時翻閱本書迴顧相關內容,最終達到精通數據結構和相關算法的境界。
編程語言說明
本書是用C語言編寫,基於C90(ISO C)的標準。讀者可以選擇任何一款基於C90標準的C語言開發工具或更高版本的開發工具來學習本書中的代碼。
本人一直習慣於用Visual Studio 2008作為開發工具,因此在寫作此書時,也是用此工具的Visual C++來編譯調試代碼,一切都相安無事,但寫作完成後,考慮到不同讀者應用開發工具的習慣不同,最終在編輯的建議下,決定提供一份可在C90標準的C語言開發環境中編譯通過的代碼,結果發現錯誤百齣。
例如C90標準的注釋要求是“/* 注釋文字 */”而不允許是“//注釋文字”:要求變量聲明必須要在函數的最前麵,隻能是“int i; for(i=0;i齣於為瞭讓代碼可以在低端編譯環境通過的考慮,犧牲一些代碼的簡捷性和優雅性也是無可奈何和必要的。最終我將書中全部代碼都改成C90標準的代碼。
C語言初學者可能會因為剛接觸編程語言,特彆是對指針的理解不深,而擔心閱讀睏難。我個人感覺,單純學習指針是很難理解它的真正用途和好處,而通過學習數據結構,特彆是像鏈式存儲結構在各種結構算法中的運用,反而可以讓讀者進一步的理解指針的優越之處。從這個角度說,數據結構的學習可以反過來加強讀者對C語言,特彆是指針概念的理解。
編程語言差異
C語言是一門古老的高級語言,它的應用範圍非常廣泛,因此我選擇它作為本書的算法展示語言。如果讀者之前學過它,那麼閱讀本書就不存在語言障礙。懂得C++語言的讀者,同樣也不會有任何語言上的問題。
像掌握Java、C#、VB等麵嚮對象語言的讀者,當麵對書中大量的C語言式的結構(struct)聲明和針對結構的參數傳遞的代碼時,都可以理解為是類的定義和由類生成對象的傳遞。盡管的確存在差異,但是並不影響整體對數據結構知識和算法原理的理解。
我個人感覺,哪怕是對C語言不熟悉,也不妨利用學習數據結構的機會,學習一下C語言的編程方法,這對於將來應用其他高級語言也是有很大幫助的。
不是一個人在戰鬥
首先要感謝我的妻子李秀芳對我寫作本書期間的全力支持,我辭職寫作,沒有她精神上的理解鼓勵和生活上的悉心照顧,是不可能走齣這一步並順利完成書稿的。我們的兒子程晟涵如今已經三周歲,我是在他每日的歡聲笑語和哭哭啼啼中進行每一章節的構思和寫作,希望他可以茁壯成長。我的父母已經年邁,他們為我的全職創作也甚為擔心和憂慮,這裏也要說一聲抱歉。
本人數據結構的知識,是源自清華大學齣版社齣版的《數據結構(C語言版)》(嚴蔚敏、吳偉民編著)一書,嚴老師和吳老師算是我在數據結構方麵的啓濛老師,本書的不少內容和代碼也是參考瞭此書。機械工業齣版社的《算法導論》對於本人的算法知識提高幫助很大,寫作中也大量吸收瞭書中的精華。寫作過程中,本人購買和藉閱瞭與數據結構相關的大量書籍,詳細書目見附錄。沒有前輩的貢獻,就沒有本書的齣版,也希望本書能成為這些書籍的前期讀物。在此嚮這些圖書作者錶示衷心的感謝。
僅有作者是不可能完成圖書的齣版的,本人要非常感謝清華大學齣版社的朋友們,他們是本書的最初讀者,也是協助本人將此書由毛糙變精良的最有力幫手。
本書的封麵設計程瑜、插圖設計周翔,都是在反反復復的修改中完成創作的。
寫作中,還得到瞭周筠、盧鶇翔、張伸、鬍文佳、Milo、陳鋼、劉超、劉唯一、楊綉國、戚嫵婷、雷順、楊詩盈、高宇翔、林健的友情幫助,他們都在本人的書稿創作中提齣瞭寶貴建議。
在此嚮所有幫助與支持我的朋友道一聲:謝謝!
程傑