數(shù)據(jù)結構課程設計(赫夫曼樹的建立)_第1頁
已閱讀1頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  哈夫曼樹的建立</b></p><p>  數(shù)據(jù)結構課程設計文檔</p><p><b>  班 級: </b></p><p><b>  小組組長: </b></p><p><b>  成 員: </b>&

2、lt;/p><p><b>  指導老師: </b></p><p><b>  第一章 前 言</b></p><p>  數(shù)據(jù)結構作為一門學科主要研究數(shù)據(jù)的各種邏輯結構和存儲結構,以及對數(shù)據(jù)的各種操作。因此,主要有三個方面的內容:數(shù)據(jù)的邏輯結構;數(shù)據(jù)的物理存儲結構;對數(shù)據(jù)的操作(或算法)。通常,算法的設計取決于數(shù)據(jù)的邏輯

3、結構,算法的實現(xiàn)取決于數(shù)據(jù)的物理存儲結構。數(shù)據(jù)結構是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應,通過這組算法集合可以對數(shù)據(jù)結構中的數(shù)據(jù)進行某種操作。在當今信息時代,信息技術己成為當代知識經(jīng)濟的核心技術。我們時刻都在和數(shù)據(jù)打交道。比如人們在外出工作時找最短路徑,在銀行查詢存款、通過互聯(lián)網(wǎng)查新聞、以及遠程教育報名等,所有這些都在與數(shù)據(jù)發(fā)生關系。實際上,現(xiàn)實世界中的實體經(jīng)過抽象以后,就可以成為計算機上所處理的

4、數(shù)據(jù)。數(shù)據(jù)結構課程主要是研究非數(shù)值計算的程序設計問題中所出現(xiàn)的計算機操作對象以及它們之間的關系和操作的學科。數(shù)據(jù)結構是介于數(shù)學、計算機軟件和計算機硬件之間的一門計算機專業(yè)的核心課程,它是計算機程序設計、數(shù)據(jù)庫、操作系統(tǒng)、編譯原理及人工智能等的重要基礎,廣泛的應用于信息學、系統(tǒng)工程等各種領域。學習數(shù)據(jù)結構是為了將實際問題中所涉及的對象在計算機中表示出來并對它們</p><p>  通過此次課程設計主要達到以下目的:

5、</p><p>  了解并掌握數(shù)據(jù)結構與算法的設計方法,具備初步的獨立分析和設計能力;</p><p>  初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設計、程序編碼、測試等基本方法和技能;</p><p>  提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力;</p><p>  四、訓練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),培養(yǎng)軟

6、件工作者所應具備的科學的工作方法和作風。</p><p><b>  概要設計</b></p><p><b>  數(shù)據(jù)結構設計</b></p><p>  使用樹TREE的結構,編造最優(yōu)二叉樹(即哈夫曼樹),涉及到主要函數(shù)有Inithuffmantree,Destoryhuffmantree,huffmancodeing

7、,Visithuffmantree等,用于在一定時間復雜度內尋找到最佳(最短)路徑,節(jié)約比較次數(shù)。</p><p><b>  層次調用關系</b></p><p>  在main()函數(shù)中調用哈夫曼樹的各種操作函數(shù)</p><p><b>  ADT描述 </b></p><p>  H

8、uffman tree </p><p><b>  {</b></p><p>  ? 數(shù)據(jù)對象D: D為帶有各自實數(shù)W(D)的數(shù)據(jù)元素的集合</p><p>  數(shù)據(jù)關系:D=NULL 則huffmantree不存在D≠NULL R={H}.H為如下二元 關系: </p&g

9、t;<p>  ?  ①D中存在唯一根數(shù)據(jù)元素root,這個元素無前驅。 </p><p>  ?  ②D-{root} ≠NULL.則存在D-{root} ={D1,Dr}.且D1∧Dr=NULL </p><p>  ?  ③若D1 ≠NULL ,則D1

10、 中存在唯一元素xr,<root, xr>∈H ? </p><p>  且存在Dr上關系Hr∈H,H= {<root,x1>,<root,xr>,H1,Hr}; </p><p>  ?  ④符合① ② ③的R的組合中,存在一個組合R’使D中所有結點到roo

11、t的長度與其權值W(Di)相乘的和最小,此時的<D/R>集合稱為huffmantree.</p><p><b>  }</b></p><p><b>  詳細設計</b></p><p>  編譯環(huán)境:VC6.0</p><p>  實現(xiàn)該該程序的主要算法是:</p>

12、;<p><b>  基本操作</b></p><p>  Init huffmantree(&T) </p><p>  操作結果:構造一個已知節(jié)點和權值的哈夫曼樹</p><p>  Destory huffmantree(&T) </p><p>  條件:huffman

