數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(赫夫曼編碼)_第1頁(yè)
已閱讀1頁(yè),還剩20頁(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>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b>  哈夫曼編碼</b></p><p>  學(xué) 院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p>  專(zhuān) 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  學(xué) 生: </p

2、><p>  學(xué) 號(hào): </p><p>  指導(dǎo)教師: </p><p>  2013年4月16日</p><p><b>  目錄</b></p><p>  課程設(shè)計(jì)的目的、功能及要求--------------1</p>

3、<p>  主要功能模塊流程圖----------------------2</p><p>  算法的基本思想--------------------------3</p><p>  系統(tǒng)測(cè)試--------------------------------6</p><p>  結(jié)論-----------------------------------

4、-7</p><p>  源程序----------------------------------8</p><p>  一、課程設(shè)計(jì)的目的、功能及要求</p><p><b>  目的:</b></p><p>  解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力; </p><p&

5、gt;  件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能; </p><p>  .合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力; </p><p>  用系統(tǒng)的觀點(diǎn)和軟件開(kāi)發(fā)一般規(guī)范進(jìn)行軟件開(kāi)發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。</p><p><b>  功能:</b></p><p&

6、gt;  1首先讀入待壓縮源文件; </p><p>  2然后建立并分析字母表,對(duì)每種字符的出現(xiàn)頻度進(jìn)行統(tǒng)計(jì),以頻度作為建立Huffman 樹(shù)的權(quán)值; </p><p>  3頻度表建好后,就可以根據(jù)算法建立Huffman 樹(shù),對(duì)出現(xiàn)的每種字符進(jìn)行Huffman編碼; </p><p>  4此時(shí),再次讀入源文件,逐字節(jié)編碼,將得到的編碼流寫(xiě)入到磁盤(pán)文件,并

7、且計(jì)算壓縮率。</p><p><b>  要求:</b></p><p>  1、核心數(shù)據(jù)結(jié)構(gòu)用到的結(jié)構(gòu)體要采用動(dòng)態(tài)內(nèi)存分配和鏈表結(jié)構(gòu)。 </p><p>  2 、不同的功能使用不同的函數(shù)實(shí)現(xiàn)(模塊化),對(duì)每個(gè)函數(shù)的功能和調(diào)用接口要注釋清楚。對(duì)程序其它部分也進(jìn)行必要的注釋。 </p><p>  3 、對(duì)系統(tǒng)進(jìn)行

8、功能模塊分析、畫(huà)出總流程圖和各模塊流程圖。 </p><p>  、用戶界面要求使用方便、簡(jiǎn)潔明了、美觀大方、格式統(tǒng)一。 </p><p>  所有程序需調(diào)試通過(guò)。 </p><p>  二、主要功能模塊流程圖</p><p><b>  三、算法的基本思想</b></p><p> ?。?

9、)構(gòu)造Hufffman樹(shù)的方法—Hufffman算法</p><p>  構(gòu)造Huffman樹(shù)步驟:</p><p>  根據(jù)給定的n個(gè)權(quán)值{w1,w2,……wn},構(gòu)造n棵只有根結(jié)點(diǎn)的二叉樹(shù),令起權(quán)值為wj。</p><p>  在森林中選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹(shù)作左右子樹(shù),構(gòu)造一棵新的二叉樹(shù),置新二叉樹(shù)根結(jié)點(diǎn)權(quán)值為其左右子樹(shù)根結(jié)點(diǎn)權(quán)值之和</p>

10、<p>  在森林中刪除這兩棵樹(shù),同時(shí)將新得到的二叉樹(shù)加入森林中。</p><p>  重復(fù)上述兩步,直到只含一棵樹(shù)為止,這棵樹(shù)即哈夫曼樹(shù)。</p><p> ?。?)Huffman編碼:數(shù)據(jù)通信用的二進(jìn)制編碼</p><p>  思想:根據(jù)字符出現(xiàn)頻率編碼,使電文總長(zhǎng)最短</p><p>  編碼:根據(jù)字符出現(xiàn)頻率構(gòu)造Huffma

