數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 (赫夫曼編碼)_第1頁
已閱讀1頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  +</b></p><p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 </p><p><b>  題目:赫夫曼編碼</b></p><p>  院、 系:濱江學(xué)院</p><p>  學(xué)科專業(yè):計算機(jī)科學(xué)與技術(shù) </p><p>  學(xué) 生:

2、 </p><p>  學(xué) 號: </p><p>  指導(dǎo)教師: </p><p>  2010年12月22日</p><p><b>  目 錄</b></p><p>  1課程設(shè)計的題目------

3、-----------------------0</p><p>  2課程設(shè)計的目的(設(shè)計要解決的問題)----------1</p><p>  3概要設(shè)計(函數(shù)劃分、總體設(shè)計)----------------1</p><p>  4詳細(xì)設(shè)計(算法、流程圖、程序)-----------------2</p><p>  5調(diào)試結(jié)果---

4、----------------------- -------32</p><p>  6課程設(shè)計總結(jié)---------------- -------------33</p><p>  7心得體會----------------------------------34</p><p><b>  二課程設(shè)計的目的</b></p>

5、<p>  <1>鞏固構(gòu)造赫夫曼樹的算法。</p><p>  <2>設(shè)計實驗用程序?qū)崿F(xiàn)赫夫曼樹的構(gòu)造。</p><p>  <3>熟悉用先序、中序或后序的訪問方法得到個葉子結(jié)點的赫夫曼編碼。</p><p>  三概要設(shè)計(函數(shù)劃分、總體設(shè)計)</p><p><b>  <一

6、>總體設(shè)計</b></p><p>  輸入一個字符串用結(jié)構(gòu)體鏈表存儲字符串中出現(xiàn)的不同字符及其出現(xiàn)的次數(shù)。</p><p>  定義赫夫曼數(shù)的結(jié)點結(jié)構(gòu)體,把不同的字符及其在字符串中出現(xiàn)的次數(shù)作為葉子結(jié)點的元素及其權(quán)值,統(tǒng)計葉子結(jié)點的個數(shù)n,開辟可以存儲2*n個結(jié)點的順序表,來赫夫曼樹的各個結(jié)點,然后按照一定的規(guī)則構(gòu)造赫夫曼樹。</p><p> 

7、 開辟一個可以存儲葉子結(jié)點元素及指向存儲其赫夫曼編碼鏈表的指針的順序表,然后從葉子結(jié)點開始向上訪問,是左孩子的把“0”接進(jìn)鏈表是右孩子的把“1”接進(jìn)鏈表,直到根結(jié)點,然后把葉子結(jié)點的元素及存儲其赫夫曼鏈表的頭指針讀入順序表,直到把所有的葉子結(jié)點的元素及指向存儲其赫夫曼編碼鏈表的頭指針讀入順序表,這樣得到的赫夫曼編碼是倒序的。</p><p>  從存儲其葉子結(jié)點及指向存儲其赫夫曼編碼鏈表頭指針的順序表表頭開始順序

8、訪問各元素,在輸出其赫夫曼編碼之前,把鏈表中的編碼順序讀入到等長的棧中,然后編碼出棧就會得到順序的赫夫曼編碼,直到把所有的葉子結(jié)點都訪問到。</p><p>  用一個字符型的指針指向字符串的第一個字符,從存儲葉子結(jié)點元素及指向存儲其赫夫曼編碼鏈表的頭指針的順序表表頭開始訪問順序表中的各元素,直到找到葉子結(jié)點的元素和當(dāng)前字符相等就結(jié)束訪輸出赫夫曼編碼,回到表頭,指針后移,直到輸出字符串的最后一個字符的赫夫曼編碼,

9、這樣就得到輸入字符串的赫夫曼編碼。</p><p><b>  <二>函數(shù)劃分</b></p><p>  該程序有一個主函數(shù)和多個子函數(shù),主函數(shù)完成對子函數(shù)的調(diào)用,各子函數(shù)實現(xiàn)相應(yīng)的功能。</p><p><b>  子函數(shù):</b></p><p><b>  結(jié)點的開辟。

