版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計</b></p><p> 2009 ~ 2010學(xué)年第二學(xué)期</p><p> 設(shè)計題目 文章編輯、猴子選大王、建立二叉樹、拓撲排序、各種排序 </p><p><b> 目錄</b></p><
2、;p> 1、目的與要求2</p><p> 2、課程設(shè)計內(nèi)容說明3</p><p> 2.1主菜單界面:3</p><p> 2.2項目一:文章編輯**3</p><p> 2.3項目二:猴子選大王**4</p><p> 2.4項目三:建立二叉樹,層序、先序遍歷**6<
3、/p><p> 2.5項目四:拓撲排序8</p><p> 2.6項目五:各種排序:插入排序和改進冒泡排序算法10</p><p> 5、結(jié)論及體會14</p><p><b> 6、附錄14</b></p><p><b> 目的與要求</b><
4、/p><p> 鞏固和加深對常見數(shù)據(jù)結(jié)構(gòu)的理解和掌握</p><p> 掌握基于數(shù)據(jù)結(jié)構(gòu)進行算法設(shè)計的基本方法</p><p> 掌握用高級語言實現(xiàn)算法的基本技能</p><p> 掌握書寫程序設(shè)計說明文檔的能力</p><p> 提高運用數(shù)據(jù)結(jié)構(gòu)知識及高級語言解決非數(shù)值實際問題的能力</p>&l
5、t;p><b> 課程設(shè)計內(nèi)容說明</b></p><p><b> 主菜單界面:</b></p><p> 項目一:文章編輯**</p><p> (1)功能:輸入一頁文字,程序可以統(tǒng)計出文字、數(shù)字、空格的個數(shù)。</p><p> 靜態(tài)存儲一頁文章,每行最多不超過80個字符,共N行
6、;要求(1)分別統(tǒng)計出其中英文字母數(shù)和空格數(shù)及整篇文章總字數(shù);(2)統(tǒng)計某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù);(3)刪除某一子串,并將后面的字符前移。</p><p> 存儲結(jié)構(gòu)使用線性表,分別用幾個子函數(shù)實現(xiàn)相應(yīng)的功能;</p><p> 輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標點符號。</p><p> 輸出形式:(1)分行輸
7、出用戶輸入的各行字符;(2)分4行輸出"全部字母數(shù)"、"數(shù)字個數(shù)"、"空格個數(shù)"、"文章總字數(shù)"(3)輸出刪除某一字符串后的文章;</p><p> ?。?)程序的輸入輸出描述:</p><p><b> 進入應(yīng)用程序:</b></p><p><b>
8、 (1)輸入文章:</b></p><p><b> ?。?)查找:</b></p><p> (3)刪除:原文為:QuYing111,刪除Y后為:Quing111</p><p> ?。?)尚未解決的問題或改進方向</p><p> 這個文章編輯的缺點在于無法統(tǒng)計空格數(shù),只能夠統(tǒng)計大小寫字母以及數(shù)字&
9、lt;/p><p> ?。?)對軟件的使用說明</p><p> 在CFree4.0下打開軟件,進行操作</p><p> 項目二:猴子選大王**</p><p> 對設(shè)計任務(wù)內(nèi)容的概述</p><p> 一堆猴子都有編號,編號是1,2,3 ...m ,這群猴子(m個)按照1-m的順序圍坐一圈,從第1開始數(shù),每數(shù)到
10、第N個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最后一只猴子,則該猴子為大王。</p><p><b> 需求分析或功能描述</b></p><p> 輸入數(shù)據(jù):輸入m,n m,n 為整數(shù),n<m</p><p> 輸出形式:中文提示按照m個猴子,數(shù)n 個數(shù)的方法,輸出為大王的猴子是幾號 ,建立一個函數(shù)來實現(xiàn)此功能。<
11、/p><p><b> 程序輸入輸出描述:</b></p><p><b> 開始程序:</b></p><p><b> 部分程序代碼:</b></p><p> #define MaxSize 50</p><p> int houzi(int
12、 n,int m)</p><p><b> {</b></p><p> int p[MaxSize];</p><p> int i,j,t;</p><p> for(i=0;i<n;i++)</p><p><b> p[i]=i+1;</b><
13、/p><p><b> t=0;</b></p><p> printf("\n出列順序:");</p><p> for(i=n;i>=1;i--)</p><p><b> {</b></p><p> t=(t+m-1)%i;</p
14、><p> printf("%d",p[t]);</p><p> for(j=t+1;j<=i-1;j++)</p><p> p[j-1]=p[j];</p><p> } printf("\n");</p><p> printf("\n故編號 %d
15、 的猴子是大王!\n",p[t]);</p><p> printf("\n");</p><p><b> }</b></p><p> 項目三:建立二叉樹,層序、先序遍歷**</p><p> ?。?)對設(shè)計任務(wù)內(nèi)容的概述</p><p> 要求能夠輸入樹
16、的各個結(jié)點,并能夠輸出用不同方法遍歷的遍歷序列;分別建立建立二叉樹存儲結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù);</p><p> ?。?)需求分析或功能描述</p><p> 程序功能包括,建立二叉樹,輸出二叉樹,對二叉樹進行層次遍歷和先序遍歷。</p><p> ?。?)概要設(shè)計或程序流程圖</p><p>
17、進入程序,選擇菜單,1創(chuàng)建二叉樹,在程序中進行構(gòu)造二叉樹,并輸出創(chuàng)建好的二叉樹,2層次遍歷二叉樹,輸出二叉樹的層次遍歷序列,3先序遍歷二叉樹,輸出二叉樹的先序遍歷序列。</p><p> ?。?)詳細設(shè)計或源代碼說明</p><p> 創(chuàng)建二叉樹CreateBTNode(*b,*str)。根據(jù)二叉樹括號表示的字符串*str生成對應(yīng)的二叉鏈存儲結(jié)構(gòu),用ch掃描采用括號表示法表示二叉樹的字符
18、串。輸出二叉樹,以括號表示法輸出一棵二叉樹。先序遍歷二叉樹的過程是,訪問根結(jié)點,先序遍歷左子樹,先序遍歷右子樹。層次遍歷的過程是,先將根結(jié)點進隊,在隊不為空時循環(huán),從隊列中出列一個結(jié)點*p,訪問它,若它有左孩子結(jié)點,如此操作直到隊空為止。 </p><p> (5)程序模塊及其接口描述</p><p> typedef char ElemType;</p><p&g
19、t; typedef struct node</p><p><b> {</b></p><p> ElemType data;//數(shù)據(jù)元素 </p><p> struct node *lchild;//指向左孩子 </p><p> struct node *rchild;//指向右孩子 </p&g
20、t;<p><b> }BTNode;</b></p><p> void CreateBTNode(BTNode *&b,char *str)//由str串創(chuàng)建二叉鏈</p><p> void DispBTNode(BTNode *b)//以括號表示法輸出二叉樹</p><p> void TravLevel
21、(BTNode *b)//層次遍歷</p><p> void PreOrder(BTNode *b)//先序遍歷的遞歸算法</p><p> ?。?)程序的輸入與輸出描述</p><p><b> 輸入界面:</b></p><p><b> 輸出界面:</b></p><
22、;p> ?。?)調(diào)試分析或程序測試</p><p> ?。?)尚未解決的問題或改進方向</p><p> 因為本程序最終要與其他兩個程序合并在一起,在主界面進行選擇。所以在進入主界面時要在本程序的主函數(shù)處修改字符,否則在調(diào)用本程序時主函數(shù)會發(fā)生沖突。</p><p> ?。?)對軟件的使用說明</p><p> 在CFree4.0下
23、打開軟件,進行操作。</p><p><b> 項目四:拓撲排序</b></p><p> 對設(shè)計任務(wù)內(nèi)容的概述</p><p> 編寫函數(shù),實現(xiàn)圖的拓撲排序。</p><p><b> 需求分析或功能描述</b></p><p> 在一個有向圖中找一個拓撲序列的過
24、程稱為拓撲排序,而每一個有向圖的拓撲序列并不唯一,本程序的功能就是將用戶輸入的序列進行拓撲排序。</p><p> 概要設(shè)計或程序流程圖</p><p> 在程序菜單中選擇開始,輸入有向圖的結(jié)點數(shù)和邊數(shù),此時程序就會輸出結(jié)點信息,如v1,v2,v3等,接下來會要求用戶輸入第一條邊的起點和終點,通過程序運行就可以輸出拓撲排序結(jié)果。</p><p> 詳細設(shè)計或源
25、代碼說明</p><p> 對于給定的有向圖,采用鄰接表作為存儲結(jié)構(gòu),為每個頂點設(shè)置一個鏈表,每個鏈表有一個表頭結(jié)點,這些表頭結(jié)點構(gòu)成一個數(shù)組,表頭結(jié)點中增加一個存放頂點入度的域count,在執(zhí)行拓撲排序的過程中,當某個頂點的入度為0(沒有前驅(qū)結(jié)點時),就將此頂點輸出,同時將該頂點的所有后繼結(jié)點的入度減1,為了避免重復(fù)檢測入度為0的頂點,設(shè)立一個棧St,以存放入度為0的頂點。</p><p&
26、gt; 程序模塊及其接口描述</p><p> typedef struct</p><p><b> {</b></p><p> int *base; //棧底 </p><p> int *top; //棧頂 </p>
27、;<p> int stacksize; //棧空間 </p><p><b> }Stack;</b></p><p> int InitStack(Stack &s) //創(chuàng)建一個空棧</p><p> int Push(Stack &s,int e)
28、 //進棧</p><p> bool Empty(Stack s) //查看棧是否為空</p><p> int Pop(Stack &s) //出棧</p><p> int LocateVex(Graph G,int v) //返回節(jié)點v在圖中的位置</p&
29、gt;<p> void CreateGraph(Graph &G) //建圖 </p><p> void TopologicalSort(Graph G) //拓撲排序函數(shù)</p><p> 程序的輸入與輸出描述</p><p><b> 輸入界面:</b></p><p>
30、; 再輸入結(jié)點數(shù)和邊數(shù),此時會輸出頂點信息:</p><p><b> 排序結(jié)果輸出界面:</b></p><p><b> 調(diào)試分析或程序測試</b></p><p><b> 對軟件的使用說明</b></p><p> 在CFree4.0下打開軟件,進行操作。&l
31、t;/p><p> 項目五:各種排序:插入排序和改進冒泡排序算法</p><p> 對設(shè)計任務(wù)內(nèi)容的概述</p><p> 用程序?qū)崿F(xiàn)插入法排序、起泡法改進算法排序;利用插入排序和冒泡法的改進算法,將用戶隨機輸入的一列數(shù)按遞增的順序排好。輸入的數(shù)據(jù)形式為任何一個正整數(shù),大小不限。輸出的形式:數(shù)字大小逐個遞增的數(shù)列。</p><p><
32、b> 需求分析或功能描述</b></p><p> 插入排序的基本思想是:每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子表中的適當位置,直到每次記錄插入完成為止。本程序使用直接插入排序。</p><p> 交換排序的基本思想是:兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個記錄的次序相反時即進行交換,直到?jīng)]有反序的記錄為止。本程序使用改進的冒泡排序算法。<
33、;/p><p> 概要設(shè)計或程序流程圖</p><p> 直接插入排序:假設(shè)待排序的記錄存放在數(shù)組R[0..n-1]中,排序過程的某一中間時刻,R被劃分成兩個子區(qū)間[0..i-1]和[i..n-1](剛開始時i=1,有序區(qū)序號只有R[0]一個記錄),其中:前一個子區(qū)間是已排好序的有序區(qū),后一個子區(qū)間則是當前未排序的部分,不妨稱其為無序區(qū)。直接插入排序的基本操作是將當前無序區(qū)的第一個記錄R[
34、i]插入到有序區(qū)[0..i-1]中適當?shù)奈恢蒙?,使[0..i]變?yōu)樾碌挠行騾^(qū)。</p><p> 有序區(qū) 無序區(qū)</p><p><b> 一趟排序</b></p><p> 有序區(qū) 無序區(qū)</p><p> 直接插入排序的一趟排序過程</
35、p><p> 冒泡排序:整個算法是從最下面的記錄開始,對每兩個相臨的關(guān)鍵字進行比較,且使關(guān)鍵字較小的記錄換至關(guān)鍵字較大的記錄之上,使得經(jīng)過一趟冒泡排序之后,關(guān)鍵字最小的記錄到達最上端,接著,再在剩下的記錄中找關(guān)鍵字次小的記錄,并把它換在第二個位置上。依次類推,一直到所有記錄都有序為止。而在有些情況下,在第i(i<n-1)趟時已排好序了,但仍執(zhí)行后面幾趟的比較。實際上,一旦酸法中某一趟比較時不出現(xiàn)任何記錄交換,
36、說明已經(jīng)排好序了,就可以結(jié)束本算法。為此,改進了冒泡排序算法。 </p><p> 有 有</p><p> 序 序</p><p> 區(qū) 一趟排序
37、 區(qū)</p><p><b> 無</b></p><p> 序 無</p><p> 區(qū) 序</p><p><b> 區(qū)</
38、b></p><p> 程序模塊及其接口描述</p><p> typedef int KeyType; //定義關(guān)鍵字類型為int</p><p> typedef char InfoType[10];</p><p> typedef struct //記錄類型</p>
39、<p><b> {</b></p><p> KeyType key; //關(guān)鍵字類型</p><p> InfoType data; //其他數(shù)據(jù)項,類型為InfoType</p><p> }RecType ;//排序的記錄類型定義</p>
40、;<p> void InsertSort(RecType R[],int n)//直接插入排序</p><p> void BubbleSort(RecType R[],int n)//改進冒泡排序</p><p> 程序的輸入與輸出描述:</p><p><b> 直接插入排序:</b></p><
41、p><b> 輸入:</b></p><p><b> 輸出:</b></p><p><b> 冒泡排序:</b></p><p><b> 輸入:</b></p><p><b> 輸出:</b></p>
42、;<p><b> 調(diào)試分析或程序測試</b></p><p><b> 直接插入排序:</b></p><p><b> 冒泡排序:</b></p><p> 尚未解決的問題或改進方向</p><p> 在算法的定義中,一開始就定義數(shù)組長度為10,如果
43、用戶操作中輸入了大于10個數(shù)時將只對前10個數(shù)進行操作,而后面的數(shù)不會參加運算。</p><p><b> 對軟件的使用說明</b></p><p> 在CFree4.0下打開軟件,進行操作。</p><p><b> 結(jié)論及體會</b></p><p> 在這次的數(shù)據(jù)結(jié)構(gòu)程序設(shè)計中,從十三
44、個題目中選了五個自己比較感興趣的題目進行編程,因為許多算法可以在書上找到類似的類型,加上自己的想法,做的可以說比較順利。和平時上機所做的不同,這次需要一個程序的主界面,用來調(diào)用所設(shè)計的五個項目,而且分別對五個項目的程序設(shè)計從構(gòu)思,到算法,再到輸入輸出和調(diào)試,進行了比較充分的說明,使用起來也比較方便。</p><p><b> 附錄</b></p><p><b
45、> 附錄1:參考文獻</b></p><p> [1]李春葆.數(shù)據(jù)結(jié)構(gòu)學(xué)習指導(dǎo).清華大學(xué)出版社,2010</p><p> [2]張曉莉等.數(shù)據(jù)結(jié)構(gòu)與算法.機械工業(yè)出版社,2002</p><p> [3]李春葆.數(shù)據(jù)結(jié)構(gòu)教程上機實驗指導(dǎo).清華大學(xué)出版社,2010.</p><p> 附錄2:部分源代碼清單<
46、/p><p> ********************************************************文章編輯;</p><p> #define MAX 3000 </p><p> typedef struct
47、 </p><p><b> { </b></p><p> char data[MAX]; </p><p> int length; </p><p> }SqString; </p><p> void StrAss
48、ign(SqString &str,char cstr[])//建立串 </p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;cstr[i]!='\0';i++)</p><p> str.data[
49、i]=cstr[i];</p><p> str.length=i;</p><p><b> }</b></p><p> void DispStr(SqString p)</p><p><b> {</b></p><p><b> int i;&l
50、t;/b></p><p> if(p.length>0)</p><p> { printf("當前的文章為:");</p><p> for(i=0;i<p.length;i++)</p><p><b> {</b></p><p> pri
51、ntf("%c",p.data[i]);</p><p> if((i+1)%80==0)</p><p> printf("\n");</p><p><b> }</b></p><p><b> }</b></p><p>
52、;<b> }</b></p><p> int cout(SqString p)//各種字符數(shù)量統(tǒng)計 </p><p><b> {</b></p><p> int i=0;int a=0 ,b=0,c=0,d=0; </p>
53、;<p> for(i=0;i<p.length;i++)</p><p><b> {</b></p><p> if(p.data[i]>='a'&&p.data[i]<='z')</p><p><b> a++;</b><
54、/p><p> if(p.data[i]>='A'&&p.data[i]<='Z')</p><p><b> b++;</b></p><p> if(p.data[i]>='0'&&p.data[i]<='9')<
55、/p><p><b> c++;</b></p><p> if(p.data[i]==32)</p><p><b> d++;</b></p><p><b> }</b></p><p> printf("英文小寫字母有:%d個\n
56、",a) ;</p><p> printf("英文大寫字母有:%d個\n",b) ;</p><p> printf("數(shù)字有:%d個\n",c);</p><p> printf("空格有:%d個\n",d);</p><p> return p.length;
57、</p><p><b> }</b></p><p> int FindFind(SqString p,SqString q)//查找 </p><p><b> {</b></p><p> int i=0;int j=0;int n=0;</p><p> w
58、hile(i<=p.length)</p><p><b> {</b></p><p> if((p.data[i]==q.data[j])&&(q.data[j]!='\0'))</p><p> {i++;j++;}</p><p><b> else<
59、/b></p><p><b> i++;</b></p><p> if(j>=q.length)</p><p> {n++;j=0;}</p><p><b> }</b></p><p> printf("經(jīng)查找個字符共有 %d 個\n
60、",n);</p><p><b> }</b></p><p> SqString Dele(SqString p,SqString a)//刪除 </p><p><b> {</b></p><p> int i=0;int j=0;int n=0;int pos=0; &l
61、t;/p><p> while(i<=p.length)</p><p><b> {</b></p><p> if((p.data[i]==a.data[j])&&(a.data[j]!='\0'))</p><p> {i++;j++;}</p><p&
62、gt;<b> else </b></p><p><b> i++;</b></p><p> if(j>=a.length)</p><p> { pos=i-j+1;</p><p><b> int k;</b></p><p&g
63、t; SqString b;b.length=0;</p><p> if(pos<=0||pos>=p.length||pos+a.length>p.length+1)</p><p><b> return b;</b></p><p> for(k=0;k<pos-1;k++)</p><
64、;p> b.data[k]=p.data[k];</p><p> for(k=pos+j-1;k<p.length;k++)</p><p> b.data[k-j]=p.data[k];</p><p> b.length=p.length-a.length;</p><p><b> return b;&
65、lt;/b></p><p><b> pos=0;</b></p><p><b> j=0;</b></p><p><b> }</b></p><p><b> } </b></p><p><b>
66、 }</b></p><p> ********************************************************猴子選大王;</p><p> #define MaxSize 50</p><p> int houzi(int n,int m)</p><p><b> {<
67、;/b></p><p> int p[MaxSize];</p><p> int i,j,t;</p><p> for(i=0;i<n;i++)</p><p><b> p[i]=i+1;</b></p><p><b> t=0;</b><
68、;/p><p> printf("\n出列順序:");</p><p> for(i=n;i>=1;i--)</p><p><b> {</b></p><p> t=(t+m-1)%i;</p><p> printf("%d",p[t]);
69、</p><p> for(j=t+1;j<=i-1;j++)</p><p> p[j-1]=p[j];</p><p> } printf("\n");</p><p> printf("\n故編號 %d 的猴子是大王!\n",p[t]);</p><p>
70、 printf("\n");</p><p><b> }</b></p><p> *******************************************************創(chuàng)建二叉樹:</p><p> #define MaxSize 100</p><p> type
71、def char ElemType;</p><p> typedef struct node</p><p><b> {</b></p><p> ElemType data;//數(shù)據(jù)元素 </p><p> struct node *lchild;//指向左孩子 </p><p>
72、 struct node *rchild;//指向右孩子 </p><p><b> }BTNode;</b></p><p> void CreateBTNode(BTNode *&b,char *str)//由str串創(chuàng)建二叉鏈 </p><p><b> {</b></p><p&
73、gt; BTNode *St[MaxSize],*p=NULL;</p><p> int top=-1,k,j=0;</p><p><b> char ch;</b></p><p> b=NULL;//建立的二叉樹初始時為空 </p><p> ch=str[j];</p><p>
74、; while(ch!='\0')//str未掃描完時循環(huán) </p><p><b> {</b></p><p> switch(ch)</p><p><b> {</b></p><p> case '(':top++;St[top]=p;k=1;br
75、eak;//為左結(jié)點 </p><p> case ')':top--;break;</p><p> case ',':k=2;break;//為右結(jié)點 </p><p> default:p=(BTNode *)malloc(sizeof(BTNode));</p><p> p->data=
76、ch;</p><p> p->lchild=p->rchild=NULL;</p><p> if(b==NULL)//p指向二叉樹的根結(jié)點 </p><p><b> b=p;</b></p><p> else//已建立二叉樹根結(jié)點 </p><p><b>
77、 {</b></p><p><b> switch(k)</b></p><p><b> {</b></p><p> case 1:St[top]->lchild=p;break;</p><p> case 2:St[top]->rchild=p;break;
78、</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> j++;</b></p><p> ch=str[j];</p>
79、<p><b> }</b></p><p><b> }</b></p><p> void DispBTNode(BTNode *b)//以括號表示法輸出二叉樹 </p><p><b> {</b></p><p> if(b!=NULL)</p
80、><p><b> {</b></p><p> printf("%c",b->data);</p><p> if(b->lchild!=NULL||b->rchild!=NULL)</p><p><b> {</b></p><p&
81、gt; printf("(");</p><p> DispBTNode(b->lchild);</p><p> if(b->rchild!=NULL) printf(",");</p><p> DispBTNode(b->rchild);</p><p> printf
82、(")");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void TravLevel(BTNode *b)//層次遍歷</p><p>
83、<b> {</b></p><p> BTNode *Qu[MaxSize];</p><p> int front,rear;</p><p> front=rear=0;</p><p> if(b!=NULL)</p><p> printf("%c",b-
84、>data); </p><p><b> rear++;</b></p><p> Qu[rear]=b;</p><p> while(rear!=front)</p><p><b> {</b></p><p> front=(front+1)%Max
85、Size;</p><p> b=Qu[front];</p><p> if(b->lchild!=NULL)</p><p><b> {</b></p><p> printf("%c",b->lchild->data);</p><p> r
86、ear=(rear+1)%MaxSize;</p><p> Qu[rear]=b->lchild;</p><p><b> }</b></p><p> if(b->rchild!=NULL)</p><p><b> {</b></p><p>
87、printf("%c",b->rchild->data);</p><p> rear=(rear+1)%MaxSize;</p><p> Qu[rear]=b->rchild;</p><p><b> }</b></p><p><b> }</b>
88、;</p><p> printf("\n");</p><p><b> }</b></p><p> void PreOrder(BTNode *b)//先序遍歷的遞歸算法 </p><p><b> {</b></p><p> if(b!
89、=NULL)</p><p><b> {</b></p><p> printf("%c",b->data);//訪問根結(jié)點 </p><p> PreOrder(b->lchild);//先序遍歷左子樹 </p><p> PreOrder(b->rchild);//先序
90、遍歷右子樹 </p><p><b> }</b></p><p><b> }</b></p><p> void menu8()</p><p><b> {</b></p><p> BTNode *b;</p><p
91、> char s[MaxSize];</p><p> printf("請輸入二叉樹:");</p><p><b> gets(s);</b></p><p> CreateBTNode(b,s);</p><p> printf("輸出此二叉樹:");</
92、p><p> DispBTNode(b);</p><p> printf("\n");</p><p> printf("層序遍歷序列:");</p><p> TravLevel(b);</p><p> printf("先序遍歷遞歸序列:");&l
93、t;/p><p> PreOrder(b);</p><p> printf("\n");</p><p><b> }</b></p><p> #include <stdio.h></p><p> #define MAXE 20</p>&
94、lt;p> typedef int KeyType;</p><p> typedef char InfoType[10];</p><p> typedef struct</p><p><b> {</b></p><p> KeyType key;</p><p> Inf
95、oType data;</p><p><b> }RecType;</b></p><p> ****************************************************************拓撲排序:</p><p> #define STACKSIZE 100 //??臻g大小 &
96、lt;/p><p> #define STACKINCREMENT 20 //進棧棧增量 </p><p> #define MAX 20 //鄰接表數(shù)組的最大值 </p><p> typedef struct</p><p><b> {</b></p&
97、gt;<p> int *base; //棧底 </p><p> int *top; //棧頂 </p><p> int stacksize; //棧空間 </p><p><b> }Stack;</b><
98、;/p><p> int InitStack(Stack &s) //創(chuàng)建一個空棧</p><p><b> {</b></p><p> s.base=(int*)malloc(STACKSIZE*sizeof(int));</p><p> if(!s.base)</p>
99、<p> return -1;</p><p> s.top=s.base;</p><p> s.stacksize=STACKSIZE;</p><p><b> return 1;</b></p><p><b> }</b></p><p>
100、int Push(Stack &s,int e) //進棧 </p><p><b> {</b></p><p> if((s.top-s.base)>s.stacksize)</p><p><b> {</b></p><p> s.base=(int*
101、)realloc(s.base,(STACKSIZE+STACKINCREMENT)*sizeof(int));</p><p> if(!s.base)</p><p><b> return-1;</b></p><p> s.top=s.base+s.stacksize;</p><p> s.stacks
102、ize+=STACKINCREMENT;</p><p><b> }</b></p><p> *s.top++=e;</p><p><b> return 1;</b></p><p><b> }</b></p><p> bool E
103、mpty(Stack s) //查看棧是否為空 </p><p><b> {</b></p><p> if(s.base==s.top)</p><p> return true;</p><p><b> else</b></p><p&
104、gt; return false;</p><p><b> }</b></p><p> int Pop(Stack &s) //出棧 </p><p><b> {</b></p><p><b> int e;</b>&l
105、t;/p><p> e=*--s.top;</p><p><b> return e;</b></p><p><b> }</b></p><p> typedef struct ArcNode //頭節(jié)點</p><p><b> {
106、</b></p><p> int adjvex; //該邊所指向的頂點的位置</p><p> struct ArcNode *nextarc; //指向下一條邊</p><p><b> }ArcNode;</b></p><p> typedef str
107、uct VNode //表節(jié)點</p><p><b> {</b></p><p> int data; //頂點信息</p><p> int indegree; //節(jié)點的入度</p><p> ArcNode *f
108、irstarc; //指向第一條依附該節(jié)點的邊的指針</p><p> }VNode,AdjList[MAX];</p><p> typedef struct </p><p><b> {</b></p><p> AdjList vertices; //表節(jié)點<
109、;/p><p> int vexnum; //節(jié)點的個數(shù)</p><p> int arcnum; //邊的條數(shù)</p><p><b> }Graph;</b></p><p> int LocateVex(Graph G,int v) /
110、/返回節(jié)點v在圖中的位置</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;i<G.vexnum;++i)</p><p><b> {</b></p><p> if
111、(G.vertices[i].data==v)</p><p><b> break;</b></p><p><b> else</b></p><p><b> continue;</b></p><p><b> }</b></p>
112、;<p> if(i<G.vexnum)</p><p><b> return i;</b></p><p><b> else </b></p><p> return -1;</p><p><b> }</b></p><
113、;p> void CreateGraph(Graph &G) //建圖 </p><p><b> {</b></p><p><b> int m,n;</b></p><p> printf("①現(xiàn)在請輸入DAG的結(jié)點數(shù): ");</p><p
114、> scanf("%d",&m);</p><p> while(m<0)</p><p><b> {</b></p><p> printf("\t\t\t\tError!\n\t\t\t\tDAG結(jié)點數(shù)不能小于1.\n");</p><p> p
115、rintf("請重新輸入DAG的頂點數(shù): "); //DAG是有向無環(huán)圖 </p><p> scanf("%d",&m);</p><p><b> }</b></p><p> printf("②現(xiàn)在請輸入DAG的邊數(shù): ");</p><p&
116、gt; scanf("%d",&n);</p><p> while(n<0)</p><p><b> {</b></p><p> printf("\t\t\t\tError!\n\t\t\t\tDAG的邊數(shù)不能小于0.\n");</p><p> pr
117、intf("請重新輸入DAG的邊數(shù): ");</p><p> scanf("%d",&n);</p><p><b> }</b></p><p> G.vexnum=m; //頂點數(shù)目</p><p> G.arcnum=
118、n; //邊的數(shù)目</p><p> int i,j,k;</p><p> for(i=0;i<G.vexnum;++i) //初始化圖的信息</p><p><b> {</b></p><p> G.vertices[i].data=i+1;
119、 //頂點信息</p><p> G.vertices[i].firstarc=0;</p><p> G.vertices[i].indegree=0; //開始時入度都為0</p><p><b> }</b></p><p><b> //頂點信息</b></p&
120、gt;<p> printf("③現(xiàn)在輸出頂點信息:\n");</p><p> for(i=0;i<G.vexnum;++i)</p><p> printf("v%d\n",G.vertices[i].data);</p><p> int v1,v2,flag=0;</p>&l
121、t;p> for(k=0;k<G.arcnum;++k)</p><p><b> {</b></p><p> printf("④請輸入第%d邊的起點和終點(樣例:1 2),注意其中分隔符為一個空格: ",k+1);</p><p> scanf("%d%d",&v1,&am
122、p;v2);</p><p> i=LocateVex(G,v1); //頂點v1在圖中的位置</p><p> j=LocateVex(G,v2); //頂點v2在圖中的位置</p><p> if(i >=0 && j>=0)</p><p><
123、;b> {</b></p><p><b> ++flag;</b></p><p> (G.vertices[j].indegree)++;</p><p> ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));</p><p> p->adjve
124、x=j;</p><p> p->nextarc=0;</p><p> ArcNode *p1;</p><p> if(! G.vertices[i].firstarc)</p><p> G.vertices[i].firstarc=p;</p><p><b> else</b&
125、gt;</p><p><b> {</b></p><p> for(p1=G.vertices[i].firstarc;p1->nextarc;p1=p1->nextarc); //求該頂點的最后一個鄰接頂點</p><p> p1->nextarc=p; //將p插入到最后一個鄰接頂點
126、的后面</p><p><b> }</b></p><p><b> }</b></p><p> else //沒有該弧,刪除掉</p><p><b> {</b></p><p> printf("********
127、***************************************"); </p><p> printf("沒有該邊!\n");</p><p><b> k=flag;</b></p><p> printf("************************************
128、***********"); </p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> void TopologicalSort(Graph G) //拓撲排序函數(shù)</p&g
129、t;<p><b> {</b></p><p> int i,j,k;</p><p> int count=0; //用來統(tǒng)計頂點的個數(shù)</p><p> Stack s; //定義一個棧,用來保存入度為0的頂點</p><p> InitStack(s); //初始化棧</p&g
130、t;<p> for(i=0;i<G.vexnum;++i)</p><p> if(G.vertices[i].indegree==0) //若第i個頂點的入度為0 ,i表示頂點在圖中的位置</p><p> Push(s,i); //將第i個頂點入棧</p><p> while(!Empty(
131、s))</p><p><b> {</b></p><p> j=Pop(s); // 將為入度0的頂點位置出棧,并保存到j(luò)中</p><p> count++; //統(tǒng)計頂點的個數(shù)</p><p> printf("v%d ",G.vertices[j].data
132、); //輸出入度為0的頂點</p><p> ArcNode *p;</p><p> for(p=G.vertices[j].firstarc; p ;p=p->nextarc) //找與第j個頂點的鄰接頂點,并將其入度減1</p><p><b> {</b></p><p> k=p->a
133、djvex;</p><p> --(G.vertices[k].indegree);</p><p> if(G.vertices[k].indegree==0) //如果入度為0,就入棧</p><p> Push(s,k);</p><p><b> }</b></p><p>
134、;<b> }</b></p><p> if(count<G.vexnum) //count小于頂點的個數(shù)時候,說明有環(huán),不符合拓撲排序的要求</p><p><b> {</b></p><p> printf("***************************************
135、*****************************************"); </p><p> printf("\t\t\t\tError!\n\t\t\t\t圖中有環(huán)!該圖不是DAG!\n");</p><p> exit(0); //退出</p><p><b> }<
136、/b></p><p><b> }</b></p><p><b> //主函數(shù)的實現(xiàn)</b></p><p> /*void TuoPu()</p><p><b> {</b></p><p> printf("\t\t\
137、t\t拓撲排序演示\n");</p><p> printf("\t\t\t\t現(xiàn)在開始\n");</p><p><b> Graph g;</b></p><p> CreateGraph(g);</p><p> printf("\n\t\t\t\t拓撲排序結(jié)果為:
138、\n");</p><p> printf("************************************************"); </p><p> TopologicalSort(g);</p><p> printf("\n*************************************
139、***********"); </p><p> printf("\n\t\t\t\t演示完畢\n");</p><p><b> }*/</b></p><p> *****************************************************各種排序</p><
140、;p> void InsertSort(RecType R[],int n)//直接插入排序 </p><p><b> {</b></p><p> int i,j,k;</p><p> RecType temp;</p><p> for(i=1;i<n;i++)</p><
141、;p><b> {</b></p><p> temp=R[i];</p><p> j=i-1; //從左向右在有序區(qū)R[0..i-1]中找R[i]的插入位置</p><p> while(j>=0&&temp.key<R[j].key)</p><p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計 排序二叉樹
- 猴子選王問題求解和二叉樹建立——課程設(shè)計報告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計--二叉排序樹調(diào)整為平衡二叉樹
- 10個數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實例二叉樹建立遍歷冒泡排序快速排序等
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---二叉排序樹和平衡二叉樹的判別
- 《二叉排序樹的操作》課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---判別給定的二叉樹是否為二叉排序樹
- 課程設(shè)計--- 二叉排序樹的實現(xiàn)
- 10個數(shù)據(jù)結(jié)構(gòu)課程設(shè)計實例二叉樹建立遍歷冒泡排序快速排序等.txt
- 二叉樹課程設(shè)計
- 長沙學(xué)院課程設(shè)計-利用二叉樹對順序表進行排序
- 數(shù)據(jù)結(jié)構(gòu)二叉排序樹課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--二叉排序樹
- 遍歷二叉樹課程設(shè)計
- ds課程設(shè)計報告--平衡二叉樹
- 平衡二叉樹匹配課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書-排序二叉樹的建立及遍歷的實現(xiàn)
- 平衡二叉樹匹配課程設(shè)計
- 二叉排序樹實驗
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---關(guān)于最短路徑問題 和 二叉樹排序問題
評論
0/150
提交評論