本書是清華大學計算機系列教材《數(shù)據(jù)結構(用面向?qū)ο蠓椒ㄅcC 描述)》(第3版)的配套用書;诩由罨局R理解、強化基本技能訓練的要求,本書針對主教材各章精選的習題給出了參考答案。部分習題提供了多種可能的解答,幫助學生以不同思路來解決問題。
本書章節(jié)的編排與主教材的章節(jié)嚴格對應。每章的第一部分給出本章的復習要點,總結主要的知識點; 第二部分說明其重點和難點,引起學習者的注意;第三部分則提供了本章習題的參考答案;第四部分進一步擴展,針對將來工作中可能涉及的知識,兼顧考研,補充了一大批練習,以提高學生能力為目的,展開實訓。
書中內(nèi)容涵蓋了全國計算機類碩士研究生入學統(tǒng)一考試大綱的各個知識單元,并針對考試的題型,增加了大量選擇題和應用題,包括算法題。所有的習題都經(jīng)過精心挑選和解答,較復雜的習題還提供了求解的思路及啟發(fā)性的題解。
本書的行文簡明扼要,深入淺出,易于學習和理解。適合本科在校學生作為學習的參考書使用,也可以作為各種計算機考試,包括考研學生的復習教材。此外,對于計算機軟件研發(fā)的從業(yè)人員也有參考價值。
考研:配套清華教材,收錄歷年考研真題,題型全覆蓋,助你精準把握考點,高效備考。
面試寶典:深挖數(shù)據(jù)結構細節(jié),補充高頻考點與案例分析,助力攻克IT大廠面試難題。
名師方法論:30年教學精華,提煉C/C 語法、算法設計四步法,培養(yǎng)獨立解題能力,避免盲目刷題。
算法實戰(zhàn):詳解經(jīng)典結構實現(xiàn)與優(yōu)化,強化代碼規(guī)范與邊界測試,從能寫到寫好進階。
數(shù)據(jù)結構是計算機技術及信息管理技術有關專業(yè)的一門必修的核心課程。數(shù)據(jù)結構課程的任務是討論在應用問題求解時數(shù)據(jù)的邏輯組織、在計算機中的存儲實現(xiàn)及相關操作的算法。數(shù)據(jù)結構課程的目的是使學生掌握在解決實際問題過程中組織數(shù)據(jù)、存儲數(shù)據(jù)和處理數(shù)據(jù)的基本方法,為進一步學習后續(xù)課程及以后從事軟件開發(fā)和應用,打下堅實的基礎。
本教材是清華大學出版社出版的清華大學計算機系列教材《數(shù)據(jù)結構(用面向?qū)ο蠓椒ㄅcC 描述)》(第3版)的配套教材,并對相應的第2版教材做了較大的修改。修改的目的有3個: 一是響應主教材的修改,在內(nèi)容上做了適當?shù)膭h減,對所有入選的習題做了歸類;二是適應計算機類學科的學生考研的需要,增加了題型和內(nèi)容,將歷年全國計算機學科碩士研究生入學聯(lián)考的絕大多數(shù)數(shù)據(jù)結構的真題吸收到了本教材中(在題目前加了 標志),學生可以通過這些習題了解考研的難度;三是針對一些IT大廠的入職面試的數(shù)據(jù)結構方面的考核,挖掘課程的某些邊邊角角的知識點,適當補充一些相關的概念題。因此,本教材對于復習和準備考試的學生有一定參考價值。但對于正在學習數(shù)據(jù)結構課程的學生,應以掌握知識和培養(yǎng)能力為主,不應過多地依賴現(xiàn)成的習題解答。
學習好數(shù)據(jù)結構,必須抓住重點。首先要明確課程考查目標。
(1) 理解數(shù)據(jù)結構的基本概念,掌握數(shù)據(jù)的邏輯結構、存儲結構及其差異,以及各種基本操作的實現(xiàn)。
(2) 在掌握基本的數(shù)據(jù)處理原理和方法的基礎上,能夠?qū)λ惴ㄟM行設計與分析。
(3) 能夠選擇合適的數(shù)據(jù)結構和方法進行問題求解。
換句話說,課程考查的目標有兩個: 知識和技能。
知識方面,應從數(shù)據(jù)結構的結構定義和使用及存儲表示和操作的實現(xiàn)兩個層次系統(tǒng)地考查。
●掌握常用的基本數(shù)據(jù)結構(包括順序表、鏈接表、棧與隊列、數(shù)組、二叉樹、堆、樹與森林、圖、搜索結構、順序表結構)及其不同的實現(xiàn)。
●掌握分析、比較和選擇不同數(shù)據(jù)結構、不同存儲結構、不同算法的原則和方法。
技能方面,應系統(tǒng)地學習和掌握基本數(shù)據(jù)結構的設計方法,掌握選擇結構的方法和算法設計的思考方式及技巧,提高分析問題和解決問題的能力。
為在有限的時間內(nèi)學習和復習好這門課程,應當注意以下幾點。
(1) 必須注意使用C/C 語言編寫小程序時的語法規(guī)則和方法,為算法分析和算法設計題的求解打下基礎。
在學習C/C 語言時,要注意:
① 函數(shù)的概念和相關問題。包括函數(shù)類型、函數(shù)特征、函數(shù)參數(shù)傳遞、函數(shù)返回值類型。要特別注意傳值參數(shù)和引用參數(shù)在使用上的區(qū)別。
② 函數(shù)中傳值參數(shù)的作用域。特別注意在函數(shù)中對傳值參數(shù)的任何改變,在退出函數(shù)過程時不能通過參數(shù)返回。
③ 自定義結構的定義方式。可以簡單些,但解題時不能回避C/C 中的動態(tài)存儲分配和回收方式。
④ C/C 中的輸入輸出文件的定義和使用。特別注意文件的打開、關閉、讀入、寫出操作的使用。
(2) 在學習數(shù)據(jù)結構時,要注意知識體系。
〖2〗〖2〗數(shù)據(jù)結構課程中的知識本身具有良好的結構性,有些結構是面向應用的,有些結構是面向?qū)崿F(xiàn)的。在學習時要注意這兩個層次及它們之間的聯(lián)系。
① 注意比較。在復習中應當注意從橫向和縱向進行對比以加深理解。
縱向?qū)Ρ葘⒁环N結構與它的各種不同的實現(xiàn)加以比較,理解不同實現(xiàn)方式的優(yōu)點和不足;橫向?qū)Ρ劝▽ν瑢僖活愡壿嫿Y構的不同數(shù)據(jù)結構(如線性表、棧、隊列)的比較,具有相同功能的不同算法的比較等,了解數(shù)據(jù)結構與算法實現(xiàn)之間的關系。
② 注意學習和重讀。有些內(nèi)容在初讀時難以透徹理解或熟練掌握,或看起來似乎很明白,但用時想不起如何用。在繼續(xù)學習的過程中如遇到或用到有關內(nèi)容時,應當及時復習或重讀,這往往能夠化難為易,溫故知新。
③ 注意循序漸進。在復習數(shù)據(jù)結構的定義和各種操作的實現(xiàn)之前,需首先領會基本概念、基本思想,這一點極為重要。特別是在閱讀算法之前,一定要先弄清其基本設計思想、基本步驟,這將大大降低理解算法的難度。如果讀懂了算法而不知其基本思想,則可以通過實例學習以加深理解。
④ 注意練習。只看書不做題,不可能真正學會有關知識,更不能達到技能培養(yǎng)的目的。另外,做題也是自我檢查的重要手段。在做算法設計類型的習題時,應優(yōu)先考慮數(shù)據(jù)結構的定義,可以直接使用以前定義的數(shù)據(jù)結構和相應操作。
⑤ 提高算法設計的能力。編寫算法的題可能是學生比較棘手的問題,特別是在考試中,時間短促,想編出一個好算法不太容易。一個建議是首先仔細閱讀試題,了解它到底要我們干什么。然后用一個簡單的例子走一下,總結每一步向下走用什么語句,再做歸納。也可以按照結構化程序設計的方法,先搭框架,再根據(jù)例子填入細節(jié)。
在設計一個算法解決具體問題時,要考慮數(shù)據(jù)結構內(nèi)容的系統(tǒng)性、問題解決方案的多樣性、算法的適用性、問題對算法選擇的限制。選擇合適的數(shù)據(jù)結構,設計有效的算法。最后應當強調(diào)的是,學習方法主要靠自己摸索,多總結、多思考、勤練習、勤交流。
(3) 在設計一個程序以實現(xiàn)一個數(shù)據(jù)結構和算法時,還要考慮更多的實現(xiàn)要求。
① 程序的可讀性和可理解性問題。一個程序是否具有可讀性,關系到該程序的生存期。業(yè)界有一個測試可讀性的方法,拿一個程序(100行左右)給一個有經(jīng)驗的程序員看,如果10分鐘沒能看懂這個程序,則請程序作者拿回去重寫。程序看得懂,才能夠合理修改,否則改1個錯出10個錯,這個程序必然會被新的程序替代。
② 程序的結構化和模塊化問題。程序劃分模塊,是為了控制程序的出錯率。任何人也不能保證他所編寫的程序沒有錯誤。今天沒有發(fā)現(xiàn)問題不等于以后也不會發(fā)現(xiàn)問題。有的是算法邏輯問題(如控制變量失控導致的數(shù)據(jù)對象狀態(tài)異常),有的是系統(tǒng)問題(如運行時存入數(shù)組的元素個數(shù)超出數(shù)組的邊界),有的是程序結構問題(如if語句的嵌套出現(xiàn)二義性)等,結構化和模塊化可控制修改范圍最小,出錯影響范圍最小。
作者從1987年開始教授數(shù)據(jù)結構課程,至今已經(jīng)有30多年。除教授大學計算機專業(yè)本科數(shù)據(jù)結構課程之外,還教授過大學自學考試本科數(shù)據(jù)結構課程、軟件水平考試數(shù)據(jù)結構課程輔導、全國計算機學科碩士研究生入學專業(yè)考試數(shù)據(jù)結構課程輔導,積累了較為豐富的經(jīng)驗,因此在本習題解析中涉及了許多學生容易忽略或混淆的概念,并在算法設計方面精心安排了一些題解,這些對于希望深入了解數(shù)據(jù)結構課程知識,特別是應對考研的學生,會有很大幫助。
由于作者水平有限,書中會有一些錯誤和疏漏,懇請廣大讀者多多指正。
作者
2025年4月于清華園·荷清苑
第1章緒論1
1.1復習要點1
1.2難點與重點2
1.3教材習題解析2
1.4補充練習題10
1.5補充練習題解答16
第2章線性表25
2.1復習要點25
2.2難點與重點26
2.3教材習題解析27
2.4補充練習題39
2.5補充練習題解答45
第3章棧和隊列64
3.1復習要點64
3.2難點和重點65
3.3教材習題解析67
3.4補充練習題85
3.5補充練習題解答93
第4章數(shù)組、串和廣義表119
4.1復習要點119
4.2難點與重點120
4.3教材習題解析121
4.4補充練習題137
4.5補充練習題解答143
第5章樹與森林165
5.1復習要點165
5.2難點與重點167
5.3教材習題解析169
5.4補充練習題191
5.5補充練習題解答205
〖2〗〖2〗第6章集合與字典244
6.1復習要點244
6.2難點和重點246
6.3教材習題解析247
6.4補充練習題271
6.5補充練習題解答275
第7章搜索結構295
7.1復習要點295
7.2難點和重點299
7.3教材習題解析300
7.4補充練習題327
7.5補充練習題解答333
第8章圖355
8.1復習要點355
8.2難點和重點356
8.3教材習題解析358
8.4補充練習題388
8.5補充練習題解答404
第9章排序444
9.1復習要點444
9.2難點和重點447
9.3教材習題解析449
9.4補充練習題480
9.5補充練習題解答487
第10章文件、外部排序與搜索507
10.1復習要點507
10.2難點與重點510
10.3教材習題解析511
10.4補充練習題536
10.5補充練習題解答542
參考文獻562