10、</b></p><p>  實現(xiàn)對輸入字符串中出現(xiàn)的不同字符及其出現(xiàn)字?jǐn)?shù)的信息記錄。</p><p>  用葉子結(jié)點構(gòu)造赫夫曼樹。</p><p>  獲得構(gòu)造的赫夫曼樹中所有葉子結(jié)點的元素及其赫夫曼編碼。</p><p>  輸出各葉子結(jié)點元素及其對應(yīng)的赫夫曼編碼。</p><p>  輸出輸入的字符串

11、的赫夫曼編碼。</p><p><b>  調(diào)用各子函數(shù)</b></p><p>  四詳細(xì)設(shè)計(算法、流程圖、程序)</p><p><b>  <一>算法</b></p><p>  <1>創(chuàng)建存儲葉子結(jié)點元素及其權(quán)值的鏈表</p><p>  定

12、義結(jié)構(gòu)體node,其數(shù)據(jù)成員包括,字符型的元素a和整型元素b和指向node的next指針,來存儲葉子結(jié)點的內(nèi)容和權(quán)值。</p><p>  定義三個指向node的指針head、p1、p2和字符指針n、t、h,調(diào)用setnode()函數(shù)開辟一個結(jié)點讓head指向該結(jié)點,p1=head,讓n指向輸入字符串的第一個元素,當(dāng)n指向的內(nèi)容不是‘\0’時,如果n指向字符串的第一個字符,則開辟一個結(jié)點,讓p2指向該結(jié)點,讓t指

13、向字符串的第一個元素,當(dāng)*t!=‘\0’并且*t==*n則r++(r為整型,初始值為0),把p2->a=*n,p2->b=r,p1->next=p2,p1=p2,n++,t回到字符串首;否則i++(i為整型,初始值為1)r=0,j=1;讓t指向字符串第一個元素,當(dāng)*t!=‘\0’,如果*t==*n,r++,t++;讓h指向字符串的第一個元素,當(dāng)h!=n時如果*h==*n就跳出此循環(huán),否則,j++,h++如果i==j則開

14、辟新的結(jié)點p2->a=*n,p2->b=r,p1->next=p2,p1=p2</p><p>  ;n++,當(dāng)把最后一個結(jié)點連入鏈表中,p1->next=NULL,然后把p1=head->next,當(dāng)p!=NULL時輸出結(jié)點中葉子結(jié)點的元素和對應(yīng)的權(quán)值;最后返回head。</p><p>  //setnode()函數(shù)的算法:設(shè)指向node的指針p,用mal

15、loc開辟一個node結(jié)點并讓p指向該結(jié)點,返回p。</p><p><b>  <2>構(gòu)造赫夫曼樹</b></p><p>  定義結(jié)構(gòu)體node1,其數(shù)據(jù)項字符型a(存放葉子結(jié)點元素)、整型weight(存放對應(yīng)權(quán)值)、整型sign(起標(biāo)記作用)、和指向左、右孩子及父母結(jié)點的指針lchild、rchild和parent。</p><

16、p>  定義指向node1的指針p0、p1、p2、p3、p4和整型的m、n、i、j、k1、k2,n=0、p=head->next,當(dāng)p!=NULL,n++,p=p->next,開辟可以存儲2*n個node1的順序表,讓p0指向表頭,p1=p0,p=head->next,當(dāng)p!=NULL時p1->a=p->a,p1->weight=p->b</p><p>  p1的

17、指向左、右孩子及父母的指針指空,p=p->next,p1++;p1++,p=p->next;i=1,當(dāng)i<=n-1,j=0,當(dāng)j<2,如果j==0把‘‘1’賦給k1;否則把‘1’賦給k2;p2=p0,當(dāng)p2!=p1時,如果p2->sign==NULL并且m=p2->weight用break結(jié)束循環(huán)否則p2++;p2=p0,當(dāng)p2!=p時,如果m>=p2->weight并且p2->si

18、gn==NULL,把p2->weight賦給m,否則p2++;把p0賦給p2,當(dāng)p2不等于p1時,如果m等于p2->weight并且p2->sign等于NULL,把‘1’賦給p2->sign,如果j=0,把p2賦給p1->lchild,p2->weight賦給p1->weight,p1賦給p2->parent,用break結(jié)束循環(huán);如果j==1,則把p2賦給p1->rchild,p1