13、tree 已存在</p><p>  結果:銷毀huffmantree</p><p>  huffman coding(&T)</p><p>  條件:huffmantree 已經(jīng)存在</p><p>  結果:輸出huffman code</p><p>  Visit huffmantree(&

14、T)</p><p>  條件:huffmantree 已經(jīng)存在</p><p>  結果:顯示huffman tree</p><p><b>  一、二叉樹的設計</b></p><p>  typedef struct</p><p><b>  {</b></p

15、><p>  unsigned int weight;</p><p>  unsigned int parent,lchild,rchild;</p><p>  } HTNode,*HuffmanTree;</p><p>  typedef char **HuffmanCode;</p><p>  typedef

16、struct</p><p><b>  {</b></p><p>  unsigned int s1;</p><p>  unsigned int s2;</p><p><b>  }MinCode;</b></p><p><b>  二、主要過程<

17、/b></p><p>  int main()</p><p><b>  {</b></p><p>  int code=0;</p><p>  HuffmanTree HT=NULL;</p><p>  HuffmanCode HC=NULL;</p><p&

18、gt;  unsigned int *w=NULL;</p><p>  unsigned int i,n;</p><p>  printf("Input   n:\n"); </p><p>  scanf("%d",&n);</p><p>  w=

19、(unsigned int*)malloc((n+1)*sizeof(unsigned int*));       w[0]=0;    </p><p>  printf("Enter   weight:\n");  &#

20、160;   </p><p>  for(i=1;i<=n;i++)</p><p><b>  {    </b></p><p>  printf("w[%d]=",i);</p><p>  scanf("%

21、d",&w[i]);      </p><p><b>  }    </b></p><p>  HT=inithuffmantree(w,n);    </p><p>  huff

22、mantreecoding (HT,HC,n)    </p><p>  outputhuffmantree (HT,n);   </p><p>  destroyhuffmantree (HT);</p><p><b>  }</b>&l

23、t;/p><p><b>  三、結構流程圖</b></p><p><b>  程序代碼</b></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include<

24、;cstring></p><p>  #include<conio.h></p><p>  #include<iostream></p><p>  #include<algorithm></p><p>  using namespace std;</p><p>  t

25、ypedef struct</p><p><b>  {</b></p><p>  unsigned int weight;</p><p>  unsigned int parent,lchild,rchild;</p><p>  } HTNode,*HuffmanTree;</p><p&g

26、t;  typedef char **HuffmanCode;</p><p>  typedef struct</p><p><b>  {</b></p><p>  unsigned int s1;</p><p>  unsigned int s2;</p><p><b> 

27、 }MinCode;</b></p><p>  void outputhuffmantree(HuffmanTree HT,unsigned int n);</p><p>  HuffmanTree inithuffmantree(unsigned int *w,unsigned int n);</p><p>  HuffmanCode huffm

28、antreecoding(HuffmanTree HT,HuffmanCode HC,unsigned int n);</p><p>  void Error(char *message);</p><p>  MinCode Select(HuffmanTree HT,unsigned int n);</p><p>  void destroyhuffmant

29、ree(HuffmanTree *ht);</p><p>  void Error(char *message)</p><p><b>  {</b></p><p>  fprintf(stderr,"Error:%s\n",message);</p><p><b>  exit(1

30、);</b></p><p><b>  }</b></p><p>  void destroyhuffmantree(HuffmanTree ht)</p><p><b>  {</b></p><p>  cout<<"-------------------

31、------------------------------------------------------------"<<endl;</p><p><b>  free(ht);</b></p><p>  printf("huffmantree destroied\n");</p><p>&l

32、t;b>  exit(1);</b></p><p><b>  }</b></p><p>  HuffmanCode huffmantreecoding(HuffmanTree HT,HuffmanCode HC,unsigned int n)</p><p><b>  {</b></p>

33、;<p><b>  char *cd;</b></p><p>  unsigned int i,start,c,f;</p><p>  HC=(HuffmanCode)malloc((n+1)*sizeof(char *));</p><p>  cd=(char *)malloc(n*sizeof(char *));<

34、;/p><p>  cd[n-1]='\0';</p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  start=n-1;</p><p>  for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[

35、f].parent)</p><p>  if(HT[f].lchild==c) cd[--start]='0';</p><p><b>  else</b></p><p>  cd[--start]='1';</p><p>  HC[i]=(char *)malloc((n-sta

36、rt)*sizeof(char *));</p><p>  strcpy(HC[i],&cd[start]);</p><p><b>  }</b></p><p><b>  free(cd);</b></p><p>  cout<<"-------------

37、------------------------------------------------------------------"<<endl;</p><p>  printf("Number\t\tWeight\t\tCode\n");</p><p>  for(i=1;i<=n;i++)</p><p> 

38、 printf("%d\t\t%d\t\t%s\n",i,HT[i].weight,HC[i]);</p><p>  return HC;</p><p><b>  }</b></p><p>  HuffmanTree inithuffmantree(unsigned int *w,unsigned int n)<

