❶ 關於數據結構的問題,用c語言描述
數據結構復習重點歸納筆記[清華嚴蔚敏版]
數據結構復習重點歸納[適於清華嚴版教材]
一、數據結構的章節結構及重點構成
數據結構學科的章節劃分基本上為:概論,線性表,棧和隊列,串,多維數組和廣義表,樹和二叉樹,圖,查找,內排,外排,文件,動態存儲分配。
對於絕大多數的學校而言,「外排,文件,動態存儲分配」三章基本上是不考的,在大多數高校的計算機本科教學過程中,這三章也是基本上不作講授的。所以,大家在這三章上可以不必花費過多的精力,只要知道基本的概念即可。但是,對於報考名校特別是該校又有在試卷中對這三章進行過考核的歷史,那麼這部分朋友就要留意這三章了。
按照以上我們給出的章節以及對後三章的介紹,數據結構的章節比重大致為:
概論:內容很少,概念簡單,分數大多隻有幾分,有的學校甚至不考。
線性表:基礎章節,必考內容之一。考題多數為基本概念題,名校考題中,鮮有大型演算法設計題。如果有,也是與其它章節內容相結合。
棧和隊列:基礎章節,容易出基本概念題,必考內容之一。而棧常與其它章節配合考查,也常與遞歸等概念相聯系進行考查。
串 :基礎章節,概念較為簡單。專門針對於此章的大型演算法設計題很少,較常見的是根據KMP進行演算法分析。
多維數組及廣義表
:基礎章節,基於數組的演算法題也是常見的,分數比例波動較大,是出題的「可選單元」或「侯補單元」。一般如果要出題,多數不會作為大題出。數組常與「查找,排序」等章節結合來作為大題考查。
樹和二叉樹
:重點難點章節,各校必考章節。各校在此章出題的不同之處在於,是否在本章中出一到兩道大的演算法設計題。通過對多所學校的試卷分析,絕大多數學校在本章都曾有過出大型演算法設計題的歷史。
圖 :重點難點章節,名校尤愛考。如果作為重點來考,則多出現於分析與設計題型當中,可與樹一章共同構成演算法設計大題的題型設計。
查找
:重點難點章節,概念較多,聯系較為緊密,容易混淆。出題時可以作為分析型題目給出,在基本概念型題目中也較為常見。演算法設計型題中可以數組結合來考查,也可以與樹一章結合來考查。
排序
:與查找一章類似,本章同屬於重點難點章節,且概念更多,聯系更為緊密,概念之間更容易混淆。在基本概念的考查中,尤愛考各種排序演算法的優劣比較此類的題。演算法設計大題中,如果作為出題,那麼常與數組結合來考查。
二、數據結構各章節重點勾劃:
第0章 概述
本章主要起到總領作用,為讀者進行數據結構的學習進行了一些先期鋪墊。大家主要注意以下幾點:數據結構的基本概念,時間和空間復雜度的概念及度量方法,演算法設計時的注意事項。本章考點不多,只要稍加註意理解即可。
第一章 線性表
作為線性結構的開篇章節,線性表一章在線性結構的學習乃至整個數據結構學科的學習中,其作用都是不可低估的。在這一章,第一次系統性地引入鏈式存儲的概念,鏈式存儲概念將是整個數據結構學科的重中之重,無論哪一章都涉及到了這個概念。
總體來說,線性表一章可供考查的重要考點有以下幾個方面:
1.線性表的相關基本概念,如:前驅、後繼、表長、空表、首元結點,頭結點,頭指針等概念。
2.線性表的結構特點,主要是指:除第一及最後一個元素外,每個結點都只有一個前趨和只有一個後繼。
3.線性表的順序存儲方式及其在具體語言環境下的兩種不同實現:表空間的靜態分配和動態分配。靜態鏈表與順序表的相似及不同之處。
4.線性表的鏈式存儲方式及以下幾種常用鏈表的特點和運算:單鏈表、循環鏈表,雙向鏈表,雙向循環鏈表。其中,單鏈表的歸並演算法、循環鏈表的歸並演算法、雙向鏈表及雙向循環鏈表的插入和刪除演算法等都是較為常見的考查方式。此外,近年來在不少學校中還多次出現要求用遞歸演算法實現單鏈表輸出(可能是順序也可能是倒序)的問題。
在鏈表的小題型中,經常考到一些諸如:判表空的題。在不同的鏈表中,其判表空的方式是不一樣的,請大家注意。
5.線性表的順序存儲及鏈式存儲情況下,其不同的優缺點比較,即其各自適用的場合。單鏈表中設置頭指針、循環鏈表中設置尾指針而不設置頭指針以及索引存儲結構的各自好處。
第二章 棧與隊列
棧與隊列,是很多學習DS的同學遇到第一隻攔路虎,很多人從這一章開始坐暈車,一直暈到現在。所以,理解棧與隊列,是走向DS高手的一條必由之路,。
學習此章前,你可以問一下自己是不是已經知道了以下幾點:
1.棧、隊列的定義及其相關數據結構的概念,包括:順序棧,鏈棧,共享棧,循環隊列,鏈隊等。棧與隊列存取數據(請注意包括:存和取兩部分)的特點。
2.遞歸演算法。棧與遞歸的關系,以及藉助棧將遞歸轉向於非遞歸的經典演算法:n!階乘問題,fib數列問題,hanoi問題,背包問題,二叉樹的遞歸和非遞歸遍歷問題,圖的深度遍歷與棧的關系等。其中,涉及到樹與圖的問題,多半會在樹與圖的相關章節中進行考查。
3.棧的應用:數值表達式的求解,括弧的配對等的原理,只作原理性了解,具體要求考查此為題目的演算法設計題不多。
4.循環隊列中判隊空、隊滿條件,循環隊列中入隊與出隊演算法。
如果你已經對上面的幾點了如指掌,棧與隊列一章可以不看書了。注意,我說的是可以不看書,並不是可以不作題哦。
第三章 串
經歷了棧一章的痛苦煎熬後,終於迎來了串一章的柳暗花明。
串,在概念上是比較少的一個章節,也是最容易自學的章節之一,但正如每個過來人所了解的,KMP演算法是這一章的重要關隘,突破此關隘後,走過去又是一馬平川的大好DS山河了,呵呵。
串一章需要攻破的主要堡壘有:
1.串的基本概念,串與線性表的關系(串是其元素均為字元型數據的特殊線性表),空串與空格串的區別,串相等的條件
2.串的基本操作,以及這些基本函數的使用,包括:取子串,串連接,串替換,求串長等等。運用串的基本操作去完成特定的演算法是很多學校在基本操作上的考查重點。
3.順序串與鏈串及塊鏈串的區別和聯系,實現方式。
4.KMP演算法思想。KMP中next數組以及nextval數組的求法。明確傳統模式匹配演算法的不足,明確next數組需要改進之外。其中,理解演算法是核心,會求數組是得分點。不用我多說,這一節內容是本章的重中之重。可能進行的考查方式是:求next和nextval數組值,根據求得的next或nextval數組值給出運用KMP演算法進行匹配的匹配過程。
第四章 數組與廣義表
學過程序語言的朋友,數組的概念我們已經不是第一次見到了,應該已經「一回生,二回熟」了,所以,在概念上,不會存在太大障礙。但作為考研課程來說,本章的考查重點可能與大學里的程序語言所關注的不太一樣,下面會作介紹。
廣義表的概念,是數據結構里第一次出現的。它是線性表或表元素的有限序列,構成該結構的每個子表或元素也是線性結構的,所以,這一章也歸入線性結構中。
本章的考查重點有:
1.多維數組中某數組元素的position求解。一般是給出數組元素的首元素地址和每個元素佔用的地址空間並組給出多維數組的維數,然後要求你求出該數組中的某個元素所在的位置。
2.明確按行存儲和按列存儲的區別和聯系,並能夠按照這兩種不同的存儲方式求解1中類型的題。
3.將特殊矩陣中的元素按相應的換算方式存入數組中。這些矩陣包括:對稱矩陣,三角矩陣,具有某種特點的稀疏矩陣等。熟悉稀疏矩陣的三種不同存儲方式:三元組,帶輔助行向量的二元組,十字鏈表存儲。掌握將稀疏矩陣的三元組或二元組向十字鏈表進行轉換的演算法。
4.廣義表的概念,特別應該明確表頭與表尾的定義。這一點,是理解整個廣義表一節演算法的基礎。近來,在一些學校中,出現了這樣一種題目類型:給出對某個廣義表L若干個求了若干次的取頭和取尾操作後的串值,要求求出原廣義表L。大家要留意。
5.與廣義表有關的遞歸演算法。由於廣義表的定義就是遞歸的,所以,與廣義表有關的演算法也常是遞歸形式的。比如:求表深度,復制廣義表等。這種題目,可以根據不同角度廣義表的表現形式運用兩種不同的方式解答:一是把一個廣義表看作是表頭和表尾兩部分,分別對表頭和表尾進行操作;二是把一個廣義表看作是若干個子表,分別對每個子表進行操作。
第五章 樹與二叉樹
從對線性結構的研究過度到對樹形結構的研究,是數據結構課程學習的一次躍變,此次躍變完成的好壞,將直接關繫到你到實際的考試中是否可以拿到高分,而這所有的一切,將最終影響你的專業課總分。所以,樹這一章的重要性,已經不說自明了。
總體來說,樹一章的知識點包括:
二叉樹的概念、性質和存儲結構,二叉樹遍歷的三種演算法(遞歸與非遞歸),在三種基本遍歷演算法的基礎上實現二叉樹的其它演算法,線索二叉樹的概念和線索化演算法以及線索化後的查找演算法,最優二叉樹的概念、構成和應用,樹的概念和存儲形式,樹與森林的遍歷演算法及其與二叉樹遍歷演算法的聯系,樹與森林和二叉樹的轉換。
下面我們來看考試中對以上知識的主要考查方法:
1.二叉樹的概念、性質和存儲結構
考查方法可有:直接考查二叉樹的定義,讓你說明二叉樹與普通雙分支樹的區別;考查滿二叉樹和完全二叉樹的性質,普通二叉樹的五個性質:第i層的最多結點數,深度為k的二叉樹的最多結點數,n0=n2+1的性質,n個結點的完全二叉樹的深度,順序存儲二叉樹時孩子結點與父結點之間的換算關系(左為:2*i,右為:2*i+1)。
二叉樹的順序存儲和二叉鏈表存儲的各自優缺點及適用場合,二叉樹的三叉鏈表表示方法。
2.二叉樹的三種遍歷演算法
這一知識點掌握的好壞,將直接關繫到樹一章的演算法能否理解,進而關繫到樹一章的演算法設計題能否順利完成。二叉樹的遍歷演算法有三種:先序,中序和後序。其劃分的依據是視其每個演算法中對根結點數據的訪問順序而定。不僅要熟練掌握三種遍歷的遞歸演算法,理解其執行的實際步驟,並且應該熟練掌握三種遍歷的非遞歸演算法。由於二叉樹一章的很多演算法,可以直接根據三種遞歸演算法改造而來(比如:求葉子個數),所以,掌握了三種遍歷的非遞歸演算法後,對付諸如:「利用非遞歸演算法求二叉樹葉子個數」這樣的題目就下筆如有神了。我會在另一篇系列文章()里給出三種遍歷的遞歸和非遞歸演算法的背記版,到時請大家一定熟記。
3.可在三種遍歷演算法的基礎上改造完成的其它二叉樹演算法:
求葉子個數,求二叉樹結點總數,求度為1或度為2的結點總數,復制二叉樹,建立二叉樹,交換左右子樹,查找值為n的某個指定結點,刪除值為n的某個指定結點,諸如此類等等等等。如果你可以熟練掌握二叉樹的遞歸和非遞歸遍歷演算法,那麼解決以上問題就是小菜一碟了。
4.線索二叉樹:
線索二叉樹的引出,是為避免如二叉樹遍歷時的遞歸求解。眾所周知,遞歸雖然形式上比較好理解,但是消耗了大量的內存資源,如果遞歸層次一多,勢必帶來資源耗盡的危險,為了避免此類情況,線索二叉樹便堂而皇之地出現了。對於線索二叉樹,應該掌握:線索化的實質,三種線索化的演算法,線索化後二叉樹的遍歷演算法,基本線索二叉樹的其它演算法問題(如:查找某一類線索二叉樹中指定結點的前驅或後繼結點就是一類常考題)。
5.最優二叉樹(哈夫曼樹):
最優二叉樹是為了解決特定問題引出的特殊二叉樹結構,它的前提是給二叉樹的每條邊賦予了權值,這樣形成的二叉樹按權相加之和是最小的。最優二叉樹一節,直接考查演算法源碼的很少,一般是給你一組數據,要求你建立基於這組數據的最優二叉樹,並求出其最小權值之和,此類題目不難,屬送分題。
6.樹與森林:
二叉樹是一種特殊的樹,這種特殊不僅僅在於其分支最多為2以及其它特徵,一個最重要的特殊之處是在於:二叉樹是有序的!即:二叉樹的左右孩子是不可交換的,如果交換了就成了另外一棵二叉樹,這樣交換之後的二叉樹與原二叉樹我們認為是不相同的兩棵二叉樹。但是,對於普通的雙分支樹而言,不具有這種性質。
樹與森林的遍歷,不像二叉樹那樣豐富,他們只有兩種遍歷演算法:先根與後根(對於森林而言稱作:先序與後序遍歷)。在難度比較大的考試中,也有基於此二種演算法的基礎上再進行擴展要求你利用這兩種演算法設計其它演算法的,但一般院校很少有這種考法,最多隻是要求你根據先根或後根寫出他們的遍歷序列。此二者的先根與後根遍歷與二叉樹中的遍歷演算法是有對應關系的:先根遍歷對應二叉樹的先序遍歷,而後根遍歷對應二叉樹的中序遍歷。這一點成為很多學校的考點,考查的方式不一而足,有的直接考此句話,有的是先讓你求解遍歷序列然後回答這個問題。二叉樹、樹與森林之所以能有以上的對應關系,全拜二叉鏈表所賜。二叉樹使用二叉鏈表分別存放他的左右孩子,樹利用二叉鏈表存儲孩子及兄弟(稱孩子兄弟鏈表),而森林也是利用二叉鏈表存儲孩子及兄弟。
樹一章,處處是重點,道道是考題,大家務必個個過關。
第六章 圖
如果說,從線性結構向樹形結構研究的轉變,是數據結構學科對數據組織形式研究的一次升華,那麼從樹形結構的研究轉到圖形結構的研究,則進一步讓我們看到了數據結構對於解決實際問題的重大推動作用。
圖這一章的特點是:概念繁多,與離散數學中圖的概念聯系緊密,演算法復雜,極易被考到,且容易出大題,尤其是名校,作為考研課程,如果不考查樹與圖兩章的知識,幾乎是不可想像的。
下面我們看一下圖這一章的主要考點以及這些考點的考查方式:
1.考查有關圖的基本概念問題:
這些概念是進行圖一章學習的基礎,這一章的概念包括:圖的定義和特點,無向圖,有向圖,入度,出度,完全圖,生成子圖,路徑長度,迴路,(強)連通圖,(強)連通分量等概念。與這些概念相聯系的相關計算題也應該掌握。
2.考查圖的幾種存儲形式:
圖的存儲形式包括:鄰接矩陣,(逆)鄰接表,十字鏈表及鄰接多重表。在考查時,有的學校是給出一種存儲形式,要求考生用演算法或手寫出與給定的結構相對應的該圖的另一種存儲形式。
3.考查圖的兩種遍歷演算法:深度遍歷和廣度遍歷
深度遍歷和廣度遍歷是圖的兩種基本的遍歷演算法,這兩個演算法對圖一章的重要性等同於「先序、中序、後序遍歷」對於二叉樹一章的重要性。在考查時,圖一章的演算法設計題常常是基於這兩種基本的遍歷演算法而設計的,比如:「求最長的最短路徑問題」和「判斷兩頂點間是否存在長為K的簡單路徑問題」,就分別用到了廣度遍歷和深度遍歷演算法。
4.生成樹、最小生成樹的概念以及最小生成樹的構造:PRIM演算法和KRUSKAL演算法。
考查時,一般不要求寫出演算法源碼,而是要求根據這兩種最小生成樹的演算法思想寫出其構造過程及最終生成的最小生成樹。
5.拓撲排序問題:
拓撲排序有兩種方法,一是無前趨的頂點優先演算法,二是無後繼的頂點優先演算法。換句話說,一種是「從前向後」的排序,一種是「從後向前」排。當然,後一種排序出來的結果是「逆拓撲有序」的。
6.關鍵路徑問題:
這個問題是圖一章的難點問題。理解關鍵路徑的關鍵有三個方面:一是何謂關鍵路徑,二是最早時間是什麼意思、如何求,三是最晚時間是什麼意思、如何求。簡單地說,最早時間是通過「從前向後」的方法求的,而最晚時間是通過「從後向前」的方法求解的,並且,要想求最晚時間必須是在所有的最早時間都已經求出來之後才能進行。這個問題拿來直接考演算法源碼的不多,一般是要求按照書上的演算法描述求解的過程和步驟。
在實際設計關鍵路徑的演算法時,還應該注意以下這一點:採用鄰接表的存儲結構,求最早時間和最晚時間要採用不同的處理方法,即:在演算法初始時,應該首先將所有頂點的最早時間全部置為0。關鍵路徑問題是工程進度控制的重要方法,具有很強的實用性。
7.最短路徑問題:
與關鍵路徑問題並稱為圖一章的兩只攔路虎。概念理解是比較容易的,關鍵是演算法的理解。最短路徑問題分為兩種:一是求從某一點出發到其餘各點的最短路徑;二是求圖中每一對頂點之間的最短路徑。這個問題也具有非常實用的背景特色,一個典型的應該就是旅遊景點及旅遊路線的選擇問題。解決第一個問題用DIJSKTRA演算法,解決第二個問題用FLOYD演算法。注意區分。
第七章 查找
在不少數據結構的教材中,是把查找與排序放入高級數據結構中的。應該說,查找和排序兩章是前面我們所學的知識的綜合運用,用到了樹、也用到了鏈表等知識,對這些數據結構某一方面的運用就構成了查找和排序。
現實生活中,search幾乎無處不在,特別是現在的網路時代,萬事離不開search,小到文檔內文字的搜索,大到INTERNET上的搜索,search占據了我們上網的大部分時間。
在復習這一章的知識時,你需要先弄清楚以下幾個概念:
關鍵字、主關鍵字、次關鍵字的含義;靜態查找與動態查找的含義及區別;平均查找長度ASL的概念及在各種查找演算法中的計算方法和計算結果,特別是一些典型結構的ASL值,應該記住。
在DS的教材中,一般將search分為三類:1st,在順序表上的查找;2nd,在樹表上的查找;3rd,在哈希表上的查找。下面詳細介紹其考查知識點及考查方式:
1.線性表上的查找:
主要分為三種線性結構:順序表,有序順序表,索引順序表。對於第一種,我們採用傳統查找方法,逐個比較。對於及有序順序表我們採用二分查找法。對於第三種索引結構,我們採用索引查找演算法。考生需要注意這三種表下的ASL值以及三種演算法的實現。其中,二分查找還要特別注意適用條件以及其遞歸實現方法。
2.樹表上的查找:
這是本章的重點和難點。由於這一節介紹的內容是使用樹表進行的查找,所以很容易與樹一間的某些概念相混淆。本節內容與樹一章的內容有聯系,但也有很多不同,應注意規納。樹表主要分為以下幾種:二叉排序樹,平衡二叉樹,B樹,鍵樹。其中,尤以前兩種結構為重,也有部分名校偏愛考B樹的。由於二叉排序樹與平衡二叉樹是一種特殊的二叉樹,所以與二叉樹的聯系就更為緊密,二叉樹一章學好了,這里也就不難了。
二叉排序樹,簡言之,就是「左小右大」,它的中序遍歷結果是一個遞增的有序序列。平衡二叉樹是二叉排序樹的優化,其本質也是一種二叉排序樹,只不過,平衡二叉樹對左右子樹的深度有了限定:深度之差的絕對值不得大於1。對於二叉排序樹,「判斷某棵二叉樹是否二叉排序樹」這一演算法經常被考到,可用遞歸,也可以用非遞歸。平衡二叉樹的建立也是一個常考點,但該知識點歸根結底還是關注的平衡二叉樹的四種調整演算法,所以應該掌握平衡二叉樹的四種調整演算法,調整的一個參照是:調整前後的中序遍歷結果相同。
B樹是二叉排序樹的進一步改進,也可以把B樹理解為三叉、四叉....排序樹。除B樹的查找演算法外,應該特別注意一下B樹的插入和刪除演算法。因為這兩種演算法涉及到B樹結點的分裂和合並,是一個難點。B樹是報考名校的同學應該關注的焦點之一。
鍵樹也稱字元樹,特別適用於查找英文單詞的場合。一般不要求能完整描述演算法源碼,多是根據演算法思想建立鍵樹及描述其大致查找過程。
3.基本哈希表的查找演算法:
哈希一詞,是外來詞,譯自「hash」一詞,意為:散列或雜湊的意思。哈希表查找的基本思想是:根據當前待查找數據的特徵,以記錄關鍵字為自變數,設計一個function,該函數對關鍵字進行轉換後,其解釋結果為待查的地址。基於哈希表的考查點有:哈希函數的設計,沖突解決方法的選擇及沖突處理過程的描述。
第八章 內部排序
內排是DS課程中最後一個重要的章節,建立在此章之上的考題可以有多種類型:填空,選擇,判斷乃至大型演算法題。但是,歸結到一點,就是考查你對書本上的各種排序演算法及其思想以及其優缺點和性能指標(時間復雜度)能否了如指掌。
這一章,我們對重點的規納將跟以上各章不同。我們將從以下幾個側面來對排序一章進行不同的規納,以期能更全面的理解排序一章的總體結構及各種演算法。
從排序演算法的種類來分,本章主要闡述了以下幾種排序方法:插入、選擇、交換、歸並、計數等五種排序方法。
其中,在插入排序中又可分為:直接插入、折半插入、2路插入、希爾排序。這幾種插入排序演算法的最根本的不同點,說到底就是根據什麼規則尋找新元素的插入點。直接插入是依次尋找,折半插入是折半尋找。希爾排序,是通過控制每次參與排序的數的總范圍「由小到大」的增量來實現排序效率提高的目的。
交換排序,又稱冒泡排序,在交換排序的基礎上改進又可以得到快速排序。快速排序的思想,一語以敝之:用中間數將待排數據組一分為二。快速排序,在處理的「問題規模」這個概念上,與希爾有點相反,快速排序,是先處理一個較大規模,然後逐漸把處理的規模降低,最終達到排序的目的。
選擇排序,相對於前面幾種排序演算法來說,難度大一點。具體來說,它可以分為:簡單選擇、樹選擇、堆排。這三種方法的不同點是,根據什麼規則選取最小的數。簡單選擇,是通過簡單的數組遍歷方案確定最小數;樹選擇,是通過「錦標賽」類似的思想,讓兩數相比,不斷淘汰較大(小)者,最終選出最小(大)數;而堆排序,是利用堆這種數據結構的性質,通過堆元素的刪除、調整等一系列操作將最小數選出放在堆頂。堆排序中的堆建立、堆調整是重要考點。樹選擇排序,也曾經在一些學校中的大型演算法題中出現,請大家注意。
歸並排序,故名思義,是通過「歸並」這種操作完成排序的目的,既然是歸並就必須是兩者以上的數據集合才可能實現歸並。所以,在歸並排序中,關注最多的就是2路歸並。演算法思想比較簡單,有一點,要銘記在心:歸並排序是穩定排序。
基數排序,是一種很特別的排序方法,也正是由於它的特殊,所以,基數排序就比較適合於一些特別的場合,比如撲克牌排序問題等。基數排序,又分為兩種:多關鍵字的排序(撲克牌排序),鏈式排序(整數排序)。基數排序的核心思想也是利用「基數空間」這個概念將問題規模規范、變小,並且,在排序的過程中,只要按照基排的思想,是不用進行關鍵字比較的,這樣得出的最終序列就是一個有序序列。
本章各種排序演算法的思想以及偽代碼實現,及其時間復雜度都是必須掌握的,學習時要多注意規納、總結、對比。此外,對於教材中的10.7節,要求必須熟記,在理解的基礎上記憶,這一節幾乎成為很多學校每年的必考點。
至此,數據結構所有章節的章節重點問題,我們已經規納完畢,使用清華嚴版教材的同學,在復習的同時,可以參照本貼給出的重點進行復習。但是,由於作者本人水平有限,可能有很多考點沒有規納出來,也可能有些考點規納有誤,在此,作者本人誠懇希望諸位朋友直面提出,我會不斷完善和發布新的關於數據結構復習的總結以及筆記
嚴蔚敏數據結構為主的筆記二
第二章:線性表(包括習題與答案及要點)
--------------------------------------------------------------------------------
本章的重點是掌握順序表和單鏈表上實現的各種基本演算法及相關的時間性能分析,難點是使用本章所學的基本知識設計有效演算法解決與線性表相關的應用問題。
要求達到<識記>層次的內容有:線性表的邏輯結構特徵;線性表上定義的基本運算,並利用基本運算構造出較復雜的運算。
要求達到<綜合應用>層次的內容有:順序表的含義及特點,順序表上的插入、刪除操作及其平均時間性能分析,解決簡單應用問題。
鏈表如何表示線性表中元素之間的邏輯關系;單鏈表、雙鏈表、循環鏈表鏈接方式上的區別;單鏈表上實現的建表、查找、插入和刪除等基本演算法及其時間復雜度。循環鏈表上尾指針取代頭指針的作用,以及單循環鏈表上的演算法與單鏈表上相應演算法的異同點。雙鏈表的定義和相關演算法。利用鏈表設計演算法解決簡單應用問題。
要求達到<領會>層次的內容就是順序表和鏈表的比較,以及如何選擇其一作為其存儲結構才能取得較優的時空性能。
--------------------------------------------------------------------------------
線性表的邏輯結構特徵是很容易理解的,如其名,它的邏輯結構特徵就好象是一條線,上面打了一個個結,很形象的,如果這條線上面有結,那麼它就是非空表,只能有一個開始結點,有且只能有一個終端結點,其它的結前後所相鄰的也只能是一個結點(直接前趨和直接後繼)。
關於線性表上定義的基本運算,主要有構造空表、求表長、取結點、查找、插入、刪除等。
--------------------------------------------------------------------------------
線性表的邏輯結構和存儲結構之間的關系。在計算機中,如何把線性表的結點存放到存儲單元中,就有許多方法,最簡單的方法就是按順序存儲。就是按線性表的邏輯結構次序依次存放在一組地址連續的存儲單元中。在存儲單元中的各元素的物理位置和邏輯結構中各結點相鄰關系是一致的。
在順序表中實現的基本運算主要討論了插入和刪除兩種運算。相關的演算法我們通過練習掌握。對於順序表的插入和刪除運算,其平均時間復雜度均為O(n)。
--------------------------------------------------------------------------------
線性表的鏈式存儲結構。它與順序表不同,鏈表是用一組任意的存儲單元來存放線性表的結點,這組存儲單元可以分布在內存中任何位置上。因此,鏈表中結點的邏輯次序和物理次序不一定相同。所以為了能正確表示結點間的邏輯關系,在存儲每個結點值的同時,還存儲了其後繼結點的地址信息(即
❷ 數據結構創建一棵樹的c語言代碼怎麼寫
剛剛回答了一個類似的問題,以下代碼供參考:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
typedef struct BiTNode { // 結點結構
TElemType data;
struct BiTNode *lchild, *rchild;
// 左右孩子指針
} BiTNode, *BiTree;
//以下是建立二叉樹存儲結構,空節點輸入作為#結束標識
Status CreateBiTree(BiTree &T) {
//請將該演算法補充完整,參見第6章課件演算法或課本
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
} // CreateBiTree
void Preorder(BiTree T)
{
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void Inorder(BiTree T)
{ // 中序遍歷二叉樹
//請將該演算法補充完整,參見第6章課件演算法
if(T)
{
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
void Postorder(BiTree T)
{ // 後序遍歷二叉樹
//請將該演算法補充完整,參見第6章課件演算法
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
//以下是求葉子結點數
void CountLeaf(BiTree T,int& count){
//請將該演算法補充完整,參見第6章課件演算法
if(T){
if((!T->lchild)&&(!T->rchild))
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
//以下是求二叉樹的深度
int Depth(BiTree T ){
//請將該演算法補充完整,參見第6章課件演算法
int depthval,depthLeft,depthRight;
if(!T) depthval=0;
else{
depthLeft = Depth(T->lchild);
depthRight = Depth(T->rchild);
if(depthLeft>depthRight)depthval = 1+depthLeft;
else depthval = 1+depthRight;
}
return depthval;
}
void main(){
BiTree T;
int s=0,d;
printf("\n creat of the bitree:\n");
CreateBiTree(T);
printf("\n output result of Preorder:\n");
Preorder(T);
CountLeaf(T,s);
d=Depth(T);
printf("\n leaves=%d\n",s);
printf("\n depth=%d\n",d);
}
❸ c語言考哪些內容啊
全國計算機等級考試二級(C語言)考試內容:
公共基礎知識 基本要求
1.掌握演算法的基本概念。
2.掌握基本數據結構及其操作。
3.掌握基本排序和查找演算法。
4.掌握逐步求精的結構化程序設計方法。
5.掌握軟體工程的基本方法,具有初步應用相關技術進行軟體開發的能力。
6.掌握資料庫的基本知識,了解關系資料庫的設計。
考試內容
一、基本數據結構與演算法
1.演算法的基本概念;演算法復雜度的概念和意義(時間復雜度與空間復雜度)。
2.數據結構的定義;數據的邏輯結構與存儲結構;數據結構的圖形表示;線性結構與非線性結構的概念。
3.線性表的定義;線性表的順序存儲結構及其插入與刪除運算。
4.棧和隊列的定義;棧和隊列的順序存儲結構及其基本運算。
5.線性單鏈表、雙向鏈表與循環鏈表的結構及其基本運算。
6.樹的基本概念;二叉樹的定義及其存儲結構;二叉樹的前序、中序和後序遍歷。
7.順序查找與二分法查找演算法;基本排序演算法(交換類排序,選擇類排序,插入類排序)。
二、程序設計基礎
1.程序設計方法與風格
2.結構化程序設計。
3.面向對象的程序設計方法,對象,方法,屬性及繼承與多態性。
考試方式
1.公共基礎知識的考試方式為筆試,與C語言程序設計(C++語言程序設計、Java語言程序設計、Visual Basic語言程序設計、Visual FoxPro資料庫程序設計或Access資料庫程序設計)的筆試部分合為一張試卷,公共基礎知識部分佔全卷的30分。
2.公共基礎知識有l0道選擇題和5道填空題。
C語言程序設計
基本要求
1.熟悉TURBO C集成環境。
2.熟練掌握結構化程序設計的方法,具有良好的程序設計風格。
3.掌握程序設計中簡單的數據結構和演算法。
4.TURBO C的集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力。
考試內容
一、C語言的結構
1.程序的構成,MAIN函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,空類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.數據的輸入與輸出,輸入輸出函數的調用。
3.復合語句。 4.GOTO語句和語句標號的使用。
四、選擇結構程序設計
1.用IF語句實現選擇結構。
2.用SWITCH語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.FOR循環結構。
2.WHILE和DO WHILE循環結構。
3.CONTINUE語句和BREAK語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和多維數組的定義、初始化和引用
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值的傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
8.內部函數與外部函數。
八、編譯預處理
1.宏定義:不帶參數的宏定義;帶參數的宏定義。
2.「文件包含」處理。
九、指針
1.指針與指針變數的概念,指針與地址運算符。
2.變數、數組、字元串、函數、結構體的指針以及指向變數、數組、字元串、函數、結構體的指針變數。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回指針值的指針函數。
5.指針數組,指向指針的指針,MAIN函數的命令行參數。
十、結構體(即「結構」)與共用體(即「聯合」)
1.結構體和共用體類型數據的定義方法和引用方法。
2.用指針和結構體構成鏈表,單向鏈表的建立、輸出、刪除與插入。
十一、位運算
1.位運算符的含義及使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)
不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(FOPEN,FCLOSE)。
3.文件的讀寫(FPUTC,FGETC,FPUTS,FGETS,FREAD,FWRITE,FPRINTF,FSCANF函數),文件的定位(REWIND,FSEEK函數)。
考試方式
1.筆試:120分鍾,滿分100分,其中含公共基礎知識部分的30分。
2.上機:60分鍾,滿分100分。
上機操作包括: (1)填空。 (2)改錯。 (3)編程。全國計算機等級考試(National Computer Rank Examination,簡稱NCRE),是在1994年,經原國家教育委員會(現教育部)批准,由教育部考試中心主辦,面向社會,用於考查應試人員計算機應用知識與能力的全國性計算機水平考試體系。它是一種重視應試人員對計算機和軟體的實際掌握能力的考試。成績合格者由教育部考試中心頒發考試合格證書。合格證書用中、英文兩種文字書寫,全國通用。
考試內容:
一級
考核微型計算機基礎知識和使用辦公軟體及網際網路(Internet)的基本技能。
考試科目:一級MS Office、一級WPS Office、一級Photoshop應用
二級
考核計算機基礎知識和使用一種高級計算機語言編寫程序以及上機調試的基本技能。
考試科目:語言程序設計(C、C++、Java、Visual Basic、WEB程序設計)、資料庫程序設計(VisualFoxPro、Access、MySQL)、辦公軟體高級應用(MS Office高級應用)
三級
分為「嵌入式技術」、「信息安全技術」、「資料庫技術」、「網路技術」和軟體測試技術五個科目。「信息安全技術」考核計算機信息管理應用基礎知識及管理信息系統項目和辦公自動化系統項目開發、維護的基本技能;「資料庫技術」考核資料庫系統基礎知識及資料庫應用系統項目開發和維護的基本功能;「網路技術」考核計算機網路基礎知識及計算機網路應用系統開發和管理的基本技能。
四級
計算機四級包括軟體測試工程師、網路工程師、信息安全工程師、嵌入式系統開發工程師、資料庫工程師五個科目
四級網路工程師證書表明持有人具有網路系統規劃、設計的基本能力,掌握中小型網路系統組建、設備配置調試的基本技術,掌握中小型網路系統現場維護與管理的基本技術,可以從事計算機網路規劃、設計、組建與管理的相關工作。
四級資料庫工程師證書表明持有人掌握資料庫系統的基本理論和技術,能夠使用SQL語言實現資料庫的建立、維護和管理,具備利用工具軟體開發基本資料庫應用系統的能力,能夠勝任中小型資料庫的維護、管理和應用開發。
四級「軟體測試工程師」證書表明持有人具有軟體工程和軟體質量保證的基礎知識,掌握軟體測試的基本理論、方法和技術,理解軟體測試的規范和標准,熟悉軟體測試過程;具備制定軟體測試計劃和大綱、設計測試用例、選擇和運用測試工具、執行軟體測試、分析和評估測試結果以及參與軟體測試過程管理的能力,滿足軟體測試崗位的要求。
❹ 求數據結構 B-樹與B+樹及其操作的代碼(C語言版)
那個叫二叉樹啊
樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。
一、樹的概述
樹結構的特點是:它的每一個結點都可以有不止一個直接後繼,除根結點外的所有結點都有且只有一個直接前趨。以下具體地給出樹的定義及樹的數據結構表示。
(一)樹的定義
樹是由一個或多個結點組成的有限集合,其中:
⒈必有一個特定的稱為根(ROOT)的結點;
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且,
這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次,如上圖,其深度為4;
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
5.樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如上圖可寫成如下形式:
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
5.
2
二叉樹
1.二叉樹的基本形態:
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:
(1)空二叉樹——(a);
(2)只有一個根結點的二叉樹——(b);
(3)右子樹為空的二叉樹——(c);
(4)左子樹為空的二叉樹——(d);
(5)完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
❺ 計算機二級c語言知識點
2017計算機二級c語言知識點精選
計算機二級C語言考試內容是什麼?為幫助大家更好備考3月計算機考試,我為大家分享計算機C語言二級考試知識點如下:
第一章 數據結構與演算法
1.1 演算法
1.演算法的基本概念
(1) 概念:演算法是指一系列解決問題的清晰指令。
(2) 4個基本特徵:可行性、確定性、有窮性、擁有足夠的情報。
(3) 兩種基本要素:對數據對象的運算和操作、演算法的控制結構(運算和操作時問的順序)。
(4) 設計的基本方法:列舉法、歸納法、遞推法、遞歸法、減半遞推技術和回溯法。
2.演算法的復雜度
(1) 演算法的時間復雜度:執行演算法所需要的計算工作量。
(2) 演算法的空間復雜度:執行演算法所需的內存空間。
1.2 數據結構的基本概念
數據結構指相互有關聯的數據元素的集合,即數據的組織形式。其中邏輯結構反映數據元素之間邏輯關系;存儲結構為數據的邏輯結構在計算機存儲空間中的存放形式,有順序存儲、鏈式存儲、索引存儲和散列存儲4種方式。
數據結構按各元素之間前後件關系的復雜度可劃分為:
(1) 線性結構:有且只有一個根節點,且每個節點最多有一個直接前驅和一個直接後繼的非空數據結構。
(2) 非線性結構:不滿足線性結構的數據結構。
1.3 線性表及其順序存儲結構
1.線性表的基本概念
線性結構又稱線性表,線性表是最簡單也是最常用的一種數據結構。
2.線性表的順序存儲結構
元素所佔的存儲空間必須連續。
元素在存儲空間的位置是按邏輯順序存放的。
3.線性表的插入運算
在第i個元素之前插入一個新元素的步驟如下:
步驟一:把原來第n個節點至第i個節點依次往後移一個元素位置。
步驟二:把新節點放在第i個位置上。
步驟三:修正線性表的節點個數。
在最壞情況下,即插入元素在第一個位置,線性表中所有元素均需要移動。
4.線性表的刪除運算
刪除第i個位置的元素的步驟如下:
步驟一:把第i個元素之後不包括第i個元素的n-i個元素依次前移一個位置;
步驟二:修正線性表的結點個數。
1.4 棧和隊列
1.棧及其基本運算
(1) 基本概念:棧是一種特殊的線性表,其插入運算與刪除運算都只在線性表的一端進行,也被稱為「先進後出」表或「後進先出」表。
棧頂:允許插入與刪除的一端。
棧底:棧頂的另一端。
空棧:棧中沒有元素的棧。
(2) 特點。
棧頂元素是最後插入和最早被刪除的元素。
棧底元素是最早插入和最後被刪除的元素。
棧有記憶作用。
在順序存儲結構下,棧的插入和刪除運算不需移動表中其他數據元素。
棧頂指針top動態反映了棧中元素的變化情況
(3) 順序存儲和運算:入棧運算、退棧運算和讀棧頂運算。
2.隊列及其基本運算
(1) 基本概念:隊列是指允許在一端進行插入,在另一端進行刪除的線性表,又稱「先進先出」的線性表。
隊尾:允許插入的一端,用尾指針指向隊尾元素。
排頭:允許刪除的一端,用頭指針指向頭元素的前一位置。
(2) 循環隊列及其運算。
所謂循環隊列,就是將隊列存儲空間的最後一個位置繞到第一個位置,形成邏輯上的環狀空間。
入隊運算是指在循環隊列的隊尾加入一個新元素。
當循環隊列非空(s=1)且隊尾指針等於隊頭指針時,說明循環隊列已滿,不能進行人隊運算,這種情況稱為「上溢」。
退隊運算是指在循環隊列的隊頭位置退出一個元素並賦給指定的變數。首先將隊頭指針進一,然後將排頭指針指向的元素賦給指定的變數。當循環隊列為空(s=0)時,不能進行退隊運算,這種情況稱為「下溢」。
1.5 線性鏈表
在定義的鏈表中,若只含有一個指針域來存放下一個元素地址,稱這樣的鏈表為單鏈表或線性鏈表。
在鏈式存儲方式中,要求每個結點由兩部分組成:一部分用於存放數據元素值,稱為數據域;另一部分用於存放指針,稱為指針域。其中指針用於指向該結點的前一個或後一個結點(即前件或後件)。
1.6 樹和二叉樹
1.樹的基本概念
樹是簡單的非線性結構,樹中有且僅有一個沒有前驅的節點稱為「根」,其餘節點分成m個互不相交的有限集合T1,T2,…,T}mm,每個集合又是一棵樹,稱T1,T2,…,T}mm為根結點的子樹。
父節點:每一個節點只有一個前件,無前件的節點只有一個,稱為樹的根結點(簡稱樹的根)。
子節點:每~個節點可以後多個後件,無後件的節點稱為葉子節點。
樹的度:所有節點最大的度。
樹的深度:樹的最大層次。
2.二叉樹的定義及其基本性質
(1) 二叉樹的定義:二叉樹是一種非線性結構,是有限的節點集合,該集合為空(空二叉樹)或由一個根節點及兩棵互不相交的左右二叉子樹組成。可分為滿二叉樹和完全二叉樹,其中滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。二叉樹具有如下兩個特點:
二叉樹可為空,空的二叉樹無節點,非空二叉樹有且只有一個根結點;
每個節點最多可有兩棵子樹,稱為左子樹和右子樹。
(2) 二叉樹的基本性質。
性質1:在二叉樹的第k層上至多有2k-1個結點(k≥1)。
性質2:深度為m的二叉樹至多有2m-1個結點。
性質3:對任何一棵二叉樹,度為0的結點(即葉子結點)總是比度為2的結點多一個。
性質4:具有n個結點的完全二叉樹的深度至少為[log2n]+1,其中[log2n]表示log2n的整數部分。
3.滿二叉樹與完全二叉樹
(1) 滿二叉樹:滿二叉樹是指這樣的一種二叉樹:除最後一層外,每一層上的所有結點都有兩個子結點。滿二叉樹在其第i層上有2i-1個結點。
從上面滿二叉樹定義可知,二叉樹的每一層上的結點數必須都達到最大,否則就不是滿二叉樹。深度為m的滿二叉樹有2m-1個結點。
(2) 完全二叉樹:完全二叉樹是指這樣的二叉樹:除最後一層外,每一層上的結點數均達到最大值;在最後一層上只缺少右邊的若干結點。
如果—棵具有n個結點的深度為k的二叉樹,它的每—個結點都與深度為k的滿二叉樹中編號為1~n的結點——對應。
3.二叉樹的存儲結構
二叉樹通常採用鏈式存儲結構,存儲節點由數據域和指針域(左指針域和右指針域)組成。二叉樹的鏈式存儲結構也稱二叉鏈表,對滿二叉樹和完全二叉樹可按層次進行順序存儲。
4.二叉樹的遍歷
二叉樹的遍歷是指不重復地訪問二叉樹中所有節點,主要指非空二叉樹,對於空二叉樹則結束返回。二叉樹的遍歷包括前序遍歷、中序遍歷和後序遍歷。
(1) 前序遍歷。
前序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹;並且,在遍歷左右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。前序遍歷描述為:若二叉樹為空,則執行空操作;否則①訪問根結點;②前序遍歷左子樹;③前序遍歷右子樹。
(2) 中序遍歷。
中序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。中序遍歷描述為:若二叉樹為空,則執行空操作;否則①中序遍歷左子樹;②訪問根結點;③中序遍歷右子樹。
(3) 後序遍歷。
後序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點,並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。後序遍歷描述為:若二叉樹為空,則執行空操作;否則①後序遍歷左子樹;②後序遍歷右子樹;③訪問根結點。
1.7 查找技術
(1) 順序查找:在線性表中查找指定的元素。
(2) 最壞情況下,最後一個元素才是要找的元素,則需要與線性表中所有元素比較,比較次數為n。
(3) 二分查找:二分查找也稱折半查找,它是一種高效率的查找方法。但二分查找有條件限制,它要求表必須用順序存儲結構,且表中元素必須按關鍵字有序(升序或降序均可)排列。對長度為n的有序線性表,在最壞情況下,二分查找法只需比較log2n次。
1.8 排序技術
(1) 交換類排序法。
冒泡排序:通過對待排序序列從後向前或從前向後,依次比較相鄰元素的排序碼,若發現逆序則交換,使較大的元素逐漸從前部移向後部或較小的元素逐漸從後部移向前部,直到所有元素有序為止。在最壞情況下,對長度為n的線性表排序,冒泡排序需要比較的次數為n(n-1)/2。
快速排序:是迄今為止所有內排序演算法中速度最快的一種。它的基本思想是:任取待排序序列中的某個元素作為基準(一般取第一個元素),通過一趟排序,將待排元素分為左右兩個子序列,左子序列元索的排序碼均小於或等於基準元素的排序碼,右子序列的排序碼則大於基準元素的排序碼,然後分別對兩個子序列繼續進行排序,直至整個序列有序。最壞情況下,即每次劃分,只得到一個序列,時間效率為O(n2)。
(2) 插人類排序法。
簡單插入排序法:把n個待排序的元素看成為一個有序表和一個無序表,開始時有序表中只包含一個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,把它的排序碼依次與有序表元素的排序碼進行比較,將它插入到有序表中的適當位置,使之成為新的有序表。在最壞情況下,即初始排序序列是逆序的情況下,比較次數為n(n-1)/2,移動次數為n(n-1)/2。
希爾排序法:先將整個待排元素序列分割成若干個子序列(由相隔某個「增量」的元素組成的)分別進行直接插入排序。待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
(3) 選擇類排序法。
簡單選擇排序法:掃描整個線性表。從中選出最小的元素。將它交換到表的最前面;然後對剩下的子表採用同樣的方法,直到子表空為止。最壞情況下需要比較n(n-1)/2次。
堆排序的方法:首先將一個無序序列建成堆;然後將堆頂元素(序列中的最大項)與堆中最後一個元素交換(最大項應該在序列的最後)。不考慮已經換到最後的那個元素,只考慮前n-1個元素構成的子序列,將該子序列調整為堆。反復做步驟②,直到剩下的子序列空為止。在最壞情況下,堆排序法需要比較的次數為0(nlog2n)
第二章 程序設計基礎
2.1 程序設計方法與風格
(1)設計方法:指設計、編制、調試程序的方法和過程,主要有結構化程序設計方法、軟體工程方法和面向對象方法。
(2)設計風格:良好的'設計風格要注重源程序文檔化、數據說明方法、語句的結構和輸入輸出。
2.2 結構化程序設計
1.結構化程序設計的原則
結構化程序設計強調程序設計風格和程序結構的規范化,提倡清晰的結構。。
(1)自頂向下:即先考慮總體,後考慮細節;先考慮全局目標,後考慮局部目標。
(2)逐步求精:對復雜問題,應設計一些子目標做過渡,逐步細化。
(3)模塊化:把程序要解決的總目標分解為分目標,再進一步分解為具體的小目標,把每個小目標稱為一個模塊;
(4)限制使用GOT0語句。
2.結構化程序的基本結構與特點
(1)順序結構:自始至終嚴格按照程序中語句的先後順序逐條執行,是最基本、最普遍的結構形式。
(2)選擇結構:又稱為分支結構,包括簡單選擇和多分支選擇結構。
(3)重復結構:又稱為循環結構,根據給定的條件,判斷是否需要重復執行某一相同的或類似的程序段。
結構化程序設計中,應注意事項:
(1)使用程序設計語言中的順序、選擇、循環等有限的控制結構表示程序的控制邏輯。
(2)選用的控制結構只准許有一個人口和一個出口。
(3)程序語言組成容易識別的塊,每塊只有一個入口和一個出口。
(4)復雜結構應該用嵌套的基本控制結構進行組合嵌套來實現。
(5)語言中所沒有的控制結構,應該採用前後一致的方法來模擬。
(6)盡量避免GOT0語句的使用。
2.3 面向對象的程序設計
面向對象方法的本質是主張從客觀世界固有的事物出發來構造系統,強調建立的系統能映射問題域。
對象:用來表示客觀世界中任何實體,可以是任何有明確邊界和意義的東西。
類:具有共同屬性、共同方法的對象的集合。
實例:一個具體對象就是其對應分類的一個實例。
消息:實例間傳遞的信息,它統一了數據流和控制流。
繼承:使用已有的類定義作為基礎建立新類的定義技術。
多態性:指對象根據所接受的信息而作出動作,同樣的信息被不同的對象接收時有不同行動的現象。面向對象程序設計的優點:與人類習慣的思維方法一致、穩定性好、可重用性好、易於開發大型軟體產品、可維護性好。
第三章 軟體工程基礎
3.1 軟體工程基本概念
1.軟體的定義與特點
(1)定義:軟體是指與計算機系統的操作有關的計算機程序、規程、規則,以及可能有的文件、文檔和數據。
(2)特點。
是邏輯實體,有抽象性。
生產沒有明顯的製作過程。
運行使用期間不存在磨損、老化問題。
開發、運行對計算機系統有依賴性,受計算機系統的限制,導致了軟體移植問題。
復雜性較高,成本昂貴。
開發涉及諸多社會因素。
2.軟體的分類
軟體可分應用軟體、系統軟體和支撐軟體3類。
(1)應用軟體是特定應用領域內專用的軟體。
(2)系統軟體居於計算機系統中最靠近硬體的一層,是計算機管理自身資源,提高計算機使用效率並為計算機用戶提供各種服務的軟體。
(3)支撐軟體介於系統軟體和應用軟體之間,是支援其它軟體的開發與維護的軟體。
3.軟體危機與軟體工程
軟體危機指在計算機軟體的開發和維護中遇到的一系列嚴重問題。軟體工程是應用於計算機軟體的定義、開發和維護的一整套方法、工具、文檔、實踐標准和工序,包括軟體開發技術和軟體工程管理。
4.軟體生命周期
軟體產品從提出、實現、使用維護到停止使用的過程稱為軟體生命周期。
在國家標准中,軟體生命周期劃分為8個階段①軟體定義期:包括問題定義、可行性研究和需求分析3個階段。②軟體開發期:包括概要設計、詳細設計、實現和測試4個階段。③運行維護期:即運行維護階段。
5.軟體工程的原則
軟體工程的原則包括:抽象、信息隱蔽、模塊化、局部化、確定性、一致性、完備性和可驗證性。
3.2 結構化分析方法
需求分析的任務是發現需求、求精、建模和定義需求的過程,可概括為:需求獲取、需求分析、編寫需求規格說明書和需求評審。
1.常用的分析方法
結構化分析方法:其實質著眼於數據流,自頂向下,逐層分解,建立系統的處理流程。
面向對象分析方法。
2.結構化分析常用工具
結構化分析常用工具包括數據流圖、數字字典(核心方法)、判斷樹和判斷表。
(1)數據流圖:即DFD圖,以圖形的方式描繪數據在系統中流動和處理的過程,它只反映系統必須完成的邏輯功能。是一種功能模型。
符號名稱作用:
箭頭代表數據流,沿箭頭方向傳送數據的通道
圓或橢圓代表加工,輸入數據經加工變換產生輸出
雙杠代表存儲文件,表示處理過程中存放各種數據文件
方框代表源和潭,表示系統和環境的介面
(2)數據字典:結構化分析方法的核心。數據字典是對所有與系統相關的數據元素的一個有組織的列表。以及精確的、嚴格的定義,使得用戶和系統分析員對於輸入、輸出、存儲成分和中間計算結果有共同的理解。
(3)判定樹:使用判定樹進行描述時,應先從問題定義的文字描述中分清判定的條件和判定的結論,根據描述材料中的連接詞找出判定條件之問的從屬關系、並列關系、選擇關系,根據它們構造判定樹。
(4)判定表:與判定樹相似,當數據流圖中的加工要依賴於多個邏輯條件的取值,即完成該加工的一組動作是由於某一組條件取值的組合引發的,使用判定表比較適宜。
3.軟體需求規格說明書
軟體需求規格說明書是需求分析階段的最後成果,是軟體開發的重要文檔之一。
(1)軟體需求規格說明書的作用:①便於用戶、開發人員進行理解和交流;②反映出用戶問題的結構,可以作為軟體開發工作的基礎和依據;③作為確認測試和驗收的依據。
(2)軟體需求規格說明書的內容:①概述;②數據描述;③功能描述;④性能描述;⑤參考文獻;⑥附錄。
(3)軟體需求規格說明書的特點:①正確性;②無歧義性;③完整性;④可驗證性;⑤一致性;⑥可理解性;⑦可修改性;⑧可追蹤性。
3.3 結構化設計方法
1.軟體設計的基本概念和方法
軟體沒計是一個把軟體需求轉換為軟體表示的過程。
(1)基本原理:抽象、模塊化、信息隱藏、模塊獨立性(度量標准:耦合性和內聚性,高耦合、低內聚)。
(2)基本思想:將軟體設計成由相對獨立、單一功能的模塊組成的結構。
2.概要設計
(1)4個任務:設計軟體系統結構、數據結構及資料庫設計、編寫概要設計文檔、概要設計文檔評審。
(2)面向數據流的設計方法:數據流圖的信息分為交換流和事物流,結構形式有交換型和事務型。
3.詳細設計的工具
詳細設計的工具包括:
圖形工具:程序流程圖、N-S、PAD、HIPO。
表格工具:判定表。
語言工具:PDL(偽碼)。
3.4 軟體測試
1.目的
為了發現錯誤而執行程序的過程。
2.准則
所有測試應追溯到用戶需求。
嚴格執行測試計劃,排除測試的隨意性。
充分注意測試中的群集現象。
程序員應避免檢查自己的程序。
窮舉測試不可能。
妥善保存設計計劃、測試用例、出錯統計和最終分析報告。
3.軟體測試技術和方法
軟體測試的方法按是否需要執行被測軟體的角度,可分為靜態測試和動態測試,按功能分為白盒測試和黑盒測試。
(1)白盒測試:根據程序的內部邏輯設計測試用例,主要方法有邏輯覆蓋測試、基本路徑測試等。
(2)黑盒測試:根據規格說明書的功能來設計測試用例,主要診斷方法有等價劃分法、邊界值分析法、錯誤推測法、因果圖法等,主要用於軟體確認測試。
4.軟體測試的實施
軟體測試是保證軟體質量的重要手段,軟體測試是一個過程,其測試流程是該過程規定的程序,目的是使軟體測試工作系統化。
軟體測試過程分4個步驟,即單元測試、集成測試、驗收測試和系統測試。
單元測試是對軟體設計的最小單位——模塊(程序單元)進行正確性檢驗測試。
單元測試的目的是發現各模塊內部可能存在的各種錯誤。
單元測試的依據是詳細的設計說明書和源程序。
單元測試的技術可以採用靜態分析和動態測試。
3.5 程序的調試
(1)任務:診斷和改正程序中的錯誤。
(2)調試方法:強行排錯法、回溯法和原因排除法。
第四章 資料庫設計基礎
4.1 資料庫系統的基本概念
(1) 數據(Data):描述事物的符號記錄。
(2) 資料庫(DataBase):長期存儲在計算機內的、有組織的、可共享的數據集合。
(3) 資料庫管理系統的概念
資料庫管理系統(DataBase Management System,DBMS)是資料庫的機構,它是一種系統軟體,負責資料庫中的數據組織、數據操作、數據維護、數據控制及保護和數據服務等。為完成以上6個功能,DBMS提供了相應的數據語言;數據定義語言(負責數據的模式定義與數據的物理存取構建);數據操縱語言(負責數據的操縱);數據控制語言(負責數據完整性、安全性的定義)。資料庫管理系統是資料庫系統的核心,它位於用戶和操作系統之間,從軟體分類的角度來說,屬於系統軟體。
(4) 資料庫技術發展經歷了3個階段。
人工管理階段→文件系統階段→資料庫系統階段
(5) 資料庫系統的特點:集成性、高共享性、低冗餘性、數據獨立性、數據統一管理與控制等。
(6) 資料庫系統的內部機構體系:三級模式(概念模式、內模式、外模式)和二級映射(外模式/概念模式的映射、概念模式/內模式的映射)構成了資料庫系統內部的抽象結構體系。
4.2 數據模型
數據模型是數據特徵的抽象,從抽象層次上描述了系統的靜態特徵、動態行為和約束條件,描述的內容有數據結構、數據操作和數據約束。有3個層次:概念數據模型、邏輯數據模型和物理數據模型。
(1) E—R模型:提供了表示實體、屬性和聯系的方法。實體間聯系有「一對一」、「一對多」和「多對多」。
(2) E-R模型用E-R圖來表示。
(3) 層次模型:利用樹形結構表示實體及其之問聯系。其中節點是實體,樹枝是聯系,從上到下是一對多關系。
(4) 網狀模型:用網狀結構表示實體及其之間聯系。是層次模型的擴展。網路模型以記錄型為節點,反映現實中較為復雜的事物聯系。
(5) 關系模型:採用二維表(由表框架和表的元組組成)來表示,可進行數據查詢、增加、刪除及修改操作。關系模型允許定義「實體完整性」、「參照完整性」和「用戶定義的完整性」三種約束。
鍵(碼):二維表中唯一能標識元組的最小屬性集。
候選鍵(候選碼):二維表中可能有的多個鍵。
主鍵:被選取的一個使用的鍵。
4.3 關系代數
(1) 關系代數的基本運算:投影、選擇、笛卡爾積。
(2) 關系代數的擴充運算:交、連接與自然連接、除。
4.4 資料庫設計與管理
1.資料庫設計概述
基本思想:過程迭代和逐步求精。
方法:面向數據的方法和面向過程的方法。
設計過程:需求分析→概念設計→邏輯設計→物理設計→編碼→測試→運行→進→步修改。
2.資料庫設計的需求分析
需求收集和分析是資料庫設計的第一階段,常用結構化分析方法(自頂向下、逐層分解)和面向對象的方法,主要工作有繪制數據流程圖、數據分析、功能分析、確定功能處理模塊和數據間關系。
數據字典:包括數據項、數據結構、數據流、數據存儲和處理過程,是對系統中數據的詳盡描述。
3.資料庫的設計
(1) 資料庫的概念設計:分析數據問內在的語義關聯,以建立數據的抽象模型。
(2) 資料庫的邏輯設計:從E-R圖向關系模型轉換,邏輯模式規范化,關系視圖設計可以根據用戶需求隨時創建。實體轉換為元組,屬性轉換為關系的屬性,聯系轉換為關系。
(3) 資料庫的物理設計:是數據在物理設備上的存儲結構與存取方法,目的是對資料庫內部物理結構作出調整並選擇合理的存取路徑,以提高速度和存儲空間。
4.資料庫管理
資料庫管理包括資料庫的建立、資料庫的調整、資料庫的重組、資料庫的安全性與完整性控制、資料庫故障恢復和資料庫的監控。
;❻ C語言程序設計這門課一共有多少章節
這門課一共有10個章節。包括:第一章C語言編程基礎(初級),第二章流程式控制制(初級),第三章綜合實例(初級),第四章數組(中級),第五章指針初步(中級),第六章字元串(中級),第七章結構體和共用體(中級),第八章函數進階(中級),第九章預處理指令、綜合案例(中級),第十章指針進階(高級),。
❼ 如何用c語言列出目錄樹
給你一個參考:
相關函數:opendir
表頭文件:#include <ftw.h>
定義函數:int ftw(const char *dir, int (*fn) (const *file, const struct stat *sb, int flag), int depth)
函數說明:ftw() 會從參數dir指定的目錄開始,往下一層層地遞歸式遍歷子目錄。ftw()會傳三個參數給fn(), 第一個參數*file指向當時所在的目錄路徑,第二個參數是*sb, 為stat結構指針,第三個參數為旗標,有下面幾種可能值
FTW_F 一般文件
FTW_D 目錄
FTW_DNR 不可讀取的目錄,此目錄以下將不被遍歷
FTW_SL 符號連接
FTW_NS 無法取得stat結構數據,有可能是許可權問題
最後一個參數depth代表ftw()在進行遍歷目錄時同時打開的文件數。ftw()在遍歷時每一層目錄至少需要一個文件描述詞,如果遍歷時用完了depth所給予的限制數目,整個遍歷將因不斷地關文件和開文件操作而顯得緩慢
如果要結束ftw()的遍歷,fn()只需返回一非零值即可,此值同時也會是ftw()的返回值。否則ftw()會試著走完所有的目錄,然後返回0
返 回 值:遍歷中斷則返回fn()函數的返回值,全部遍歷則返回0,若有錯誤發生則返回-1
附加說明:由於ftw()會動態配置內存使用,請使用正常方式(fn函數返回非零值)來中斷遍歷,不要在fn函數中使用longjmp()
示例:
/*列出/etc/X11目錄下的子目錄*/
#include <sys/stat.h>
#include <unistd.h>
#include <ftw.h>
int fn(const char *file, const struct stat *sb, int flag)
{
if(flag == FTW_D)
printf("%s --- directory\n", file);
else
printf("%s \n",file);
return 0;
}
int main()
{
ftw("/etc/X11",fn,500);
}