19、->weight加p2->weight賦給p1->weight,p1賦給p2->parent,用break結(jié)束循環(huán);如果j等于0,k1++,p2++;如果j等于1,k2++,p2++;j++;如果k1大于k2把p1->lc</p><p>  NULL,p1++,i++;然后p--,把p1->parent=NULL,p1++,把p0賦給p2,當(dāng)p2不等于p時輸出p2的各數(shù)據(jù)項,

20、拍p2++;返回p0。</p><p>  <3>獲得各葉子結(jié)點的赫夫曼編碼</p><p>  定義只存儲赫夫曼編碼的結(jié)構(gòu)體code,它的數(shù)據(jù)項有字符型的a(存儲‘0’、‘1’編碼)以及指向下一個結(jié)點的指針next。</p><p>  定義結(jié)構(gòu)體huffmancode,它的數(shù)據(jù)項有字符型a(存儲葉子結(jié)點元素)、指向結(jié)構(gòu)體code的指針head。<

21、;/p><p>  設(shè)指向node1的指針p1、p2、p4,指向huffmancode的指針l、l1和指向code的指針h、h1,把p(p為函數(shù)的形參)賦給p2,當(dāng)p2->lchild和p2->rchild同時為NULL,n++,(n為整型,初始化為零),p2++;調(diào)用malloc函數(shù)開辟可以存儲n+1個huffmancode結(jié)點的順序表,讓l指向該順序表的表頭,把l賦給l1,把p賦給p4,當(dāng)p4->

22、;lchild和p4->rchild同時為NULL把p4賦給p1調(diào)用setcode()函數(shù)開辟一個結(jié)點讓h1指向該結(jié)點,把h1賦給l1->head,當(dāng)p1->parent不等以NULL時,如果p1等于p1->parent->lchild,調(diào)用setcode()函數(shù)讓h指向它,h->a=‘0’,h1->next=h,h1=h;否則,調(diào)用setcode()函數(shù)開辟一個結(jié)點讓h指向它,h->a=

23、‘1’,h1->next=h,h1=h;然后,把p1->parent賦給p1,把NULL賦給h1->next,p4->a賦給l1->a,l++,當(dāng)把所有的葉子結(jié)點元素及其赫夫曼編碼讀入順序表后把NULL賦給l1->a;返回l。</p><p>  //setcode()函數(shù)的算法:設(shè)指向code的指針p,調(diào)用malloc()函數(shù)開辟一個code結(jié)點,讓p指向該結(jié)點,返回p。&l

24、t;/p><p>  <4>輸出各葉子結(jié)點的赫夫曼編碼</p><p>  設(shè)指向huffmancode的指針p,指向code的指針和指向字符型的指針base、top;把head1(函數(shù)的形參)賦給p,當(dāng)p->a!=NULL時,把0賦給n,p->head->next賦給h,當(dāng)h!=NULL時n++,h=h->next,開辟一個可以存儲n+1個字符的棧,讓ba

25、se指向棧底,top=base,把h=p->head->next,當(dāng)h!=NULL時,*top=h->a,top++,h=h->next;top--,當(dāng)to不等于base時,輸出*top,top- -;輸出*top;p++。</p><p>  <5>輸出字符串的赫夫曼編碼</p><p>  設(shè)指向huffmancode的指針p1,指向code的指針h

26、和指向字符型的指針base,top,p2,讓p2指向字符串的第一個元素,當(dāng)*p2!=‘\0’時,輸出*p2,p2++;當(dāng)*p!=‘\0’時(p為函數(shù)的形參),把0賦給n(n為整型)p1=p0(p0為形參)當(dāng)p1->a!=NULL時,如果p1->a等于*p把p1->head->next賦給h,當(dāng)h!=NULL時,h=h->next,base指向可以存儲n+1個字符的棧底,top=base,把p1->he

27、ad->next賦給h,當(dāng)h!=NULL,*top=h->a,top++,h=h->next,top自減,當(dāng)top!=base,輸出*top,top--,輸出*top,用break結(jié)束循環(huán),p++。</p><p>  <6>control函數(shù)</p><p>  定義長度為20的字符數(shù)組a,指向node的指針p,整型n和指向node1的指針p1,輸入a把a(bǔ)作