39、;/p><p><b>  {</b></p><p>  unsigned int i,s1=0,s2=0;</p><p>  HuffmanTree p,HT;</p><p>  unsigned int m;</p><p>  MinCode min;</p><p&g

40、t;  if(n<=1) Error("節(jié)點數(shù)量太少,創(chuàng)建失?。n");</p><p><b>  m=2*n-1;</b></p><p>  HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));</p><p><b>  if(!HT)</b><

41、;/p><p>  Error("無法創(chuàng)建哈夫曼樹,請查看磁盤空間是否足夠!");</p><p>  for(p=HT,i=0;i<=n;i++,p++,w++)</p><p><b>  {</b></p><p>  p->weight=*w;</p><p>

42、  p->parent=0;</p><p>  p->lchild=0;</p><p>  p->rchild=0;</p><p><b>  }</b></p><p>  for(;i<=m;i++,p++)</p><p><b>  {</b&

43、gt;</p><p>  p->weight=0;</p><p>  p->parent=0;</p><p>  p->lchild=0;</p><p>  p->rchild=0;</p><p><b>  }</b></p><p> 

44、 for(i=n+1;i<=m;i++)</p><p><b>  {</b></p><p>  min=Select(HT,i-1);</p><p>  s1=min.s1;</p><p>  s2=min.s2;</p><p>  HT[s1].parent=i;</p&

45、gt;<p>  HT[s2].parent=i;</p><p>  HT[i].lchild=s1;</p><p>  HT[i].rchild=s2;</p><p>  HT[i].weight=HT[s1].weight+HT[s2].weight;</p><p><b>  }</b><

46、;/p><p>  return HT;</p><p><b>  }</b></p><p>  MinCode Select(HuffmanTree HT,unsigned int n)</p><p><b>  {</b></p><p>  unsigned int

47、min,secmin;</p><p>  unsigned int temp;</p><p>  unsigned int i,s1,s2,tempi;</p><p>  MinCode code;</p><p><b>  s1=1;</b></p><p><b>  s2=

48、1;</b></p><p>  for(i=1;i<=n;i++)</p><p>  if(HT[i].parent==0)</p><p><b>  {</b></p><p>  min=HT[i].weight;</p><p><b>  s1=i;<

49、;/b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  tempi=i++;</p><p>  for(;i<=n;i++)</p><p><b>  {</b></p

50、><p>  if(HT[i].weight<min&&HT[i].parent==0)</p><p><b>  {</b></p><p>  min=HT[i].weight;</p><p><b>  s1=i;</b></p><p><

51、b>  }</b></p><p><b>  }</b></p><p>  for(i=tempi;i<=n;i++)</p><p><b>  {</b></p><p>  if(HT[i].parent==0&&i!=s1)</p>

52、<p><b>  {</b></p><p>  secmin=HT[i].weight;</p><p><b>  s2=i;</b></p><p><b>  break;</b></p><p><b>  }</b></p&g

53、t;<p><b>  }</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  if(HT[i].weight<secmin&&i!=s1&&HT[i].parent==0)</p>

54、<p><b>  {</b></p><p>  secmin=HT[i].weight;</p><p><b>  s2=i;</b></p><p><b>  }</b></p><p><b>  }</b></p>

55、<p><b>  if(s1>s2)</b></p><p><b>  {</b></p><p><b>  temp=s1;</b></p><p><b>  s1=s2;</b></p><p><b>  s2=t

56、emp;</b></p><p><b>  }</b></p><p>  code.s1=s1;</p><p>  code.s2=s2;</p><p>  return code;</p><p><b>  }</b></p><p

57、>  void outputhuffmantree(HuffmanTree HT,unsigned int n)</p><p><b>  {</b></p><p>  unsigned int i;</p><p>  printf("HT List:\n");</p><p>  p

58、rintf("Number\t\tweight\t\tparent\t\tlchild\t\trchild\n");</p><p>  cout<<"********************************************************************************"<<endl;</p>

59、<p>  for(i=n+1;i<=2*n-1;i++)</p><p>  printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);</p><p><b>  }</b></p>&l