11、n樹(shù),然后將樹(shù)中結(jié)點(diǎn)引向其左孩子的分支標(biāo)“0”,引向其右孩子的分支標(biāo)“1”;每個(gè)字符的編碼即為從根到每個(gè)葉子的路徑上得到的0、1序列。</p><p><b>  流程圖:</b></p><p><b>  部分程序:</b></p><p><b>  構(gòu)造哈夫曼樹(shù)</b></p>

12、<p>  void HaffmanTree(HNodeType HuffNode[MAXNODE]) </p><p><b>  {</b></p><p>  int i,j,m1,m2,x1,x2;</p><p>  for(i=0;i<MAXNODE;i++)</p><

13、;p><b>  {</b></p><p>  HuffNode[i].parent=-1;</p><p>  HuffNode[i].lchild=-1;</p><p>  HuffNode[i].rchild=-1;</p><p><b>  }</b></p>&l

14、t;p>  for(i=0;i<num-1;i++)</p><p><b>  {</b></p><p>  m1=m2=MAXVALUE;</p><p><b>  x1=x2=0;</b></p><p>  for(j=0;j<num+i;j++)</p>

15、<p><b>  {</b></p><p>  if(HuffNode[j].parent==-1&&HuffNode[j].weight<m1)</p><p><b>  {</b></p><p><b>  m2=m1;</b></p>&l

16、t;p><b>  x2=x1;</b></p><p>  m1=HuffNode[j].weight;</p><p><b>  x1=j;</b></p><p><b>  }</b></p><p><b>  else</b></

17、p><p>  if(HuffNode[j].parent==-1&&HuffNode[j].weight<m2)</p><p><b>  {</b></p><p>  m2=HuffNode[j].weight;</p><p><b>  x2=j;</b></p&

18、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  HuffNode[x1].parent=num+i;</p><p>  HuffNode[x2].parent=num+i;</p><p>  HuffNode[num+i].weig

19、ht=HuffNode[x1].weight+HuffNode[x2].weight;</p><p>  HuffNode[num+i].lchild=x1;</p><p>  HuffNode[num+i].rchild=x2;</p><p><b>  }</b></p><p><b>  }<

20、;/b></p><p><b>  (2)哈夫曼編碼</b></p><p>  LinkList Bianma(LinkList l,Code code[MAXNODE]) //寫(xiě)編碼文件</p><p><b>  {</b></p><p>  LinkList p,q,p1,p2;

21、</p><p><b>  int i,j;</b></p><p>  p=l->next ;</p><p>  q=new LNode;</p><p>  q->next=NULL;</p><p>  p1=new LNode;</p><p>&l

22、t;b>  p2=q;</b></p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  for(i=0;i<num;i++)</p><p>  if(p->data==code[i].data)</p&

23、gt;<p><b>  { </b></p><p><b>  j=0;</b></p><p>  while(code[i].bit[j]!='\0')</p><p><b>  {</b></p><p>  p1->data

24、=code[i].bit[j];</p><p><b>  j++;</b></p><p>  p2->next=p1;</p><p><b>  p2=p1;</b></p><p>  p1=new LNode;</p><p><b>  }<

25、;/b></p><p><b>  }</b></p><p>  p=p->next ;</p><p><b>  }</b></p><p>  p2->next=NULL;</p><p><b>  return q;</b>

26、;</p><p><b>  }</b></p><p>  SeqStack Init()</p><p><b>  {</b></p><p>  SeqStack s;</p><p>  s=new StackNode;</p><p> 

27、 s->top=-1;</p><p><b>  return s;</b></p><p><b>  }</b></p><p>  void HaffmanCode(HNodeType HuffNode[MAXNODE],HCodeType HuffCode[MAXLEAF]) //哈夫曼編碼算法</p