28、為實參調(diào)用函數(shù)getdata(a),把返回值賦給p,把p作為實參調(diào)用coutdata(p)把返回值賦給n,如果n等于1,p=p->next,輸出p->a和p->b,否則,以p為實參調(diào)用settree(p),將返回值賦給p1,以p1為實參調(diào)用gethuffmamcode(p1)函數(shù),將返回值賦給p2(p2為指向huffmancode的指針),以p2為實參調(diào)用printhuffmancode(p1)函數(shù),然后以a,p2為實

29、參調(diào)用print(a,p2)函數(shù)。</p><p>  //coutdata()函數(shù)的算法:設(shè)指向node的指針p,把head->next賦給p,當(dāng)p!=NULL時n++,p=p->next;返回n。</p><p><b>  <7>主函數(shù)</b></p><p>  調(diào)用control()函數(shù)。</p>

30、<p><b>  <二>流程圖</b></p><p>  創(chuàng)建存儲葉子結(jié)點元素及其權(quán)值的鏈表</p><p>  //setnode函數(shù)</p><p><b>  構(gòu)造赫夫曼樹 </b></p><p>  <3>獲得各葉子結(jié)點的赫夫曼編碼</p>

31、;<p>  //setcode函數(shù)</p><p>  <4>輸出各葉子結(jié)點的赫夫曼編碼</p><p>  <5>輸出字符串的赫夫曼編碼</p><p>  <6>control函數(shù)</p><p>  //countdata()函數(shù)</p><p><b&g

32、t;  <7>主函數(shù)</b></p><p>  //程序的編譯環(huán)境是Visual studio 2010</p><p>  //把統(tǒng)計葉子結(jié)點元素和權(quán)值的函數(shù)放在“計算權(quán)值.h”中</p><p>  #include<iostream></p><p>  using namespace std;&l

33、t;/p><p>  typedef struct node //存儲葉子結(jié)點元素及其權(quán)值的結(jié)構(gòu)體</p><p><b>  {</b></p><p>  char a; //葉子結(jié)點的元素</p><p>  int b;

34、 //葉子結(jié)點的權(quán)值</p><p>  struct node *next; //指向下一個結(jié)點的指針</p><p>  }*listnode;</p><p>  listnode setnode() //開辟結(jié)點的函數(shù)</p><p><b>  {

35、</b></p><p>  listnode p;</p><p>  p=(listnode)malloc(sizeof(node));</p><p><b>  return p;</b></p><p><b>  }</b></p><p>  lis

