數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之-樹(shù)與二叉樹(shù)的轉(zhuǎn)換_第1頁(yè)
已閱讀1頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論