版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)</b></p><p> 2009 ~ 2010學(xué)年第二學(xué)期</p><p> 設(shè)計(jì)題目 文章編輯、猴子選大王、建立二叉樹、拓?fù)渑判颉⒏鞣N排序 </p><p><b> 目錄</b></p><
2、;p> 1、目的與要求2</p><p> 2、課程設(shè)計(jì)內(nèi)容說明3</p><p> 2.1主菜單界面:3</p><p> 2.2項(xiàng)目一:文章編輯**3</p><p> 2.3項(xiàng)目二:猴子選大王**4</p><p> 2.4項(xiàng)目三:建立二叉樹,層序、先序遍歷**6<
3、/p><p> 2.5項(xiàng)目四:拓?fù)渑判?</p><p> 2.6項(xiàng)目五:各種排序:插入排序和改進(jìn)冒泡排序算法10</p><p> 5、結(jié)論及體會(huì)14</p><p><b> 6、附錄14</b></p><p><b> 目的與要求</b><
4、/p><p> 鞏固和加深對(duì)常見數(shù)據(jù)結(jié)構(gòu)的理解和掌握</p><p> 掌握基于數(shù)據(jù)結(jié)構(gòu)進(jìn)行算法設(shè)計(jì)的基本方法</p><p> 掌握用高級(jí)語言實(shí)現(xiàn)算法的基本技能</p><p> 掌握書寫程序設(shè)計(jì)說明文檔的能力</p><p> 提高運(yùn)用數(shù)據(jù)結(jié)構(gòu)知識(shí)及高級(jí)語言解決非數(shù)值實(shí)際問題的能力</p>&l
5、t;p><b> 課程設(shè)計(jì)內(nèi)容說明</b></p><p><b> 主菜單界面:</b></p><p> 項(xiàng)目一:文章編輯**</p><p> (1)功能:輸入一頁(yè)文字,程序可以統(tǒng)計(jì)出文字、數(shù)字、空格的個(gè)數(shù)。</p><p> 靜態(tài)存儲(chǔ)一頁(yè)文章,每行最多不超過80個(gè)字符,共N行
6、;要求(1)分別統(tǒng)計(jì)出其中英文字母數(shù)和空格數(shù)及整篇文章總字?jǐn)?shù);(2)統(tǒng)計(jì)某一字符串在文章中出現(xiàn)的次數(shù),并輸出該次數(shù);(3)刪除某一子串,并將后面的字符前移。</p><p> 存儲(chǔ)結(jié)構(gòu)使用線性表,分別用幾個(gè)子函數(shù)實(shí)現(xiàn)相應(yīng)的功能;</p><p> 輸入數(shù)據(jù)的形式和范圍:可以輸入大寫、小寫的英文字母、任何數(shù)字及標(biāo)點(diǎn)符號(hào)。</p><p> 輸出形式:(1)分行輸
7、出用戶輸入的各行字符;(2)分4行輸出"全部字母數(shù)"、"數(shù)字個(gè)數(shù)"、"空格個(gè)數(shù)"、"文章總字?jǐn)?shù)"(3)輸出刪除某一字符串后的文章;</p><p> ?。?)程序的輸入輸出描述:</p><p><b> 進(jìn)入應(yīng)用程序:</b></p><p><b>
8、 ?。?)輸入文章:</b></p><p><b> (2)查找:</b></p><p> ?。?)刪除:原文為:QuYing111,刪除Y后為:Quing111</p><p> ?。?)尚未解決的問題或改進(jìn)方向</p><p> 這個(gè)文章編輯的缺點(diǎn)在于無法統(tǒng)計(jì)空格數(shù),只能夠統(tǒng)計(jì)大小寫字母以及數(shù)字&
9、lt;/p><p> ?。?)對(duì)軟件的使用說明</p><p> 在CFree4.0下打開軟件,進(jìn)行操作</p><p> 項(xiàng)目二:猴子選大王**</p><p> 對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p> 一堆猴子都有編號(hào),編號(hào)是1,2,3 ...m ,這群猴子(m個(gè))按照1-m的順序圍坐一圈,從第1開始數(shù),每數(shù)到
10、第N個(gè),該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最后一只猴子,則該猴子為大王。</p><p><b> 需求分析或功能描述</b></p><p> 輸入數(shù)據(jù):輸入m,n m,n 為整數(shù),n<m</p><p> 輸出形式:中文提示按照m個(gè)猴子,數(shù)n 個(gè)數(shù)的方法,輸出為大王的猴子是幾號(hào) ,建立一個(gè)函數(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故編號(hào) %d
15、 的猴子是大王!\n",p[t]);</p><p> printf("\n");</p><p><b> }</b></p><p> 項(xiàng)目三:建立二叉樹,層序、先序遍歷**</p><p> (1)對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p> 要求能夠輸入樹
16、的各個(gè)結(jié)點(diǎn),并能夠輸出用不同方法遍歷的遍歷序列;分別建立建立二叉樹存儲(chǔ)結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù);</p><p> ?。?)需求分析或功能描述</p><p> 程序功能包括,建立二叉樹,輸出二叉樹,對(duì)二叉樹進(jìn)行層次遍歷和先序遍歷。</p><p> ?。?)概要設(shè)計(jì)或程序流程圖</p><p>
17、進(jìn)入程序,選擇菜單,1創(chuàng)建二叉樹,在程序中進(jìn)行構(gòu)造二叉樹,并輸出創(chuàng)建好的二叉樹,2層次遍歷二叉樹,輸出二叉樹的層次遍歷序列,3先序遍歷二叉樹,輸出二叉樹的先序遍歷序列。</p><p> ?。?)詳細(xì)設(shè)計(jì)或源代碼說明</p><p> 創(chuàng)建二叉樹CreateBTNode(*b,*str)。根據(jù)二叉樹括號(hào)表示的字符串*str生成對(duì)應(yīng)的二叉鏈存儲(chǔ)結(jié)構(gòu),用ch掃描采用括號(hào)表示法表示二叉樹的字符
18、串。輸出二叉樹,以括號(hào)表示法輸出一棵二叉樹。先序遍歷二叉樹的過程是,訪問根結(jié)點(diǎn),先序遍歷左子樹,先序遍歷右子樹。層次遍歷的過程是,先將根結(jié)點(diǎn)進(jìn)隊(duì),在隊(duì)不為空時(shí)循環(huán),從隊(duì)列中出列一個(gè)結(jié)點(diǎn)*p,訪問它,若它有左孩子結(jié)點(diǎn),如此操作直到隊(duì)空為止。 </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)//以括號(hào)表示法輸出二叉樹</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> (7)調(diào)試分析或程序測(cè)試</p><p> ?。?)尚未解決的問題或改進(jìn)方向</p><p> 因?yàn)楸境绦蜃罱K要與其他兩個(gè)程序合并在一起,在主界面進(jìn)行選擇。所以在進(jìn)入主界面時(shí)要在本程序的主函數(shù)處修改字符,否則在調(diào)用本程序時(shí)主函數(shù)會(huì)發(fā)生沖突。</p><p> (9)對(duì)軟件的使用說明</p><p> 在CFree4.0下
23、打開軟件,進(jìn)行操作。</p><p><b> 項(xiàng)目四:拓?fù)渑判?lt;/b></p><p> 對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p> 編寫函數(shù),實(shí)現(xiàn)圖的拓?fù)渑判颉?lt;/p><p><b> 需求分析或功能描述</b></p><p> 在一個(gè)有向圖中找一個(gè)拓?fù)湫蛄械倪^
24、程稱為拓?fù)渑判?,而每一個(gè)有向圖的拓?fù)湫蛄胁⒉晃ㄒ?,本程序的功能就是將用戶輸入的序列進(jìn)行拓?fù)渑判颉?lt;/p><p> 概要設(shè)計(jì)或程序流程圖</p><p> 在程序菜單中選擇開始,輸入有向圖的結(jié)點(diǎn)數(shù)和邊數(shù),此時(shí)程序就會(huì)輸出結(jié)點(diǎn)信息,如v1,v2,v3等,接下來會(huì)要求用戶輸入第一條邊的起點(diǎn)和終點(diǎn),通過程序運(yùn)行就可以輸出拓?fù)渑判蚪Y(jié)果。</p><p> 詳細(xì)設(shè)計(jì)或源
25、代碼說明</p><p> 對(duì)于給定的有向圖,采用鄰接表作為存儲(chǔ)結(jié)構(gòu),為每個(gè)頂點(diǎn)設(shè)置一個(gè)鏈表,每個(gè)鏈表有一個(gè)表頭結(jié)點(diǎn),這些表頭結(jié)點(diǎn)構(gòu)成一個(gè)數(shù)組,表頭結(jié)點(diǎn)中增加一個(gè)存放頂點(diǎn)入度的域count,在執(zhí)行拓?fù)渑判虻倪^程中,當(dāng)某個(gè)頂點(diǎn)的入度為0(沒有前驅(qū)結(jié)點(diǎn)時(shí)),就將此頂點(diǎn)輸出,同時(shí)將該頂點(diǎn)的所有后繼結(jié)點(diǎn)的入度減1,為了避免重復(fù)檢測(cè)入度為0的頂點(diǎn),設(shè)立一個(gè)棧St,以存放入度為0的頂點(diǎn)。</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; //??臻g </p><p><b> }Stack;</b></p><p> int InitStack(Stack &s) //創(chuàng)建一個(gè)空棧</p><p> int Push(Stack &s,int e)
28、 //進(jìn)棧</p><p> bool Empty(Stack s) //查看棧是否為空</p><p> int Pop(Stack &s) //出棧</p><p> int LocateVex(Graph G,int v) //返回節(jié)點(diǎn)v在圖中的位置</p&
29、gt;<p> void CreateGraph(Graph &G) //建圖 </p><p> void TopologicalSort(Graph G) //拓?fù)渑判蚝瘮?shù)</p><p> 程序的輸入與輸出描述</p><p><b> 輸入界面:</b></p><p>
30、; 再輸入結(jié)點(diǎn)數(shù)和邊數(shù),此時(shí)會(huì)輸出頂點(diǎn)信息:</p><p><b> 排序結(jié)果輸出界面:</b></p><p><b> 調(diào)試分析或程序測(cè)試</b></p><p><b> 對(duì)軟件的使用說明</b></p><p> 在CFree4.0下打開軟件,進(jìn)行操作。&l
31、t;/p><p> 項(xiàng)目五:各種排序:插入排序和改進(jìn)冒泡排序算法</p><p> 對(duì)設(shè)計(jì)任務(wù)內(nèi)容的概述</p><p> 用程序?qū)崿F(xiàn)插入法排序、起泡法改進(jìn)算法排序;利用插入排序和冒泡法的改進(jìn)算法,將用戶隨機(jī)輸入的一列數(shù)按遞增的順序排好。輸入的數(shù)據(jù)形式為任何一個(gè)正整數(shù),大小不限。輸出的形式:數(shù)字大小逐個(gè)遞增的數(shù)列。</p><p><
32、b> 需求分析或功能描述</b></p><p> 插入排序的基本思想是:每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子表中的適當(dāng)位置,直到每次記錄插入完成為止。本程序使用直接插入排序。</p><p> 交換排序的基本思想是:兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個(gè)記錄的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的記錄為止。本程序使用改進(jìn)的冒泡排序算法。<
33、;/p><p> 概要設(shè)計(jì)或程序流程圖</p><p> 直接插入排序:假設(shè)待排序的記錄存放在數(shù)組R[0..n-1]中,排序過程的某一中間時(shí)刻,R被劃分成兩個(gè)子區(qū)間[0..i-1]和[i..n-1](剛開始時(shí)i=1,有序區(qū)序號(hào)只有R[0]一個(gè)記錄),其中:前一個(gè)子區(qū)間是已排好序的有序區(qū),后一個(gè)子區(qū)間則是當(dāng)前未排序的部分,不妨稱其為無序區(qū)。直接插入排序的基本操作是將當(dāng)前無序區(qū)的第一個(gè)記錄R[
34、i]插入到有序區(qū)[0..i-1]中適當(dāng)?shù)奈恢蒙?,使[0..i]變?yōu)樾碌挠行騾^(qū)。</p><p> 有序區(qū) 無序區(qū)</p><p><b> 一趟排序</b></p><p> 有序區(qū) 無序區(qū)</p><p> 直接插入排序的一趟排序過程</
35、p><p> 冒泡排序:整個(gè)算法是從最下面的記錄開始,對(duì)每?jī)蓚€(gè)相臨的關(guān)鍵字進(jìn)行比較,且使關(guān)鍵字較小的記錄換至關(guān)鍵字較大的記錄之上,使得經(jīng)過一趟冒泡排序之后,關(guān)鍵字最小的記錄到達(dá)最上端,接著,再在剩下的記錄中找關(guān)鍵字次小的記錄,并把它換在第二個(gè)位置上。依次類推,一直到所有記錄都有序?yàn)橹埂6谟行┣闆r下,在第i(i<n-1)趟時(shí)已排好序了,但仍執(zhí)行后面幾趟的比較。實(shí)際上,一旦酸法中某一趟比較時(shí)不出現(xiàn)任何記錄交換,
36、說明已經(jīng)排好序了,就可以結(jié)束本算法。為此,改進(jìn)了冒泡排序算法。 </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ù)項(xiàng),類型為InfoType</p><p> }RecType ;//排序的記錄類型定義</p>
40、;<p> void InsertSort(RecType R[],int n)//直接插入排序</p><p> void BubbleSort(RecType R[],int n)//改進(jì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)試分析或程序測(cè)試</b></p><p><b> 直接插入排序:</b></p><p><b> 冒泡排序:</b></p><p> 尚未解決的問題或改進(jìn)方向</p><p> 在算法的定義中,一開始就定義數(shù)組長(zhǎng)度為10,如果
43、用戶操作中輸入了大于10個(gè)數(shù)時(shí)將只對(duì)前10個(gè)數(shù)進(jìn)行操作,而后面的數(shù)不會(huì)參加運(yùn)算。</p><p><b> 對(duì)軟件的使用說明</b></p><p> 在CFree4.0下打開軟件,進(jìn)行操作。</p><p><b> 結(jié)論及體會(huì)</b></p><p> 在這次的數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)中,從十三
44、個(gè)題目中選了五個(gè)自己比較感興趣的題目進(jìn)行編程,因?yàn)樵S多算法可以在書上找到類似的類型,加上自己的想法,做的可以說比較順利。和平時(shí)上機(jī)所做的不同,這次需要一個(gè)程序的主界面,用來調(diào)用所設(shè)計(jì)的五個(gè)項(xiàng)目,而且分別對(duì)五個(gè)項(xiàng)目的程序設(shè)計(jì)從構(gòu)思,到算法,再到輸入輸出和調(diào)試,進(jìn)行了比較充分的說明,使用起來也比較方便。</p><p><b> 附錄</b></p><p><b
45、> 附錄1:參考文獻(xiàn)</b></p><p> [1]李春葆.數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)指導(dǎo).清華大學(xué)出版社,2010</p><p> [2]張曉莉等.數(shù)據(jù)結(jié)構(gòu)與算法.機(jī)械工業(yè)出版社,2002</p><p> [3]李春葆.數(shù)據(jù)結(jié)構(gòu)教程上機(jī)實(shí)驗(yàn)指導(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("當(dāng)前的文章為:");</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)計(jì) </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個(gè)\n
56、",a) ;</p><p> printf("英文大寫字母有:%d個(gè)\n",b) ;</p><p> printf("數(shù)字有:%d個(gè)\n",c);</p><p> printf("空格有:%d個(gè)\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)查找個(gè)字符共有 %d 個(gè)\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故編號(hào) %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;//建立的二叉樹初始時(shí)為空 </p><p> ch=str[j];</p><p>
74、; while(ch!='\0')//str未掃描完時(shí)循環(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é)點(diǎn) </p><p> case ')':top--;break;</p><p> case ',':k=2;break;//為右結(jié)點(diǎn) </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é)點(diǎn) </p><p><b> b=p;</b></p><p> else//已建立二叉樹根結(jié)點(diǎn) </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)//以括號(hào)表示法輸出二叉樹 </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é)點(diǎn) </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("請(qǐng)輸入二叉樹:");</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> ****************************************************************拓?fù)渑判颍?lt;/p><p> #define STACKSIZE 100 //??臻g大小 &
96、lt;/p><p> #define STACKINCREMENT 20 //進(jìn)棧棧增量 </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; //??臻g </p><p><b> }Stack;</b><
98、;/p><p> int InitStack(Stack &s) //創(chuàng)建一個(gè)空棧</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) //進(jìn)棧 </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é)點(diǎn)</p><p><b> {
106、</b></p><p> int adjvex; //該邊所指向的頂點(diǎn)的位置</p><p> struct ArcNode *nextarc; //指向下一條邊</p><p><b> }ArcNode;</b></p><p> typedef str
107、uct VNode //表節(jié)點(diǎn)</p><p><b> {</b></p><p> int data; //頂點(diǎn)信息</p><p> int indegree; //節(jié)點(diǎn)的入度</p><p> ArcNode *f
108、irstarc; //指向第一條依附該節(jié)點(diǎn)的邊的指針</p><p> }VNode,AdjList[MAX];</p><p> typedef struct </p><p><b> {</b></p><p> AdjList vertices; //表節(jié)點(diǎn)<
109、;/p><p> int vexnum; //節(jié)點(diǎn)的個(gè)數(shù)</p><p> int arcnum; //邊的條數(shù)</p><p><b> }Graph;</b></p><p> int LocateVex(Graph G,int v) /
110、/返回節(jié)點(diǎn)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)在請(qǐng)輸入DAG的結(jié)點(diǎn)數(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é)點(diǎn)數(shù)不能小于1.\n");</p><p> p
115、rintf("請(qǐng)重新輸入DAG的頂點(diǎn)數(shù): "); //DAG是有向無環(huán)圖 </p><p> scanf("%d",&m);</p><p><b> }</b></p><p> printf("②現(xiàn)在請(qǐng)輸入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("請(qǐng)重新輸入DAG的邊數(shù): ");</p><p> scanf("%d",&n);</p><p><b> }</b></p><p> G.vexnum=m; //頂點(diǎn)數(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、 //頂點(diǎn)信息</p><p> G.vertices[i].firstarc=0;</p><p> G.vertices[i].indegree=0; //開始時(shí)入度都為0</p><p><b> }</b></p><p><b> //頂點(diǎn)信息</b></p&
120、gt;<p> printf("③現(xiàn)在輸出頂點(diǎ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("④請(qǐng)輸入第%d邊的起點(diǎn)和終點(diǎn)(樣例:1 2),注意其中分隔符為一個(gè)空格: ",k+1);</p><p> scanf("%d%d",&v1,&am
122、p;v2);</p><p> i=LocateVex(G,v1); //頂點(diǎn)v1在圖中的位置</p><p> j=LocateVex(G,v2); //頂點(diǎn)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); //求該頂點(diǎn)的最后一個(gè)鄰接頂點(diǎn)</p><p> p1->nextarc=p; //將p插入到最后一個(gè)鄰接頂點(diǎn)
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) //拓?fù)渑判蚝瘮?shù)</p&g
129、t;<p><b> {</b></p><p> int i,j,k;</p><p> int count=0; //用來統(tǒng)計(jì)頂點(diǎn)的個(gè)數(shù)</p><p> Stack s; //定義一個(gè)棧,用來保存入度為0的頂點(diǎn)</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個(gè)頂點(diǎn)的入度為0 ,i表示頂點(diǎn)在圖中的位置</p><p> Push(s,i); //將第i個(gè)頂點(diǎn)入棧</p><p> while(!Empty(
131、s))</p><p><b> {</b></p><p> j=Pop(s); // 將為入度0的頂點(diǎn)位置出棧,并保存到j(luò)中</p><p> count++; //統(tǒng)計(jì)頂點(diǎn)的個(gè)數(shù)</p><p> printf("v%d ",G.vertices[j].data
132、); //輸出入度為0的頂點(diǎn)</p><p> ArcNode *p;</p><p> for(p=G.vertices[j].firstarc; p ;p=p->nextarc) //找與第j個(gè)頂點(diǎn)的鄰接頂點(diǎn),并將其入度減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小于頂點(diǎn)的個(gè)數(shù)時(shí)候,說明有環(huán),不符合拓?fù)渑判虻囊?lt;/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ù)的實(shí)現(xiàn)</b></p><p> /*void TuoPu()</p><p><b> {</b></p><p> printf("\t\t\
137、t\t拓?fù)渑判蜓菔綷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拓?fù)渑判蚪Y(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì) 排序二叉樹
- 猴子選王問題求解和二叉樹建立——課程設(shè)計(jì)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹調(diào)整為平衡二叉樹
- 10個(gè)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)例二叉樹建立遍歷冒泡排序快速排序等
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉排序樹和平衡二叉樹的判別
- 《二叉排序樹的操作》課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---判別給定的二叉樹是否為二叉排序樹
- 課程設(shè)計(jì)--- 二叉排序樹的實(shí)現(xiàn)
- 10個(gè)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)例二叉樹建立遍歷冒泡排序快速排序等.txt
- 二叉樹課程設(shè)計(jì)
- 長(zhǎng)沙學(xué)院課程設(shè)計(jì)-利用二叉樹對(duì)順序表進(jìn)行排序
- 數(shù)據(jù)結(jié)構(gòu)二叉排序樹課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉排序樹
- 遍歷二叉樹課程設(shè)計(jì)
- ds課程設(shè)計(jì)報(bào)告--平衡二叉樹
- 平衡二叉樹匹配課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書-排序二叉樹的建立及遍歷的實(shí)現(xiàn)
- 平衡二叉樹匹配課程設(shè)計(jì)
- 二叉排序樹實(shí)驗(yàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---關(guān)于最短路徑問題 和 二叉樹排序問題
評(píng)論
0/150
提交評(píng)論