36、tnode getdata(char *a) /*統(tǒng)計輸入字符串中的不同字符及其出現(xiàn)的次數(shù)的函并且把統(tǒng)計出的數(shù)據(jù),作為葉子結(jié)點的元素和權(quán)值*/</p><p><b>  {</b></p><p>  listnode head,p1,p2;</p><p>  char *n,*t,*h;</p><

37、p>  int i=1,j=1,r=0;</p><p>  head=setnode();</p><p><b>  p1=head;</b></p><p>  for(n=a;*n!='\0';n++)</p><p><b>  {</b></p>&l

38、t;p><b>  if(n==a)</b></p><p><b>  {</b></p><p>  p2=setnode();</p><p>  for(t=n;*t!='\0';t++) //統(tǒng)計相同的字符在字符串中出現(xiàn)的次數(shù)</p><p&g

39、t;  if(*t==*n)</p><p><b>  r++;</b></p><p><b>  p2->a=*n;</b></p><p><b>  p2->b=r;</b></p><p>  p1->next=p2;</p><

40、;p><b>  p1=p2;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  i++;</b></p>

41、;<p><b>  r=0;</b></p><p><b>  j=1;</b></p><p>  for(t=a;*t!='\0';t++)</p><p>  if(*t==*n)</p><p><b>  r++;</b></p

42、><p>  for(h=a;h!=n;h++)</p><p><b>  {</b></p><p>  if(*h==*n)</p><p><b>  break;</b></p><p><b>  else</b></p><

43、p><b>  j++;</b></p><p><b>  }</b></p><p><b>  if(i==j)</b></p><p><b>  {</b></p><p>  p2=setnode();

44、 //調(diào)用setnode()函數(shù)開辟結(jié)點</p><p><b>  p2->a=*n;</b></p><p><b>  p2->b=r;</b></p><p>  p1->next=p2;</p><p><b>  p1=p2;</b

45、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  p1->next=NULL;</p><p>  cout<<"電文的長度為

46、:"<<i<<endl;</p><p>  cout<<"------------------------------------------------"<<endl;</p><p><b>  p1=head;</b></p><p>  cout<&l

47、t;"葉子結(jié)點"<<"\t"<<"權(quán)值"<<endl;</p><p>  for(p1=p1->next;p1!=NULL;p1=p1->next)</p><p>  cout<<p1->a<<"\t\t "<<p1

48、->b<<endl;</p><p>  cout<<"------------------------------------------------"<<endl;</p><p>  return head;</p><p><b>  }</b></p><

49、;p>  int coutdata(listnode head) //統(tǒng)計葉子結(jié)點的個數(shù)</p><p><b>  {</b></p><p>  listnode p;</p><p><b>  int n=0;</b></p><p>  

50、for(p=head->next;p!=NULL;p=p->next)</p><p><b>  n++;</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  //把構(gòu)造赫夫曼樹的函數(shù)放在頭文

51、件“構(gòu)造赫夫曼樹.h”中</p><p>  #include<iostream></p><p>  #include"計算權(quán)值.h"</p><p>  using namespace std;</p><p>  typedef struct node1 //赫

52、夫曼樹的結(jié)點結(jié)構(gòu)體</p><p>  { </p><p>  char a; //結(jié)點元素</p><p>  int weight,sign; //結(jié)點的權(quán)值

53、和結(jié)點的標(biāo)記</p><p>  struct node1 *parent,*lchild,*rchild; //指向父母結(jié)點和左、右孩子的指針</p><p>  }*listnode1; //指向node1的指針</p><p>  listnode1 settree(listnode hea

54、d) //構(gòu)造赫夫曼樹的函數(shù)</p><p><b>  {</b></p><p>  listnode p;</p><p>  listnode1 p0,p1,p2;</p><p>  int m,n,i,j,k1,k2; </p><p>  struct nod

55、e1 *p3,*p4;</p><p><b>  n=0;</b></p><p>  for(p=head->next;p!=NULL;p=p->next)</p><p><b>  n++;</b></p><p>  p0=(listnode1)malloc(2*n*sizeo

56、f(node1)); //開辟可以存儲2n個赫夫曼樹結(jié)點的順序表</p><p><b>  p1=p0;</b></p><p>  for(p=head->next;p!=NULL;p=p->next) //把葉子結(jié)點的信息讀入到 順序表中</p><p><b

57、>  {</b></p><p>  p1->a=p->a;</p><p>  p1->weight=p->b;</p><p>  p1->lchild=NULL;</p><p>  p1->parent=NULL;</p><p>  p1->rchi

58、ld=NULL;</p><p>  p1->sign=NULL;</p><p><b>  p1++;</b></p><p><b>  }</b></p><p>  for(i=1;i<=n-1;i++) <

59、/p><p><b>  {</b></p><p>  for(j=0;j<2;j++)</p><p><b>  {</b></p><p><b>  if(j==0)</b></p><p>  k1=1; </p>

60、<p>  else if(j==1) k2=1; </p><p>  for(p2=p0;p2!=p1;p2++)</p><p>  if(p2->sign==NULL)</p><p><b>  {</b></p><p>  m=p2->weight;</p>

61、<p><b>  break;</b></p><p><b>  }</b></p><p>  for(p2=p0;p2!=p1;p2++)</p><p>  if(m>=p2->weight)</p><p>  if(p2->sign==NULL)</

62、p><p>  m=p2->weight;</p><p>  for(p2=p0;p2!=p1;p2++)</p><p><b>  {</b></p><p>  if(m==p2->weight)</p><p>  if(p2->sign==NULL)</p>

63、<p><b>  {</b></p><p>  p2->sign=1;</p><p>  if(j==0) //把先找到的權(quán)值最小的作為左孩子</p><p><b>  {</b></p><p>  p1->lchild=

64、p2;</p><p>  p1->weight=p2->weight;</p><p>  p2->parent=p1;</p><p><b>  }</b></p><p>  else if(j==1) //把后找到的權(quán)值最小的最為右孩子</p>&

65、lt;p><b>  {</b></p><p>  p1->rchild=p2;</p><p>  p1->weight=p1->weight+p2->weight;</p><p>  p2->parent=p1;</p><p><b>  }</b>&l

66、t;/p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(j==0) </p><p>  k1++; //標(biāo)記先找到的權(quán)值最小的結(jié)點在順序表中的位置</p><

67、;p>  else if(j==1) </p><p>  k2++; //標(biāo)記后找到的權(quán)值最小的結(jié)點在順序表中的位置</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k1>k2)

68、 /*如果先找到的權(quán)值最小的結(jié)點在順序表中的位置在后找到的后面 </p><p>  { 則他們父母結(jié)點的左右孩子指針交換*/ </p><p>  p3=p1->lchild;</p><p>  p4=p1->rchild;</p><p>

69、;  p1->lchild=p4;</p><p>  p1->rchild=p3;</p><p>  } </p><p>  p1->sign=NULL;</p><p><b>  p1++;</b></p><p><b

70、>  }</b></p><p><b>  p1--;</b></p><p>  p1->parent=NULL;</p><p><b>  p1++;</b></p><p><b>  p2=p0;</b></p><p&g

71、t;  cout<<"葉子結(jié)點"<<"\t"<<"權(quán)值"<<"\t"<<"左孩子"<<"\t\t"<<"父母結(jié)點"<<"\t"<<"右孩子"<&l

72、t;endl; //輸出構(gòu)造的赫夫曼樹</p><p>  while(p2!=p1)</p><p><b>  {</b></p><p>  cout<<p2->a<<"\t\t "<<p2->we

73、ight<<"\t"<<p2->lchild<<"\t"<<p2->parent<<"\t"<<p2->rchild<<endl;</p><p><b>  p2++;</b></p><p><b&

74、gt;  }</b></p><p>  cout<<"------------------------------------------------"<<endl;</p><p>  return p0;</p><p><b>  }</b></p><p>

75、;  //把葉子結(jié)點赫夫曼編碼的獲取的函數(shù)放在頭文件“獲得赫夫曼編碼.h”中</p><p>  #include<iostream></p><p>  #include"構(gòu)造赫夫曼樹.h"</p><p>  using namespace std;</p><p>  typedef struct cod

76、e //存儲赫夫曼編碼的結(jié)構(gòu)體</p><p><b>  { </b></p><p>  char a; //存儲‘0’、‘1’編碼</p><p>  struct code *next; //指向鏈表下一個結(jié)點的指針

77、</p><p>  }*listcode; //指向該結(jié)構(gòu)體的指針</p><p>  typedef struct huffmancode //存儲葉子結(jié)點元素和赫夫曼編碼鏈表的頭指針的結(jié)構(gòu)體</p><p><b>  {</b></p><p>

78、  char a; //葉子結(jié)點的元素</p><p>  listcode head; //指向存儲赫夫曼編碼鏈表的指針</p><p>  }*listhuffmancode; </p><p>  listcode setcode()

79、 //開辟存儲‘0’、‘1’編碼結(jié)點的函數(shù)</p><p><b>  {</b></p><p>  listcode p;</p><p>  p=(listcode)malloc(sizeof(code));</p><p><b>  return p;</b>&l

80、t;/p><p><b>  }</b></p><p>  listhuffmancode gethuffmancode(listnode1 p) //把得到的葉子結(jié)點及其{ 赫夫曼編碼存到順序表中的函數(shù)</p><p>