28、><p><b>  {</b></p><p>  int i,j,c,p;</p><p>  HCodeType cd;</p><p>  for(i=0;i<num;i++)</p><p><b>  {</b></p><p>  cd

29、.start=MAXBIT-1;</p><p><b>  c=i;</b></p><p>  p=HuffNode[c].parent ;</p><p>  while(p!=-1)</p><p><b>  {</b></p><p>  if(HuffNode[

30、p].lchild==c)</p><p>  cd.bit[cd.start]='0';</p><p><b>  else</b></p><p>  cd.bit[cd.start]='1';</p><p>  cd.start --;</p><p>&

31、lt;b>  c=p;</b></p><p>  p=HuffNode[c].parent;</p><p><b>  }</b></p><p>  for(j=cd.start+1;j<MAXBIT;j++)</p><p>  HuffCode[i].bit[j]=cd.bit[j];&

32、lt;/p><p>  HuffCode[i].start=cd.start ;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  四、系統(tǒng)測(cè)試</b></p><p><b>  1、主界

33、面</b></p><p><b>  2、輸入并保存編碼</b></p><p><b>  五、結(jié)論</b></p><p>  本次課程設(shè)計(jì)的目的是:把一個(gè)隨機(jī)輸入的字符串中不同字符作為葉子結(jié)點(diǎn)元素,把其在該字符串中出現(xiàn)的次數(shù)作為權(quán)值構(gòu)造一個(gè)赫夫曼樹(shù),并得到各個(gè)葉子結(jié)點(diǎn)的赫夫曼編碼和整個(gè)輸入的字符串的赫夫

34、曼編碼。在寫(xiě)代碼前,首先,對(duì)問(wèn)題進(jìn)行了分析,明確了目標(biāo),列出了大的框架,然后逐漸細(xì)化,劃分出不同的功能模塊,由具體的子函數(shù)去實(shí)現(xiàn),先在紙上編寫(xiě)代碼,寫(xiě)好后進(jìn)行了反復(fù)的邏輯推理,發(fā)現(xiàn)并解決邏輯問(wèn)題,然后,上機(jī)調(diào)試,方法是:一個(gè)一個(gè)功能模塊分開(kāi)進(jìn)行調(diào)試,主要看調(diào)試的模塊能否達(dá)到預(yù)期的結(jié)果,這樣可以縮小排錯(cuò)的范圍,便以糾錯(cuò)和提高編程的效率,當(dāng)每個(gè)功能模塊都調(diào)試好后,就把各個(gè)部分組合起來(lái),再進(jìn)行調(diào)試,主要檢查各函數(shù)接口是否正確,當(dāng)達(dá)到預(yù)期的結(jié)果

35、,調(diào)試結(jié)束,編程部分完成,然后按實(shí)驗(yàn)要求完成實(shí)驗(yàn)報(bào)告。</p><p>  由于寫(xiě)代碼前做了充分的準(zhǔn)備工作,所以寫(xiě)起代碼來(lái)比較順利,使編程的效率有不少的提高并且最終達(dá)到實(shí)驗(yàn)預(yù)期的結(jié)果。</p><p><b>  心得體會(huì):</b></p><p>  每一次的課程設(shè)計(jì)對(duì)我來(lái)說(shuō)都是一個(gè)不小的提高,哲學(xué)上說(shuō):“實(shí)踐是檢驗(yàn)真理正確性的唯一標(biāo)準(zhǔn)”,尤

36、其是學(xué)編程,自己不動(dòng)手操作,只看書(shū)永遠(yuǎn)都編不出像Windows之類(lèi)的東西,正如老師說(shuō)的那樣,課程設(shè)計(jì)非常鍛煉人,每完成一個(gè)項(xiàng)目,不僅是知識(shí)體系的完善和知識(shí)的驗(yàn)證,更是編程技術(shù)的提升,當(dāng)自己編的多了,就會(huì)開(kāi)始摸索編程的捷徑,想著用更高效的方法去完成一個(gè)個(gè)項(xiàng)目,就這樣在一次次的鍛煉中自己會(huì)從一個(gè)菜鳥(niǎo)迅速的成長(zhǎng),終將成為一個(gè)優(yōu)秀的軟件工程師。</p><p>  一個(gè)成功的項(xiàng)目必須在寫(xiě)代碼前,先要對(duì)課題有充分的思考和規(guī)

37、劃,否則即使完成了項(xiàng)目也會(huì)浪費(fèi)很多的時(shí)間和精力,我認(rèn)為科學(xué)合理的編程方法是我這次課程設(shè)計(jì)的最大收獲。</p><p><b>  六、源程序</b></p><p>  #include<iostream></p><p>  #include<fstream></p><p>  #includ

38、e"heads.h"</p><p>  #define NULL 0</p><p>  #define MAXVALUE 10000 //最大權(quán)值</p><p>  #define MAXLEAF 100 //葉子結(jié)點(diǎn)個(gè)數(shù)</p><p>  #define MAXNOD

39、E MAXLEAF*2-1 //哈夫曼樹(shù)結(jié)點(diǎn)個(gè)數(shù)</p><p>  #define MAXBIT 12 //最大長(zhǎng)度</p><p>  using namespace std;</p><p><b>  int num;</b></p><p>  int power(int

40、 x)//2的x次方</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=1;i<=x;i++)</p><p><b>  {</b></p><p><b>  i

41、*=2;</b></p><p><b>  }</b></p><p><b>  return i;</b></p><p><b>  }</b></p><p>  float pration(int a,int b)//計(jì)算壓縮率,a為壓縮前字長(zhǎng),b為壓縮

