資料結構學習(C++)——線性鏈式結構總結(代後記)【2】 (轉)
在開始寫這些文章之前,我曾經有個想法,能不能以單連結串列為基礎,完成所有的線性鏈式結構?實踐證明,是可以的,就像你看到的這樣。我做這個嘗試的起因是,看不慣現在教科書凌亂的結構:羅列了一大堆ADT或者是templat class,好像這些都要你去記似的。殊不知,只有提取共性,突出個性,才能更明顯的表現出各種資料結構的差異,顯示資料結構的進化發展的過程,看出變化的內在需求。借用《C++沉思錄》作者的一句話,“避免重複”。在以後的應用中,你可能需要單獨的寫出一個class——打個比方,為了實現棧,你沒有必要先寫一個線性表,然後再繼承得到棧;但假如你已經有了一個線性表了,你還需要另起爐灶再重寫一個棧嗎?對於一本書來說,本來就是假定讀者在看後面的章節的時候,已經對前面的章節有所瞭解;即使象《C++沉思錄》這樣的從以前發表在雜誌上的文章整理出的書,也能看到循序漸進的影子。如果在後面的章節又把前面的東西重複一遍,我只能認為他是在騙稿費。
我把以前的程式碼總結一下,列表如下(因為我畫不好圖):
單連結串列(List
多項式節點
節點
修改部分操作
新增向前指標域
限制操作
多項式
表示式
迴圈連結串列
雙向連結串列
棧和佇列
我們從單連結串列出發,透過對應的變化,得到了綠色的一行。突然之間我覺得自己很可悲,看了100多頁書,最後得到竟然只是這麼一個表。不管怎麼說,這也是我看了這麼多頁書的結晶,讓我們看看能從這表裡得到什麼。
首先,單連結串列是一個容器,他是為了存取資料而存在的。如果裡面存的是多項式的節點,那麼他就是一個多項式;如果裡面存的是表示式節點,那麼他就是一個表示式。這讓我想起了以前曾經困擾我的語義問題:多項式究竟是一個存了多項式節點的單連結串列呢,還是包含了一個存了多項式節點的單連結串列?現在我的想法是,這並不重要,怎麼理解都行。
其次,迴圈連結串列、雙向連結串列、棧和佇列也是容器,只是具體的操作實現或者對外的行為和單連結串列有所差別。但是內在的存取機制是相同的,或者還有更多的地方相同,我們應當最大限度的利用這些相同之處。
上面的提法好像很無聊——他們當然是容器,還用你小子廢話嗎——請注意我下面的問題:陣列是容器嗎?你做過僅針對陣列裡的元素操作的練習嗎?你做過陣列應用的練習嗎?現在請你把陣列換成單連結串列,檢查一下有沒有答案變化了。這真是對大學教育的一個諷刺,我們學完單連結串列,竟然只會插入刪除節點,合併兩個連結串列,將一個單連結串列逆序,等等;我們居然不知道為什麼要學這個,怎樣用他。最終的結果就是,當我們走向工作崗位後,又如獲至寶的捧起這本書,然後用語重心長的口氣對學弟們說:“資料結構很重要,你一定要好好學”。
或許你說這沒什麼,大學裡許多的功課不都是這樣的嗎——臨到用時才發現重要。是的,習慣成自然,但是習慣並不都是好的,我們也並不是一定要“書到用時方恨少”,然而,這並不只是取決於我們的年少“不”輕狂。讓我們回想一下我們的教科書,一章一節,井井有條,絲絲入扣,當然這是寫的好的,其他的就是追求這個目標,畫虎不成反類犬。前面的章節為後面的章節鋪墊,邏輯推理性極強,請不要認為我這是誇那些書,你不覺得和看那些論文一個感覺?你所得到的僅僅是“是什麼”,“我說的是有道理的”;你能看到“為什麼有這些”嗎?
對於論文,我不能要求作者給出他的思維過程,而他寫論文的目的也僅僅是為了告訴別人:“我研究出這個了,你們看,我說的是有道理的”,並且,看他的論文的人也有和他相當的知識構成,我想,現在看我文章的人也不會對哲學論文感興趣(即使你可能會看黑格爾的書,你也決不會對現在那群玄人的夢囈感興趣;正如那群人雖然用寫文章,你想要跟他們說管理,他們也會把耳朵塞起來)。
對於教科書,僅僅用論文的要求來要求,顯然是太低了。首先,書所面對的讀者都是對這門課程一無所知的人——你假設和論文一樣,都有一個基本認識了,我還學你這門課幹什麼,我直接看最新的論文好不好。其次,寫作目的是讓讀者瞭解這門學科,認識這門學科的規律,最終能夠運用這門學科,甚至有所發展。正如學寫字先描紅,不先模仿,怎麼創新呢?如果連現有的結論和成果都不知道來龍去脈,談何再有新的突破呢?
教科書不是論文,當然不能象寫論文那樣來寫,但現在國內的作者好像樂此不疲,就好像不寫得層次嚴謹就不能體現自己功力紮實似的。這也是為什麼越來越多的人選用國外的教科書,即使他們的英文並不好——當然,不少人是藉此學習英文。
正如哲學上講的,只有遵從人類的認知規律,人們才能更容易的認識新事物。但論文的寫作,恰恰是對這個過程的逆向總結——他是和人類的認識過程相反的。而教科書為了達到他傳授知識的目的,就必須遵從人的認知規律,而決不是象論文那樣反其道而行之。
這樣看來,資料結構的書決不應該象現在這樣來寫。從資料結構的發展來看,他是應問題的需要而出現的,併為解決問題而服務。換而言之,對於資料結構的講解,應當把重點放在演算法上面,在各種典型問題上提出新的資料結構;最終得出的認識是,為了特定的問題和演算法,而選用特定的資料結構;為了改進演算法而改進資料結構;為了新的問題和演算法而創造出新的資料結構。而決不是象現在這樣能得出的認識:我學了資料結構能解決什麼問題。乍一看,好像沒什麼差別,但現在這個認識,你不是資料結構的主人,你只是資料結構的奴隸。
最後舉個諷刺性的例子。我最初知道資料結構的時候是高中,那時我只會BASIC,資料結構的概念源自一本名叫《中小學生電腦操作與設計》的書。那本書使用的是GWBASIC,實現了大學教科書裡的資料結構:連結串列、棧、樹、圖。來看看他的目錄:八皇后、迷宮、騎馬遊世界、連結串列和約瑟夫、樹和揹包、一筆畫、追捕罪犯、四種顏色就夠了。——我們甚至在中小學時,用BASIC就可以清楚的有趣的講解資料結構;現在居然讓大學生學完之後,甚至連中小學生的水平都不如。我不知道你怎麼看,但我覺得,至少,我們的教科書應該改變一下寫作的風格了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998919/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構學習(C++)——線性鏈式結構總結(代後記)【1】 (轉)資料結構C++
- 資料結構學習(C++)——圖(總結) (轉)資料結構C++
- 資料結構學習(C++)——樹(總結) (轉)資料結構C++
- 資料結構學習(C++)——遞迴【2】(2) (轉)資料結構C++遞迴
- 【資料結構之線性表總結】資料結構
- 線性結構總結
- 資料結構學習總結--圖資料結構
- 資料結構學習(C++)——序言 (轉)資料結構C++
- 資料結構學習(C++)——遞迴【2】(1) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(3) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【2】(4) (轉)資料結構C++遞迴
- 資料結構學習(C++)——遞迴【3】(2) (轉)資料結構C++遞迴
- 資料結構學習(C++)續——排序【6】內部排序總結 (轉)資料結構C++排序
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構學習(C++)——迴圈連結串列 (轉)資料結構C++
- 資料結構學習(C++)——雙向連結串列 (轉)資料結構C++
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——圖【2】(DFS和BFS) (轉)資料結構C++
- 資料結構學習筆記(一) (轉)資料結構筆記
- 線性表__資料結構筆記資料結構筆記
- Java學習筆記:資料結構之線性表(雙向連結串列)Java筆記資料結構
- Java資料結構之Map學習總結Java資料結構
- Java資料結構之Set學習總結Java資料結構
- 資料結構線性表的鏈式儲存結構(單連結串列)的表示及其基本操作資料結構
- 資料結構學習(C++)——單連結串列應用(一元多項式【2】) (轉)資料結構C++
- 學習 JS 資料結構(2):連結串列JS資料結構
- 資料結構學習(C++)——棧應用(表示式求值) (轉)資料結構C++
- 資料結構基礎學習之線性表資料結構
- 資料結構學習(C++)——遞迴【1】 (轉)資料結構C++遞迴
- 資料結構學習(C++)續——排序【2】插入排序 (轉)資料結構C++排序
- 資料結構學習之樹結構資料結構
- Java實現資料結構之線性結構Java資料結構
- 資料結構學習(C++)——稀疏矩陣(十字連結串列【2】) (轉)資料結構C++矩陣
- 資料結構學習筆記資料結構筆記
- 從零開始學資料結構和演算法(二)線性表的鏈式儲存結構資料結構演算法
- [資料結構] - 線性表資料結構
- 資料結構 | 線性表資料結構
- 資料結構——線性表資料結構