版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 綱要</b></p><p> 一 程序設(shè)計(jì)要求與目的</p><p><b> 二 存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)</b></p><p> 三 算法設(shè)計(jì)(流程圖)</p><p> 四 詳細(xì)設(shè)計(jì)(源代碼)</p><p><b> 五 調(diào)試
2、與分析</b></p><p><b> 六 實(shí)驗(yàn)總結(jié)</b></p><p><b> 七 參考文獻(xiàn)</b></p><p> 第一章 程序設(shè)計(jì)要求與目的</p><p> 題目:樹(shù)與二叉樹(shù)的轉(zhuǎn)換的實(shí)現(xiàn)。以及樹(shù)的前序、后序的遞歸、非遞歸遍歷算法,層次序的非遞歸遍歷算法的實(shí)現(xiàn),應(yīng)
3、包含建樹(shù)的實(shí)現(xiàn)。</p><p> 第二章 存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)</p><p><b> 引入頭文件:</b></p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #include <
4、stdlib.h></p><p><b> 設(shè)置常量:</b></p><p> #define MAX_TREE_SIZE 100</p><p> 一般樹(shù)的存儲(chǔ)結(jié)構(gòu)有以下幾種:雙親結(jié)點(diǎn),孩子結(jié)點(diǎn),孩子兄弟結(jié)點(diǎn)。本實(shí)驗(yàn)運(yùn)用到的是雙親結(jié)點(diǎn)和孩子兄弟結(jié)點(diǎn)。具體存儲(chǔ)結(jié)構(gòu)如下:</p><p> /*樹(shù)的雙親表
5、示結(jié)點(diǎn)結(jié)構(gòu)定義*/</p><p> typedef struct </p><p><b> {</b></p><p><b> int data;</b></p><p> int parent; //雙親位置域</p><p><b
6、> }PTNode;</b></p><p> /*雙親表示法樹(shù)結(jié)構(gòu)*/</p><p> typedef struct </p><p><b> {</b></p><p> PTNode node[MAX_TREE_SIZE];</p><p>
7、int count; //根的位置和節(jié)點(diǎn)個(gè)數(shù)</p><p><b> }PTree;</b></p><p> /*樹(shù)的孩子兄弟表示結(jié)點(diǎn)結(jié)構(gòu)定義*/</p><p> typedef struct node{</p><p><b> int data;</b></p&
8、gt;<p> struct node *firstchild;</p><p> struct node *rightsib;</p><p> }BTNode,*BTree;</p><p> 第三章 算法設(shè)計(jì)(流程圖)</p><p><b> 流程圖:</b></p><
9、;p> 第四章 詳細(xì)設(shè)計(jì)(源代碼)</p><p> 詳細(xì)設(shè)計(jì)共有以下函數(shù)的實(shí)現(xiàn):</p><p> 樹(shù)的初始化函數(shù)(雙親法和孩子結(jié)點(diǎn)法兩種),建樹(shù)函數(shù),輸出樹(shù)函數(shù),樹(shù)的前序遍歷函數(shù)(遞歸和非遞歸兩種),樹(shù)的后序遍歷函數(shù)(遞歸和非遞歸兩種),樹(shù)的層次遍歷函數(shù),一般樹(shù)和二叉樹(shù)的轉(zhuǎn)換函數(shù)。</p><p><b> 主菜單和副菜單。</b&
10、gt;</p><p><b> 主函數(shù)。</b></p><p><b> 具體代碼如下:</b></p><p> //初始化樹(shù)(雙親表示法)</p><p> void init_ptree(PTree *tree)</p><p><b> {&l
11、t;/b></p><p> tree->count=-1;</p><p><b> }</b></p><p> //初始化樹(shù)結(jié)點(diǎn)(孩子兄弟表示法)</p><p> BTNode GetTreeNode(int x)</p><p><b> {</b&
12、gt;</p><p><b> BTNode t;</b></p><p><b> t.data=x;</b></p><p> t.firstchild=t.rightsib=NULL;</p><p><b> return t;</b></p>
13、<p><b> }</b></p><p> //樹(shù)的前序遍歷(遞歸)</p><p> void preorder(BTNode *T)</p><p><b> {</b></p><p> if(T!=NULL)</p><p><b>
14、 {</b></p><p> printf("%d ",T->data);</p><p> preorder(T->firstchild);</p><p> preorder(T->rightsib);</p><p><b> }</b></p&g
15、t;<p><b> }</b></p><p> //樹(shù)的前序遍歷(非遞歸)</p><p> void preorder2(PTree T)</p><p><b> {</b></p><p><b> int i;</b></p>
16、<p> for(i=0;i<T.count;i++)</p><p><b> {</b></p><p> printf("%d ",T.node[i]);</p><p><b> }</b></p><p><b> }</b&g
17、t;</p><p> //樹(shù)后序遍歷(遞歸)</p><p> void inoeder(BTNode *T)</p><p><b> {</b></p><p> if(T!=NULL)</p><p><b> {</b></p><p&
18、gt; inoeder(T->firstchild);</p><p> printf("%d ",T->data);</p><p> inoeder(T->rightsib);</p><p><b> }</b></p><p><b> }</b&
19、gt;</p><p> //樹(shù)后序遍歷(非遞歸)</p><p> void inoeder2(PTree T)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=T.count-1;i>=0
20、;i--)</p><p><b> {</b></p><p> printf("%d ",T.node[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b&g
21、t; //層次遍歷</b></p><p> void level(PTree T)</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;i<T.count;i++)</p><p&g
22、t;<b> {</b></p><p> printf("%d ",T.node[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b> //水平輸出二叉樹(shù)</b>&l
23、t;/p><p> void PrintBTree(BTNode *root,int level) </p><p><b> { </b></p><p><b> int i;</b></p><p> if(root!=NULL) </p><p><b>
24、; { </b></p><p> PrintBTree(root->rightsib,level+1); </p><p> for(i=1;i<=8*level;i++) </p><p> printf(" "); </p><p> printf("-------%d\n
25、",root->data); </p><p> PrintBTree(root->firstchild,level+1); </p><p><b> }</b></p><p><b> }</b></p><p><b> //輸出樹(shù)</b>
26、</p><p> void print_ptree(PTree tree)</p><p><b> {</b></p><p><b> int i;</b></p><p> printf(" 序號(hào) 結(jié)點(diǎn) 雙親\n");</p>&l
27、t;p> for(i=0;i<=tree.count;i++)</p><p><b> {</b></p><p> printf("%8d%8d%8d",i,tree.node[i].data,tree.node[i].parent);</p><p> printf("\n");
28、</p><p><b> }</b></p><p><b> }</b></p><p> /*用雙親表示法創(chuàng)建樹(shù)*/</p><p> PTree CreatTree(PTree T)</p><p><b> {</b></p&g
29、t;<p><b> int i=1;</b></p><p> int fa,ch;</p><p><b> PTNode p;</b></p><p> for(i=1;ch!=-1;i++)</p><p><b> {</b></p>
30、;<p> printf("輸入第%d結(jié)點(diǎn):\n",i);</p><p> scanf("%d,%d",&fa,&ch);</p><p> printf("\n");</p><p> p.data=ch;</p><p> p.paren
31、t=fa;</p><p> T.count++;</p><p> T.node[T.count].data = p.data;</p><p> T.node[T.count].parent = p.parent;</p><p><b> }</b></p><p> printf
32、("\n");</p><p> printf("創(chuàng)建的樹(shù)具體情況如下:\n");</p><p> print_ptree(T);</p><p><b> return T;</b></p><p><b> }</b></p>&l
33、t;p> /*一般樹(shù)轉(zhuǎn)換成二叉樹(shù)*/</p><p> BTNode *change(PTree T)</p><p><b> {</b></p><p> int i,j=0;</p><p> BTNode p[MAX_TREE_SIZE];</p><p> BTNode
34、 *ip,*is,*ir,*Tree;</p><p> ip=(BTNode *)malloc(sizeof(BTNode));</p><p> is=(BTNode *)malloc(sizeof(BTNode));</p><p> ir=(BTNode *)malloc(sizeof(BTNode));</p><p> T
35、ree=(BTNode *)malloc(sizeof(BTNode));</p><p> for(i=0;i<T.count;i++)</p><p><b> {</b></p><p> p[i]=GetTreeNode(T.node[i].data);</p><p><b> }<
36、;/b></p><p> for(i=1;i<T.count;i++)</p><p><b> {</b></p><p><b> ip=&p[i];</b></p><p><b> is=&p[j];</b></p>
37、<p> while(T.node[i].parent!=is->data)</p><p><b> {</b></p><p><b> j++;</b></p><p><b> is=&p[j];</b></p><p><b>
38、; }</b></p><p> if(!(is->firstchild))</p><p><b> {</b></p><p> is->firstchild=ip;</p><p><b> ir=ip;</b></p><p><
39、;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> ir->rightsib=ip;</p><p><b> ir=ip;</b></p><p>&
40、lt;b> }</b></p><p><b> }</b></p><p> Tree=&p[0];</p><p> return Tree;</p><p><b> }</b></p><p><b> /*主菜單*/&
41、lt;/b></p><p> void Menu()</p><p><b> {</b></p><p> printf("=================主菜單=======================\n");</p><p> printf("***輸入1---
42、----------以雙親法創(chuàng)建一棵一般樹(shù)***\n");</p><p> printf("***輸入2-------------樹(shù)的前序遍歷(遞歸)*******\n");</p><p> printf("***輸入3-------------樹(shù)的后序遍歷(遞歸)*******\n");</p><p>
43、 printf("***輸入4-------------樹(shù)的前序遍歷(非遞歸)*****\n");</p><p> printf("***輸入5-------------樹(shù)的后序遍歷(非遞歸)*****\n");</p><p> printf("***輸入6-------------層次序的非遞歸遍歷*******\n")
44、;</p><p> printf("***輸入0-------------退出程序*****************\n");</p><p> printf("==============================================\n");</p><p> printf("請(qǐng)輸入執(zhí)行
45、的指令:");</p><p><b> }</b></p><p><b> /*副菜單*/</b></p><p> void Menu2()</p><p><b> {</b></p><p> printf("**
46、***************副菜單*******************\n");</p><p> printf("***9-------------返回主菜單繼續(xù)操作*******\n");</p><p> printf("***0-------------退出程序*****************\n");</p>
47、<p><b> }</b></p><p><b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b></p><p> int i=0,c1,c2;</p><p><
48、;b> PTree T;</b></p><p> BTNode *Tree;</p><p> init_ptree(&T);</p><p><b> loop:</b></p><p><b> Menu();</b></p><p>
49、; scanf("%d",&c1);</p><p> switch(c1)</p><p><b> { </b></p><p><b> case 1: </b></p><p> printf("建立一般樹(shù),依次輸入各個(gè)結(jié)點(diǎn)情況:\n&quo
50、t;);</p><p> printf("輸入結(jié)點(diǎn)方式:雙親數(shù)據(jù),整型數(shù)據(jù)(第一個(gè)結(jié)點(diǎn)雙親數(shù)據(jù)為-1,最后以-1,-1結(jié)束)\n例子:-1,1 1,3\n");</p><p> T=CreatTree(T);</p><p> Tree=change(T);</p><p> printf("一般樹(shù)
51、轉(zhuǎn)換成二叉樹(shù)后的情況:\n");</p><p> PrintBTree(Tree,i);</p><p> getchar();</p><p><b> break;</b></p><p><b> case 2: </b></p><p> pr
52、intf("樹(shù)的前序遍歷(遞歸):\n");</p><p> preorder(Tree);</p><p> printf("\n");</p><p><b> break;</b></p><p><b> case 3:</b></p
53、><p> printf("樹(shù)的后序遍歷(遞歸):\n");</p><p> inoeder(Tree);</p><p> printf("\n");</p><p><b> break;</b></p><p><b> case
54、4: </b></p><p> printf("樹(shù)的前序遍歷(非遞歸):\n");</p><p> preorder2(T);</p><p> printf("\n");</p><p><b> break;</b></p><p&g
55、t;<b> case 5: </b></p><p> printf("樹(shù)的后序遍歷(非遞歸):\n");</p><p> inoeder2(T);</p><p> printf("\n");</p><p><b> break;</b>&
56、lt;/p><p> case 6: </p><p> printf("樹(shù)的層次遍歷:\n");</p><p><b> level(T);</b></p><p> printf("\n");</p><p><b> break;
57、</b></p><p><b> case 0:</b></p><p><b> exit(1);</b></p><p> break; </p><p><b> }</b></p><p><b>
58、Menu2();</b></p><p> scanf("%d",&c2);</p><p><b> if(c2==9)</b></p><p> goto loop;</p><p> else if(c2==0)</p><p><b&g
59、t; exit(1);</b></p><p><b> }</b></p><p><b> 第五章 調(diào)試與分析</b></p><p><b> 程序開(kāi)始:</b></p><p> 建立一棵一般樹(shù):輸入指令1</p><p>
60、<b> 輸入結(jié)點(diǎn)的方式:</b></p><p> 雙親數(shù)據(jù)(整型),結(jié)點(diǎn)數(shù)據(jù)(整型) 以-1,-1結(jié)束</p><p> 如:-1,1 1,2 -1,-1</p><p> 一般樹(shù)創(chuàng)建完的具體情況:</p><p> 把一般樹(shù)轉(zhuǎn)換為二叉樹(shù)后:</p><p> 副菜單選擇:選
61、擇9繼續(xù)操作</p><p> 運(yùn)用各種遍歷形式遍歷樹(shù):</p><p> 副菜單選擇:選擇0結(jié)束程序</p><p><b> 第六章 實(shí)驗(yàn)總結(jié)</b></p><p> 通過(guò)本次程序設(shè)計(jì),讓我更深層次地了解到了樹(shù)各種函數(shù)的運(yùn)用,如何運(yùn)用各種存儲(chǔ)結(jié)構(gòu)創(chuàng)建樹(shù),以及在實(shí)驗(yàn)中還涉及到遞歸的運(yùn)用,遞歸的思想省去了復(fù)雜的
62、算法設(shè)計(jì)。在實(shí)驗(yàn)中不可避免的出現(xiàn)了大大小小的問(wèn)題,在調(diào)試中透徹領(lǐng)悟各種算法的真諦,同樣的錯(cuò)誤在下次遇到時(shí)就可以避免了。在實(shí)驗(yàn)中,分別使用了VC++和Turbo C兩種編譯器,在使用各種編譯器的同時(shí)能了解不同的編譯器的不同之處,取長(zhǎng)補(bǔ)短,更好的設(shè)計(jì)程序。</p><p><b> 參 考 文 獻(xiàn)</b></p><p> [1]趙堅(jiān),姜梅主編.據(jù)結(jié)構(gòu)(C語(yǔ)言版).中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--樹(shù)的應(yīng)用_樹(shù)和二叉樹(shù)的轉(zhuǎn)換
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹(shù)》課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---計(jì)算二叉樹(shù)高度
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹(shù)的操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)及應(yīng)用
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹(shù)調(diào)整為平衡二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---線索二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的相關(guān)操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--二叉樹(shù)的算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)平衡的判定
- 數(shù)據(jù)結(jié)構(gòu)與算法樹(shù)與二叉樹(shù)
- 中根與后根構(gòu)造二叉樹(shù)與二叉樹(shù)的匹配替換-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉樹(shù)的基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之二叉樹(shù)的遍歷
- 數(shù)據(jù)結(jié)構(gòu)樹(shù)和二叉樹(shù)ppt
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉排序樹(shù)和平衡二叉樹(shù)的判別
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--按層次遍歷二叉樹(shù)
評(píng)論
0/150
提交評(píng)論