42、后字長(zhǎng)</p><p><b>  {</b></p><p><b>  float s;</b></p><p>  s=(float)((float)b/(float)a);</p><p><b>  return s;</b></p><p>

43、<b>  }</b></p><p>  void Show(LinkList l) //輸出</p><p><b>  {</b></p><p>  LinkList p=l->next;</p><p><b>  while(p)</b></p>

44、<p><b>  {</b></p><p>  cout<<p->data ;</p><p>  p=p->next;</p><p><b>  }</b></p><p>  cout<<endl;</p><p>&

45、lt;b>  }</b></p><p>  LinkList Create() //寫(xiě)入字符串</p><p><b>  {</b></p><p>  int total=0;</p><p>  int x=1,y;</p><p><b>  int p

46、=0;</b></p><p>  LinkList l,p1,p2;</p><p>  l=new LNode;</p><p>  l->next=NULL;</p><p>  cout<<"請(qǐng)輸入:"<<endl<<endl;</p><p

47、>  cout<<"1.輸入并存入文檔\n2.從文檔讀取,并計(jì)算出壓縮率!"<<endl<<endl;</p><p>  cout<<"請(qǐng)輸入要進(jìn)行的操作:"<<endl;</p><p>  int choose;</p><p>  cin>>

48、choose;</p><p>  if(choose!=1&&choose!=2)</p><p><b>  {</b></p><p>  cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入!"<<endl;</p><p>  cin>>choose;<

49、;/p><p><b>  }</b></p><p>  if(choose==1)</p><p><b>  {</b></p><p>  ofstream outfile;</p><p>  outfile.open("code.txt",ios

50、::out);</p><p>  if(!outfile)</p><p><b>  {</b></p><p>  cout<<"輸出時(shí)打開(kāi)code文檔出錯(cuò)!"<<endl;</p><p><b>  exit(1);</b></p>

51、<p><b>  }</b></p><p>  cout<<"請(qǐng)輸入所要編譯的字符串,以#結(jié)束:"<<endl;</p><p>  p1=new LNode;</p><p><b>  p2=l;</b></p><p>  cin&g

52、t;>p1->data;outfile<<p1->data;</p><p>  while(p1->data!='#')</p><p><b>  {</b></p><p>  p2->next=p1;</p><p><b>  p2=p1;&

53、lt;/b></p><p>  p1=new LNode;</p><p>  cin>>p1->data;outfile<<p1->data;</p><p><b>  }</b></p><p>  p2->next=NULL;</p><p&g

54、t;<b>  p2=l;</b></p><p><b>  return l;</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  ifstream infile("wenjia

55、n.txt",ios::in);</p><p>  if(!infile)</p><p><b>  {</b></p><p>  cout<<"輸出時(shí)打開(kāi)文檔出錯(cuò)!\n或文檔不存在!"<<endl;</p><p>  cout<<"請(qǐng)確

56、認(rèn)本目錄下有相關(guān)文件后再重試!"<<endl;</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p>  l=Read("wenjian.txt");</p><p>  p1=new LNode;&l

57、t;/p><p><b>  p2=l;</b></p><p>  infile>>p1->data;</p><p>  while(infile.eof())</p><p><b>  {</b></p><p>  p2->next=p1;<

58、;/p><p><b>  p2=p1;</b></p><p>  p1=new LNode;</p><p>  infile>>p1->data;</p><p><b>  }</b></p><p>  p1->data='#';

59、</p><p>  p1->next=NULL;</p><p>  infile.close();</p><p>  printf("讀取完成!\n");</p><p><b>  Show(l);</b></p><p>  /*****************

60、以下計(jì)算壓縮率*******************/</p><p><b>  p2=l;</b></p><p><b>  while(p2)</b></p><p><b>  {</b></p><p><b>  total++;</b>&l

61、t;/p><p>  p2=p2->next;</p><p><b>  }</b></p><p>  for(;power(x)<total;)</p><p><b>  {</b></p><p><b>  x++;</b></

62、p><p>  p=x; //記錄正常編碼一個(gè)字符需要的比特位數(shù)</p><p><b>  }</b></p><p>  y=(total-1)*x;//正常所需的總比特?cái)?shù)</p><p>  printf("y is %d\n",y);</p><p>  /*****

63、******編碼后的位數(shù)計(jì)算********************/</p><p><b>  int c;</b></p><p><b>  FILE *fp;</b></p><p>  if((fp=fopen("Code.txt","rb"))==NULL)</p

64、><p><b>  {</b></p><p>  printf("文件打開(kāi)失??!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  while(!feof(fp

65、))</p><p><b>  {</b></p><p>  c=fgetc(fp);</p><p><b>  x=x+1;</b></p><p><b>  }</b></p><p>  printf("x is %d"

66、,x);</p><p>  /*****************計(jì)算完成**************************/</p><p>  printf("壓縮率為%4.2f%%",pration(y,x)*100);</p><p><b>  return l;</b></p><p>

67、<b>  }</b></p><p><b>  }</b></p><p>  void Write(LinkList l,char wenjian[])</p><p><b>  {</b></p><p>  LinkList p1;</p><p

68、>  ofstream outfile(wenjian,ios::out);</p><p>  p1=l->next ;</p><p><b>  while(p1)</b></p><p><b>  {</b></p><p>  outfile<<p1->da

69、ta;</p><p>  p1=p1->next;</p><p><b>  }</b></p><p>  outfile<<"#";</p><p>  outfile.close();</p><p><b>  }</b>&l

70、t;/p><p>  LinkList Read(char wenjian[]) //讀文件中字符串</p><p><b>  {</b></p><p>  LinkList l,p1,p2;</p><p>  l=new LNode;</p><p>  l->next=NULL;&l

71、t;/p><p>  p1=new LNode;</p><p><b>  p2=l;</b></p><p>  ifstream infile(wenjian,ios::in);</p><p>  if(!infile)</p><p><b>  {</b></p

72、><p>  cout<<"打開(kāi)文檔出錯(cuò)!\n或文檔不存在!"<<endl;</p><p>  cout<<"請(qǐng)確認(rèn)本目錄下有相關(guān)文件后再重試!"<<endl;</p><p><b>  exit(1);</b></p><p>&l

73、t;b>  }</b></p><p>  infile>>p1->data;</p><p>  while(p1->data!='#')</p><p><b>  {</b></p><p>  p2->next=p1;</p><

74、p><b>  p2=p1;</b></p><p>  p1=new LNode;</p><p>  infile>>p1->data;</p><p><b>  }</b></p><p>  p2->next=NULL;</p><p>

75、;  infile.close();</p><p><b>  return l;</b></p><p><b>  }</b></p><p>  void Create(HNodeType a[MAXNODE],LinkList l) //統(tǒng)計(jì)字符個(gè)數(shù),做出哈夫曼樹(shù)的結(jié)點(diǎn) </p>