60、t;p>  int main()</p><p><b>  {</b></p><p>  int code=0;</p><p>  HuffmanTree HT=NULL;</p><p>  HuffmanCode HC=NULL;</p><p>  unsigned int *w

61、=NULL;</p><p>  unsigned int i,n;</p><p><b>  P:</b></p><p>  system("color A");</p><p>  cout<<"※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

62、※"<<endl;</p><p>  cout<<"※ ※"<<endl;</p><p>  cout<<"※

63、 哈夫曼樹計算與編碼程序 ※"<<endl;</p><p>  cout<<"※ ※"<<endl;</p><p>  

64、cout<<"※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl<<endl;</p><p>  printf("請輸入節(jié)點的數(shù)量(大于1個):\n");</p><p>  scanf("%d",&n);</p><p&g

65、t;<b>  if(n==1)</b></p><p><b>  {</b></p><p>  system("CLS");</p><p>  printf("節(jié)點數(shù)太少,請重新輸入.....\n");</p><p>  for(int j=1;j&

66、lt;600000000;j++){;}</p><p>  system("CLS");</p><p><b>  goto P;</b></p><p><b>  }</b></p><p>  w=(unsigned int *)malloc((n+1)*sizeof(

67、unsigned int *));</p><p><b>  w[0]=0;</b></p><p>  printf("請輸入它們對應的權值:\n");</p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p>

68、<p>  printf("w[%d]=",i);</p><p>  scanf("%d",&w[i]);</p><p><b>  }</b></p><p>  sort(w+1,w+n+1);</p><p>  HT=inithuffmantree(

69、w,n);</p><p><b>  GP:</b></p><p>  system("CLS");</p><p>  cout<<"*******************************************************************************&qu

70、ot;<<endl;</p><p>  cout<<" 1.哈夫曼樹編碼 "<<endl;</p><p>  cout<<" 2.哈弗曼樹顯示

71、 "<<endl;</p><p>  cout<<" 3.摧毀哈夫曼樹并退出程序 "<<endl;</p><p>  cout<

72、;<" "<<endl;</p><p>  cout<<"**********************************************************************

73、*********"<<endl;</p><p>  cout<<"請輸入操作編碼:"<<endl;</p><p>  cin>>code;</p><p>  system("CLS");</p><p>  switch(code)<

74、;/p><p><b>  {</b></p><p><b>  case 1:</b></p><p><b>  {</b></p><p>  huffmantreecoding(HT,HC,n);</p><p>  system("PA

75、USE");</p><p>  cout<<endl<<endl;</p><p><b>  goto GP;</b></p><p><b>  break;</b></p><p><b>  }</b></p><

76、;p><b>  case 2:</b></p><p><b>  {</b></p><p>  outputhuffmantree(HT,n);</p><p>  system("PAUSE");</p><p>  cout<<endl<<

77、endl;</p><p><b>  goto GP;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 3:</b></p><p><

78、;b>  {</b></p><p>  destroyhuffmantree(HT);</p><p>  system("PAUSE");</p><p><b>  break;</b></p><p><b>  }</b></p><

79、;p><b>  default:</b></p><p><b>  {</b></p><p>  system("color A");</p><p>  cout<<"非法字符,請重新輸入"<<endl<<endl;</p>

80、;<p>  for(int j=0;j<700000000;j++){}</p><p>  system("CLS");</p><p><b>  goto GP;</b></p><p><b>  break;</b></p><p><b&g

81、t;  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  測試顯示結果</b></p><p>

82、;<b>  初始界面:</b></p><p><b>  輸入節(jié)點及權值:</b></p><p><b>  選擇界面:</b></p><p><b>  哈夫曼樹編碼界面:</b></p><p><b>  哈夫曼樹顯示:</b

83、></p><p><b>  退出界面:</b></p><p><b>  總結</b></p><p>  A:主要負責程序的設計和代碼的編輯。根據(jù)《數(shù)據(jù)結構-C語言版》 作者嚴蔚敏、吳偉民著一書的理論知識,以及章節(jié)后的偽代碼,我適合的更改,做出了課程設計中的作品。在打代碼的過程中,出現(xiàn)好多次錯誤,在網(wǎng)上查找,

84、得到解決。這次課程設計對數(shù)據(jù)結構有了更深的認識。</p><p>  B:主要負責文檔的編寫。這次的課程設計中,與王文忠配合,把課程設計的文檔寫出來。為了更好地展現(xiàn)我們的成果以及代碼,對于調試代碼的界面,我們以截圖的方式展現(xiàn)在文檔中,讓讀者更好地查看。</p><p>  C:主要負責文檔的編寫。在這次課程設計及中,學到了很多知識,還有很多知識還要現(xiàn)學。只要用心,就能學到自己想學的東西。&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論