81、;  listnode1 p1,p2,p4;</p><p><b>  int n=0;</b></p><p>  listhuffmancode l,l1;</p><p>  listcode h,h1;</p><p>  for(p2=p;p2->lchild==NULL&&p2->

82、;rchild==NULL;p2++)</p><p><b>  n++;</b></p><p>  l=(listhuffmancode)malloc((n+1)*sizeof(huffmancode)); //開辟可以存儲n+1個葉子結(jié)點信息的順序表 </p><p><b>

83、  l1=l;</b></p><p>  for(p4=p;p4->lchild==NULL&&p4->rchild==NULL;p4++)</p><p><b>  {</b></p><p><b>  p1=p4;</b></p><p>  h1=

84、setcode();</p><p>  l1->head=h1; </p><p>  for(;p1->parent!=NULL;p1=p1->parent)</p><p><b>  {</b></p><p>  if(p1==p1->parent->lchild)&l

85、t;/p><p><b>  {</b></p><p>  h=setcode();</p><p><b>  h->a='0';</b></p><p>  h1->next=h;</p><p><b>  h1=h;</b&g

86、t;</p><p><b>  }</b></p><p>  else if(p1==p1->parent->rchild)</p><p><b>  {</b></p><p>  h=setcode();</p><p><b>  h->

87、;a='1';</b></p><p>  h1->next=h;</p><p><b>  h1=h;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  h1

88、->next=NULL;</p><p>  l1->a=p4->a;</p><p><b>  l1++;</b></p><p><b>  }</b></p><p>  l1->a=NULL;</p><p><b>  retur

89、n l;</b></p><p><b>  }</b></p><p>  //把輸出赫夫曼編碼的函數(shù)放在頭文件““輸出赫夫曼編碼.h”中</p><p>  #include<iostream></p><p>  #include"獲得赫夫曼編碼.h"</p>

90、<p>  using namespace std;</p><p>  void printhuffmancode(listhuffmancode head1) //輸出葉子結(jié)點及其赫夫曼編碼{ 的函數(shù)</p><p>  listhuffmancode p;

91、</p><p><b>  p=head1;</b></p><p>  listcode h;</p><p><b>  int n;</b></p><p>  char *base,*top;</p><p>  cout<<"葉子結(jié)點&quo

92、t;<<"\t"<<"權(quán)值"<<endl;</p><p>  for(p=head1;p->a!=NULL;p++)</p><p><b>  {</b></p><p>  cout<<p->a<<"\t\t &quo

93、t;;</p><p><b>  n=0;</b></p><p>  h=p->head;</p><p>  for(h=h->next;h!=NULL;h=h->next)</p><p><b>  n++;</b></p><p>  base=

94、(char *)malloc((n+1)*sizeof(char));</p><p><b>  top=base;</b></p><p>  h=p->head;</p><p>  for(h=h->next;h!=NULL;h=h->next)</p><p><b>  {<

95、/b></p><p>  *top=h->a;</p><p><b>  top++;</b></p><p><b>  }</b></p><p><b>  top--;</b></p><p>  for(;top!=base;t

96、op--)</p><p>  cout<<*top;</p><p>  cout<<*top;</p><p>  cout<<endl;</p><p><b>  }</b></p><p>  cout<<"-----------

97、-------------------------------------"<<endl;</p><p><b>  }</b></p><p>  void print(char *p,listhuffmancode p0) //輸出輸入字符串的赫夫曼編碼</p><p><b>

98、;  {</b></p><p>  listhuffmancode p1;</p><p>  listcode h;</p><p><b>  int n;</b></p><p>  char *base,*top,*p2;</p><p>  cout<<&quo

99、t;電文內(nèi)容:";</p><p>  for(p2=p;*p2!='\0';p2++)</p><p>  cout<<*p2;</p><p>  cout<<endl;</p><p>  cout<<"電文的赫夫曼編碼:";</p><

100、;p>  for(;*p!='\0';p++)</p><p><b>  {</b></p><p><b>  n=0;</b></p><p>  for(p1=p0;p1->a!=NULL;p1++)</p><p>  if(p1->a==*p)</

101、p><p><b>  {</b></p><p>  h=p1->head;</p><p>  for(h=h->next;h!=NULL;h=h->next)</p><p><b>  n++;</b></p><p>  base=(char *)ma

102、lloc((n+1)*sizeof(char));</p><p><b>  top=base;</b></p><p>  h=p1->head;</p><p>  for(h=h->next;h!=NULL;h=h->next)</p><p><b>  {</b><

103、;/p><p>  *top=h->a;</p><p><b>  top++;</b></p><p><b>  }</b></p><p>  for(--top;top!=base;top--)</p><p>  cout<<*top;</p&

104、gt;<p>  cout<<*top;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

105、<p>  //把control函數(shù)放在頭文件“控制函數(shù).h”中</p><p>  #include<iostream></p><p>  #include"輸出赫夫曼編碼.h"</p><p>  using namespace std;</p><p>  void control()

106、 //調(diào)用各個功能函數(shù)</p><p><b>  {</b></p><p>  cout<<" 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計"<<endl;</p><p>  cout<<"--------

107、----------------------------------------"<<endl;</p><p>  char a[20];</p><p><b>  int n;</b></p><p>  cout<<"接受到的電文內(nèi)容(不超過20個字符):";</p>

108、<p><b>  cin>>a;</b></p><p>  listnode p;</p><p>  p=getdata(a);</p><p>  n=coutdata(p);</p><p>  if(n==1) //如果只有一個葉子結(jié)點,說明該葉子結(jié)點就是根結(jié)點,無法構(gòu)造赫夫

109、曼樹</p><p><b>  {</b></p><p>  p=p->next;</p><p>  cout<<"該樹只有一個葉子結(jié)點即根結(jié)點(根結(jié)點沒有赫夫曼編碼)>>"<<endl;</p><p>  cout<<"根結(jié)點&

110、quot;<<"\t\t"<<"權(quán)值"<<endl;</p><p>  cout<<p->a<<"\t\t "<<p->b<<endl;</p><p>  cout<<"-------------------

111、-----------------------------"<<endl;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  listnode1 p1;<

112、/p><p>  p1=settree(p);</p><p>  listhuffmancode p2;</p><p>  p2=gethuffmancode(p1);</p><p>  printhuffmancode(p2);</p><p>  print(a,p2);</p><p>

113、<b>  }</b></p><p>  cout<<endl<<"程序結(jié)束................"<<endl;</p><p><b>  }</b></p><p>  //主函數(shù)放在源文件“赫夫曼編碼.cpp“中</p><p&

114、gt;  #include<iostream></p><p>  #include"控制函數(shù).h"</p><p>  using namespace std;</p><p>  void main()</p><p><b>  {</b></p><p> 

115、 control(); //調(diào)用control函數(shù)</p><p><b>  }</b></p><p><b>  五調(diào)試結(jié)果 </b></p><p><b>  六課程設(shè)計總結(jié)</b></p><p>  本次課程設(shè)計的目的是:把一個隨機(jī)輸入

116、的字符串中不同字符作為葉子結(jié)點元素,把其在該字符串中出現(xiàn)的次數(shù)作為權(quán)值構(gòu)造一個赫夫曼樹,并得到各個葉子結(jié)點的赫夫曼編碼和整個輸入的字符串的赫夫曼編碼。在寫代碼前,首先,對問題進(jìn)行了分析,明確了目標(biāo),列出了大的框架,然后逐漸細(xì)化,劃分出不同的功能模塊,由具體的子函數(shù)去實現(xiàn),先在紙上編寫代碼,寫好后進(jìn)行了反復(fù)的邏輯推理,發(fā)現(xiàn)并解決邏輯問題,然后,上機(jī)調(diào)試,方法是:一個一個功能模塊分開進(jìn)行調(diào)試,主要看調(diào)試的模塊能否達(dá)到預(yù)期的結(jié)果,這樣可以縮小

117、排錯的范圍,便以糾錯和提高編程的效率,當(dāng)每個功能模塊都調(diào)試好后,就把各個部分組合起來,再進(jìn)行調(diào)試,主要檢查各函數(shù)接口是否正確,當(dāng)達(dá)到預(yù)期的結(jié)果,調(diào)試結(jié)束,編程部分完成,然后按實驗要求完成實驗報告。</p><p>  由于寫代碼前做了充分的準(zhǔn)備工作,所以寫起代碼來比較順利,使編程的效率有不少的提高并且最終達(dá)到實驗預(yù)期的結(jié)果。</p><p><b>  七心得體會</b&g

118、t;</p><p>  每一次的課程設(shè)計對我來說都是一個不小的提高,哲學(xué)上說:“實踐是檢驗真理正確性的唯一標(biāo)準(zhǔn)”,尤其是學(xué)編程,自己不動手操作,只看書永遠(yuǎn)都編不出像Windows之類的東西,正如老師說的那樣,課程設(shè)計非常鍛煉人,每完成一個項目,不僅是知識體系的完善和知識的驗證,更是編程技術(shù)的提升,當(dāng)自己編的多了,就會開始摸索編程的捷徑,想著用更高效的方法去完成一個個項目,就這樣在一次次的鍛煉中自己會從一個菜鳥迅

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論