76、<p><b>  {</b></p><p>  LinkList p;</p><p><b>  int i;</b></p><p>  p=l->next ;</p><p>  //全局變量num在這里的作用</p><p><b>

77、  while(p)</b></p><p><b>  {</b></p><p>  for(i=0;i<num;i++)</p><p>  if(a[i].data==p->data)</p><p><b>  {</b></p><p> 

78、 a[i].weight++;</p><p><b>  break; </b></p><p><b>  }</b></p><p>  if(i==num)</p><p><b>  {</b></p><p>  a[i].data=p-&g

79、t;data;</p><p>  a[i].weight=1;</p><p><b>  num++;</b></p><p><b>  }</b></p><p>  p=p->next;</p><p><b>  }</b></p

80、><p>  //printf("num is %d ",num);可以看到num在這里的作用</p><p>  for(i=0;i<num;i++)</p><p><b>  {</b></p><p>  a[i].lchild=NULL;</p><p>  a[i

81、].rchild=NULL;</p><p>  a[i].parent=-1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void HaffmanTree(HNodeType HuffNode[MAXNODE]) //構(gòu)造哈夫曼樹(shù)

82、</p><p><b>  {</b></p><p>  int i,j,m1,m2,x1,x2;</p><p>  for(i=0;i<MAXNODE;i++)</p><p><b>  {</b></p><p>  HuffNode[i].parent=-

83、1;</p><p>  HuffNode[i].lchild=-1;</p><p>  HuffNode[i].rchild=-1;</p><p><b>  }</b></p><p>  for(i=0;i<num-1;i++)</p><p><b>  {</b

84、></p><p>  m1=m2=MAXVALUE;</p><p><b>  x1=x2=0;</b></p><p>  for(j=0;j<num+i;j++)</p><p><b>  {</b></p><p>  if(HuffNode[j].p

85、arent==-1&&HuffNode[j].weight<m1)</p><p><b>  {</b></p><p><b>  m2=m1;</b></p><p><b>  x2=x1;</b></p><p>  m1=HuffNode[j]

86、.weight;</p><p><b>  x1=j;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  if(HuffNode[j].parent==-1&&HuffNode[j].weight

87、<m2)</p><p><b>  {</b></p><p>  m2=HuffNode[j].weight;</p><p><b>  x2=j;</b></p><p><b>  }</b></p><p><b>  }&l

88、t;/b></p><p>  HuffNode[x1].parent=num+i;</p><p>  HuffNode[x2].parent=num+i;</p><p>  HuffNode[num+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;</p><p>  HuffN

89、ode[num+i].lchild=x1;</p><p>  HuffNode[num+i].rchild=x2;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //哈夫曼編碼</b></p><

90、;p>  LinkList Bianma(LinkList l,Code code[MAXNODE]) //寫(xiě)編碼文件</p><p><b>  {</b></p><p>  LinkList p,q,p1,p2;</p><p><b>  int i,j;</b></p><p> 

91、 p=l->next ;</p><p>  q=new LNode;</p><p>  q->next=NULL;</p><p>  p1=new LNode;</p><p><b>  p2=q;</b></p><p><b>  while(p)</b&g

92、t;</p><p><b>  {</b></p><p>  for(i=0;i<num;i++)</p><p>  if(p->data==code[i].data)</p><p><b>  { </b></p><p><b>  j

93、=0;</b></p><p>  while(code[i].bit[j]!='\0')</p><p><b>  {</b></p><p>  p1->data=code[i].bit[j];</p><p><b>  j++;</b></p>

94、<p>  p2->next=p1;</p><p><b>  p2=p1;</b></p><p>  p1=new LNode;</p><p><b>  }</b></p><p><b>  }</b></p><p> 

95、 p=p->next ;</p><p><b>  }</b></p><p>  p2->next=NULL;</p><p><b>  return q;</b></p><p><b>  }</b></p><p>  SeqSt

96、ack Init()</p><p><b>  {</b></p><p>  SeqStack s;</p><p>  s=new StackNode;</p><p>  s->top=-1;</p><p><b>  return s;</b></p&

97、gt;<p><b>  }</b></p><p>  void HaffmanCode(HNodeType HuffNode[MAXNODE],HCodeType HuffCode[MAXLEAF]) //哈夫曼編碼算法</p><p><b>  {</b></p><p>  int i,j,c,p;

98、</p><p>  HCodeType cd;</p><p>  for(i=0;i<num;i++)</p><p><b>  {</b></p><p>  cd.start=MAXBIT-1;</p><p><b>  c=i;</b></p>

99、<p>  p=HuffNode[c].parent ;</p><p>  while(p!=-1)</p><p><b>  {</b></p><p>  if(HuffNode[p].lchild==c)</p><p>  cd.bit[cd.start]='0';</p&

100、gt;<p><b>  else</b></p><p>  cd.bit[cd.start]='1';</p><p>  cd.start --;</p><p><b>  c=p;</b></p><p>  p=HuffNode[c].parent;<

101、/p><p><b>  }</b></p><p>  for(j=cd.start+1;j<MAXBIT;j++)</p><p>  HuffCode[i].bit[j]=cd.bit[j];</p><p>  HuffCode[i].start=cd.start ;</p><p>&

102、lt;b>  }</b></p><p><b>  }</b></p><p>  void bianma(HCodeType HuffCode[MAXLEAF],HNodeType a[MAXNODE],Code code[MAXNODE]) //字符編碼</p><p><b>  {</

103、b></p><p>  int i,j,k;</p><p>  for(i=0;i<num;i++)</p><p><b>  { </b></p><p>  code[i].data=a[i].data;</p><p>  for(j=HuffCode[i].start

104、+1,k=0;j<MAXBIT;j++,k++)</p><p><b>  {</b></p><p>  code[i].bit[k]=HuffCode[i].bit[j];</p><p><b>  }</b></p><p>  code[i].bit[k]='\0'

105、;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int panduan(char a[MAXBIT],char b[MAXBIT])</p><p><b>  {</b></p><p>  if

106、(strcmp(a,b)==0)</p><p><b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p>&

107、lt;p>  void bianma(Code code[MAXNODE],LinkList l)//讀取編碼</p><p><b>  {</b></p><p>  int i,flag;</p><p>  SeqStack s;</p><p><b>  s=Init();</b>

108、</p><p>  LinkList p;</p><p>  p=l->next;</p><p><b>  while(p)</b></p><p><b>  {</b></p><p><b>  s->top++;</b><

109、;/p><p><b>  flag=0;</b></p><p>  s->data[s->top]=p->data;</p><p>  s->data[s->top+1]='\0';</p><p>  for(i=0;i<num;i++)</p>&l

110、t;p>  if(panduan(s->data,code[i].bit)==1)</p><p><b>  { </b></p><p>  cout<<code[i].data;</p><p><b>  flag=1;</b></p><p><b>  

111、break;</b></p><p><b>  }</b></p><p><b>  if(flag)</b></p><p><b>  {</b></p><p><b>  s=Init();</b></p><

112、p><b>  }</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p><p>  void Sho

113、wTree(HNodeType node[MAXNODE])</p><p>  {printf("輸出");</p><p><b>  int i;</b></p><p>  cout.width(8);</p><p>  cout.setf(ios::left);</p>&l

114、t;p>  cout<<"統(tǒng)計(jì)字符頻率結(jié)果為:"<<endl;</p><p>  cout<<"頻率 ";</p><p>  cout.width(8);</p><p>  cout<<"字符"<<endl;</p>

115、<p>  for(i=0;i<num;i++)</p><p><b>  {</b></p><p>  cout.width(8);</p><p>  cout<<node[i].weight;</p><p>  cout.width(8);</p><p>

116、;  cout<<node[i].data<<endl;</p><p><b>  }</b></p><p>  cout<<endl;</p><p>  cout<<"哈弗曼樹(shù)編碼為:"<<endl;</p><p>  cout&l

117、t;<"字符";</p><p>  cout<<" ";</p><p>  cout<<"編碼";</p><p>  cout<<endl;</p><p><b>  }</b></p>&l

118、t;p>  void ShowCode(Code cood[MAXNODE])</p><p><b>  {</b></p><p>  for(int i=0;i<num;i++)</p><p>  cout<<cood[i].data<<"\t"<<cood[i].bi

119、t<<endl;</p><p><b>  }</b></p><p>  void bianma(HNodeType node[MAXNODE],HCodeType code[MAXLEAF],Code CODE[MAXNODE])</p><p><b>  {</b></p><p&

120、gt;  LinkList l,c;</p><p>  l=Create(); //寫(xiě)字符串</p><p>  Write(l,"wenjian.txt");</p><p>  l=Read("wenjian.txt");</p><p>  cout&

121、lt;<"文件內(nèi)容:"<<endl;</p><p><b>  Show(l);</b></p><p>  Create(node,l); //統(tǒng)計(jì)字符個(gè)數(shù)</p><p>  HaffmanTree(node); //構(gòu)造哈夫曼樹(shù)</

122、p><p>  ShowTree(node); //輸出哈夫曼樹(shù)</p><p>  HaffmanCode(node,code); //哈夫曼編碼算法</p><p>  bianma(code,node,CODE); //字符編碼 </p><p>  ShowCode(C

123、ODE); //輸出編碼規(guī)則</p><p>  c=Bianma(l,CODE);</p><p>  cout<<"編碼文件為:"<<endl;</p><p>  Show(c); </p><p>  Write(c,"Cod

124、e.txt");</p><p><b>  }</b></p><p>  void yima(Code CODE[MAXNODE])//譯碼</p><p><b>  {</b></p><p>  LinkList l;</p><p>  l=Read(&

125、quot;Code.txt"); //讀取編碼文件</p><p>  cout<<"譯碼的文件為:"<<endl;</p><p>  Show(l); //顯示編碼文件</p><p>  cout<<"譯碼文件為:"<<endl;

126、</p><p>  bianma(CODE,l); //譯碼</p><p><b>  }</b></p><p>  int Menu_Select()</p><p><b>  {</b></p><p><b>  int i;</b

127、></p><p>  cout<<"1.編碼信息\n2.譯碼信息\n0.退出程序"<<endl;</p><p>  cout<<"請(qǐng)選擇要進(jìn)行的操作:"<<endl;</p><p><b>  cin>>i;</b></p>

128、;<p>  while(i<0||i>2)</p><p><b>  {</b></p><p>  cout<<"輸入錯(cuò)誤!請(qǐng)重新輸入:";</p><p><b>  cin>>i;</b></p><p><b&g

129、t;  }</b></p><p><b>  return i;</b></p><p><b>  }</b></p><p>  int main()</p><p><b>  {</b></p><p>  HNodeType no

130、de[MAXNODE];//哈夫曼節(jié)點(diǎn)數(shù)組</p><p>  HCodeType Huffcode[MAXLEAF];//</p><p>  Code code[MAXNODE];</p><p>  cout<<"***************************************************************

131、**"<<endl;</p><p>  cout<<"**************歡迎進(jìn)入Huffman樹(shù)編碼與譯碼系統(tǒng)********************"<<endl;</p><p><b>  while(1)</b></p><p><b>  {<

132、;/b></p><p>  switch(Menu_Select())</p><p><b>  {</b></p><p>  case 1:bianma(node,Huffcode,code);break;</p><p>  case 2:yima(code);break;</p><

溫馨提示

  • 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)論