2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  《軟件技術(shù)課程設(shè)計(jì)》</p><p><b>  課程論文報(bào)告書</b></p><p>  題 目:哈夫曼編碼及解碼算法的實(shí)現(xiàn)</p><p>  姓 名: </p><p>  班 級(jí): </p><p>  學(xué) 號(hào): </p>

2、;<p><b>  指導(dǎo)教師: </b></p><p><b>  目錄</b></p><p><b>  一、前言3</b></p><p><b>  二、概要設(shè)計(jì)3</b></p><p>  ① 赫夫曼樹的建立

3、5</p><p><b> ?、?赫夫曼編碼5</b></p><p>  ③ 代碼文件的譯碼5</p><p><b>  三、詳細(xì)設(shè)計(jì)5</b></p><p> ?。?)①赫夫曼樹的存儲(chǔ)結(jié)構(gòu)描述:5</p><p> ?、诠ヂ鼧涞乃惴ǎ?</p>

4、;<p> ?。?)哈弗曼編碼6</p><p> ?。?)哈弗曼譯碼8</p><p><b> ?。?)主函數(shù)8</b></p><p> ?。?)顯示部分源程序:9</p><p><b>  四、軟件測(cè)試10</b></p><p><b

5、>  五、總結(jié)12</b></p><p><b>  附錄:12</b></p><p><b>  一、前言</b></p><p>  在當(dāng)今信息爆炸時(shí)代,如何采用有效的數(shù)據(jù)壓縮技術(shù)節(jié)省數(shù)據(jù)文件的存儲(chǔ)空間和計(jì)算機(jī)網(wǎng)絡(luò)的傳送時(shí)間已越來越引起人們的重視,赫夫曼編碼正是一種應(yīng)用廣泛且非常有效的數(shù)據(jù)壓縮

6、技術(shù)。哈夫曼編碼是一種編碼方式,以哈夫曼樹—即最優(yōu)二叉樹,帶權(quán)路徑長(zhǎng)度最小的二叉樹,經(jīng)常應(yīng)用于數(shù)據(jù)壓縮。哈弗曼編碼使用一張?zhí)厥獾木幋a表將源字符(例如某文件中的一個(gè)符號(hào))進(jìn)行編碼。這張編碼表的特殊之處在于,它是根據(jù)每一個(gè)源字符出現(xiàn)的估算概率而建立起來的(出現(xiàn)概率高的字符使用較短的編碼,反之出現(xiàn)概率低的則使用較長(zhǎng)的編碼,這便使編碼之后的字符串的平均期望長(zhǎng)度降低,從而達(dá)到無損壓縮數(shù)據(jù)的目的)。赫夫曼編碼的應(yīng)用很廣泛,利用赫夫曼樹求得的用于通信

7、的二進(jìn)制編碼稱為赫夫曼編碼。樹中從根到每個(gè)葉子都有一條路徑,對(duì)路徑上的各分支約定:指向左子樹的分支表示“0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個(gè)葉子對(duì)應(yīng)的字符的編碼,這就是赫夫曼編碼。哈弗曼譯碼輸入字符串可以把它編譯成二進(jìn)制代碼,輸入二進(jìn)制代碼時(shí)可以編譯成字符串。</p><p><b>  二、概要設(shè)計(jì)</b></p><p&g

8、t;  哈夫曼編\譯碼器的主要功能是先建立哈夫曼樹,然后利用建好的哈夫曼樹生成哈夫曼編碼后進(jìn)行譯碼 。</p><p>  在數(shù)據(jù)通信中,經(jīng)常需要將傳送的文字轉(zhuǎn)換成由二進(jìn)制字符0、1組成的二進(jìn)制串,稱之為編碼。構(gòu)造一棵哈夫曼樹,規(guī)定哈夫曼樹中的左分之代表0,右分支代表1,則從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)所經(jīng)過的路徑分支組成的0和1的序列便為該節(jié)點(diǎn)對(duì)應(yīng)字符的編碼,稱之為哈夫曼編碼。</p><p>

9、  最簡(jiǎn)單的二進(jìn)制編碼方式是等長(zhǎng)編碼。若采用不等長(zhǎng)編碼,讓出現(xiàn)頻率高的字符具有較短的編碼,讓出現(xiàn)頻率低的字符具有較長(zhǎng)的編碼,這樣可能縮短傳送電文的總長(zhǎng)度。哈夫曼樹課用于構(gòu)造使電文的編碼總長(zhǎng)最短的編碼方案。</p><p>  (1)其主要流程圖如圖1-1所示。</p><p> ?。?)設(shè)計(jì)包含的幾個(gè)方面:</p><p><b>  ① 赫夫曼樹的建立&

10、lt;/b></p><p>  赫夫曼樹的建立由赫夫曼算法的定義可知,初始森林中共有n棵只含有根結(jié)點(diǎn)的二叉樹。算法的第二步是:將當(dāng)前森林中的兩棵根結(jié)點(diǎn)權(quán)值最小的二叉樹,合并成一棵新的二叉樹;每合并一次,森林中就減少一棵樹,產(chǎn)生一個(gè)新結(jié)點(diǎn)。顯然要進(jìn)行n-1次合并,所以共產(chǎn)生n-1個(gè)新結(jié)點(diǎn),它們都是具有兩個(gè)孩子的分支結(jié)點(diǎn)。由此可知,最終求得的赫夫曼樹中一共有2n-1個(gè)結(jié)點(diǎn),其中n個(gè)結(jié)點(diǎn)是初始森林的n個(gè)孤立結(jié)點(diǎn)

11、。并且赫夫曼樹中沒有度數(shù)為1的分支結(jié)點(diǎn)。我們可以利用一個(gè)大小為2n--1的一維數(shù)組來存儲(chǔ)赫夫曼樹中的結(jié)點(diǎn)。</p><p><b> ?、?赫夫曼編碼 </b></p><p>  要求電文的赫夫曼編碼,必須先定義赫夫曼編碼類型,根據(jù)設(shè)計(jì)要求和實(shí)際需要定義的類型如下: </p><p>  typedet struct { </p>

12、<p>  char ch; // 存放編碼的字符 </p><p>  char bits[N+1]; // 存放編碼位串 </p><p>  int len; // 編碼的長(zhǎng)度 </p><p>  }CodeNode; // 編碼結(jié)構(gòu)體類型 </p><p> ?、?代碼文件的譯碼 </p><p&g

13、t;  譯碼的基本思想是:讀文件中編碼,并與原先生成的赫夫曼編碼表比較,遇到相等時(shí),即取出其對(duì)應(yīng)的字符存入一個(gè)新串中。 </p><p><b>  三、詳細(xì)設(shè)計(jì)</b></p><p> ?。?)①赫夫曼樹的存儲(chǔ)結(jié)構(gòu)描述:</p><p>  #define N 50 // 葉子結(jié)點(diǎn)數(shù) </p><p>  #def

14、ine M 2*N-1 // 赫夫曼樹中結(jié)點(diǎn)總數(shù) </p><p>  typedef struct { </p><p>  int weight; // 葉子結(jié)點(diǎn)的權(quán)值 </p><p>  int lchild, rchild, parent; // 左右孩子及雙親指針 </p><p>  }HTNode; // 樹中結(jié)點(diǎn)類型 <

15、;/p><p>  typedef HTNode HuffmanTree[M+1]; </p><p><b> ?、诠ヂ鼧涞乃惴ǎ?lt;/b></p><p>  void CreateHT(HTNode ht[],int n)//調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b>  {</b

16、></p><p>  int i,k,lnode,rnode;</p><p>  int min1,min2;</p><p>  for (i=0;i<2*n-1;i++) </p><p>  ht[i].parent=ht[i].lchild=ht[i].rchild=-1;//所有結(jié)點(diǎn)的相關(guān)域置初值-1&

17、lt;/p><p>  for (i=n;i<2*n-1;i++)//構(gòu)造哈夫曼樹</p><p><b>  {</b></p><p>  min1=min2=32767;//int的范圍是-32768—32767</p><p>  lnode=rnode=-1;//lnode和rnode記錄最小

18、權(quán)值的兩個(gè)結(jié)點(diǎn)位置</p><p>  for (k=0;k<=i-1;k++)</p><p><b>  {</b></p><p>  if (ht[k].parent==-1)//只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p><b>  {</b></p><p

19、>  if (ht[k].weight<min1)//若權(quán)值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b>  {</b></p><p>  min2=min1;rnode=lnode;</p><p>  min1=ht[k].weight;lnode=k;</p><p><b>  }&

20、lt;/b></p><p>  else if (ht[k].weight<min2)</p><p><b>  {</b></p><p>  min2=ht[k].weight;rnode=k;</p><p><b>  }</b></p><p>&l

21、t;b>  }</b></p><p><b>  }</b></p><p>  ht[lnode].parent=i;ht[rnode].parent=i; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p>  ht[i].weight=ht[lnode].weight+ht[rnode].weight;//兩個(gè)最小節(jié)點(diǎn)

22、的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)權(quán)值之和</p><p>  ht[i].lchild=lnode;ht[i].rchild=rnode;//父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b>  }</b></p><p><b>  }</b></p><p><b> ?。?)哈弗曼編碼&

23、lt;/b></p><p>  void CreateHCode(HTNode ht[],HCode hcd[],int n)</p><p><b>  {</b></p><p>  int i,f,c;</p><p><b>  HCode hc;</b></p>&l

24、t;p>  for (i=0;i<n;i++)//根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b>  {</b></p><p>  hc.start=n;c=i;</p><p>  f=ht[i].parent;</p><p>  while (f!=-1)//循序直到樹根結(jié)點(diǎn)結(jié)束循環(huán)&l

25、t;/p><p><b>  {</b></p><p>  if (ht[f].lchild==c)//處理左孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='0';</p><p>  else//處理右孩子結(jié)點(diǎn)</p><p>  hc.cd[h

26、c.start--]='1';</p><p>  c=f;f=ht[f].parent;</p><p><b>  }</b></p><p>  hc.start++;//start指向哈夫曼編碼hc.cd[]中最開始字符</p><p>  hcd[i]=hc;</p>&

27、lt;p><b>  }</b></p><p><b>  }</b></p><p>  void DispHCode(HTNode ht[],HCode hcd[],int n)//輸出哈夫曼編碼的列表</p><p><b>  {</b></p><p>&

28、lt;b>  int i,k;</b></p><p>  printf(" 輸出哈夫曼編碼:\n");</p><p>  for (i=0;i<n;i++)//輸出data中的所有數(shù)據(jù),即A-Z</p><p><b>  {</b></p><p>  pri

29、ntf(" %c:\t",ht[i].data); </p><p>  for (k=hcd[i].start;k<=n;k++)//輸出所有data中數(shù)據(jù)的編碼</p><p><b>  {</b></p><p>  printf("%c",hcd[i].cd[k]);

30、 </p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void

31、 editHCode(HTNode ht[],HCode hcd[],int n)//編碼函數(shù)</p><p><b>  {</b></p><p>  char string[MAXSIZE];</p><p>  int i,j,k;</p><p>  scanf("%s",string

32、); //把要進(jìn)行編碼的字符串存入string數(shù)組中</p><p>  printf("\n輸出編碼結(jié)果:\n");</p><p>  for (i=0;string[i]!='#';i++) //#為終止標(biāo)志</p><p><b>  {</b></p><p&g

33、t;  for (j=0;j<n;j++)</p><p><b>  {</b></p><p>  if(string[i]==ht[j].data) //循環(huán)查找與輸入字符相同的編號(hào),相同的就輸出這個(gè)字符的編碼</p><p><b>  {</b></p><p>  for (k=

34、hcd[j].start;k<=n;k++)</p><p><b>  {</b></p><p>  printf("%c",hcd[j].cd[k]);</p><p><b>  }</b></p><p>  break;//輸出完成后跳出當(dāng)前for循環(huán)&l

35、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b> ?。?)哈弗曼譯碼</b>

36、</p><p>  void deHCode(HTNode ht[],HCode hcd[],int n)//譯碼函數(shù)</p><p><b>  {</b></p><p>  char code[MAXSIZE];</p><p>  int i,j,l,k,m,x;</p><p> 

37、 scanf("%s",code);//把要進(jìn)行譯碼的字符串存入code數(shù)組中</p><p>  while(code[0]!='#')</p><p>  for (i=0;i<n;i++)</p><p><b>  {</b></p><p>  m=0;

38、//m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p>  for (k=hcd[i].start,j=0;k<=n;k++,j++)//j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><p><b>  {</b></p><p>  if(code[j]==hcd[i].cd[k])//當(dāng)有相同編碼時(shí)m值加1</p>&

39、lt;p><b>  m++;</b></p><p><b>  }</b></p><p>  if(m==j) //當(dāng)輸入的字符串與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b>  {</b></p><p>  printf(&

40、quot;%c",ht[i].data);</p><p>  for(x=0;code[x-1]!='#';x++)//把已經(jīng)使用過的code數(shù)組里的字符串刪除</p><p><b>  {</b></p><p>  code[x]=code[x+j];</p><p><b>

41、;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b> ?。?)主函數(shù)</b></p><p>  void m

42、ain()</p><p><b>  {</b></p><p>  int n=26,i;</p><p>  char orz,back,flag=1;</p><p>  char str[]={'A','B','C','D','E'

43、,'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W',

44、9;X','Y','Z'}; //初始化</p><p>  int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16};//初始化</p><p>  HTNode ht[M];//建立結(jié)構(gòu)體</p><

45、;p>  HCode hcd[N];//建立結(jié)構(gòu)體</p><p>  for (i=0;i<n;i++)//把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b>  {</b></p><p>  ht[i].data=str[i];</p><p>  ht[i].weight=fnum[i];&

46、lt;/p><p><b>  }</b></p><p>  while (flag)//菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p> ?。?)顯示部分源程序:</p><p><b>  {</b></p><p>  printf("\n"

47、);</p><p>  printf(" ********************************");</p><p>  printf("\n ** 1---------------顯示編碼 **");</p><p>  printf("\n ** 2-----

48、----------進(jìn)行編碼 **");</p><p>  printf("\n ** 3---------------進(jìn)行譯碼 **");</p><p>  printf("\n ** 4---------------退出 **\n");</p><p>  printf(&

49、quot; * **********************************");</p><p>  printf("\n");</p><p>  printf(" 請(qǐng)輸入選擇的編號(hào):");</p><p>  scanf("%c",&orz);<

50、;/p><p>  switch(orz)</p><p><b>  {</b></p><p><b>  case 'a':</b></p><p><b>  case 'A':</b></p><p>  syste

51、m("cls");//清屏函數(shù)</p><p>  CreateHT(ht,n);</p><p>  CreateHCode(ht,hcd,n);</p><p>  DispHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p>

52、<p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case 'b':</b></p><p><b&

53、gt;  case 'B':</b></p><p>  system("cls");</p><p>  printf("請(qǐng)輸入要進(jìn)行編碼的字符串(以#結(jié)束):\n");</p><p>  editHCode(ht,hcd,n);</p><p>  printf(&qu

54、ot;\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case 'c':<

55、/b></p><p><b>  case 'C':</b></p><p>  system("cls");</p><p>  DispHCode(ht,hcd,n);</p><p>  printf("請(qǐng)輸入編碼(以#結(jié)束):\n");</p&

56、gt;<p>  deHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  br

57、eak;</b></p><p><b>  case 'd':</b></p><p><b>  case 'D':</b></p><p><b>  flag=0;</b></p><p><b>  break;&

58、lt;/b></p><p><b>  default:</b></p><p>  system("cls");</p><p><b>  }}}</b></p><p><b>  四、軟件測(cè)試</b></p><p>

59、<b>  進(jìn)入主菜單</b></p><p><b>  選A時(shí)的顯示結(jié)果</b></p><p><b>  選擇B時(shí)的顯示結(jié)果</b></p><p><b>  選C時(shí)的顯示結(jié)果</b></p><p><b>  五、總結(jié)</b&

60、gt;</p><p>  通過這次課程設(shè)計(jì),我對(duì)一個(gè)程序的數(shù)據(jù)結(jié)構(gòu)有更全面更進(jìn)一步的認(rèn)識(shí),根據(jù)不同的需求,采用不同的數(shù)據(jù)存儲(chǔ)方式,不一定要用棧,二叉樹等高級(jí)類型,有時(shí)用基本的一維數(shù)組,只要運(yùn)用得當(dāng),也能達(dá)到相同的效果,甚至更佳,就如這次的課程設(shè)計(jì),通過用for的多重循環(huán),舍棄多余的循環(huán),提高了程序的運(yùn)行效率。在編寫這個(gè)程序的過程中,我復(fù)習(xí)了之前學(xué)的基本語法,哈弗曼樹最小路徑的求取,哈弗曼編碼及譯碼的應(yīng)用范圍,程

61、序結(jié)構(gòu)算法等一系列的問題它使我對(duì)數(shù)據(jù)結(jié)構(gòu)改變了看法。在這次設(shè)計(jì)過程中,體現(xiàn)出自己?jiǎn)为?dú)設(shè)計(jì)模具的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出自己勞動(dòng)成果的喜悅心情,也從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)節(jié),從而加以彌補(bǔ)。</p><p><b>  附錄:</b></p><p><b>  源程序如下:</b></p><p

62、>  #include <stdio.h></p><p>  #include <stdlib.h>//要用system函數(shù)要調(diào)用的頭文件</p><p>  #include<conio.h>//用getch()要調(diào)用的頭文件</p><p>  #include <string.h></p&

63、gt;<p>  #define N 50//義用N表示50葉節(jié)點(diǎn)數(shù)</p><p>  #define M 2*N-1//用M表示節(jié)點(diǎn)總數(shù) 當(dāng)葉節(jié)點(diǎn)數(shù)位n時(shí)總節(jié)點(diǎn)數(shù)為2n-1</p><p>  #define MAXSIZE 100</p><p>  typedef struct</p><p><b

64、>  {</b></p><p>  char data;//結(jié)點(diǎn)值</p><p>  int weight;//權(quán)值</p><p>  int parent;//雙親結(jié)點(diǎn)</p><p>  int lchild;//左孩子結(jié)點(diǎn)</p><p>  int rchild;

65、//右孩子結(jié)點(diǎn)</p><p>  }HTNode; </p><p>  typedef struct</p><p><b>  {</b></p><p>  char cd[N];//存放哈夫曼碼</p><p>  int start;

66、//從start開始讀cd中的哈夫曼碼</p><p><b>  }HCode;</b></p><p>  void CreateHT(HTNode ht[],int n)//調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b>  {</b></p><p>  int i,k,l

67、node,rnode;</p><p>  int min1,min2;</p><p>  for (i=0;i<2*n-1;i++) </p><p>  ht[i].parent=ht[i].lchild=ht[i].rchild=-1;//所有結(jié)點(diǎn)的相關(guān)域置初值-1</p><p>  for (i=n;i<

68、2*n-1;i++)//構(gòu)造哈夫曼樹</p><p><b>  {</b></p><p>  min1=min2=32767;//int的范圍是-32768—32767</p><p>  lnode=rnode=-1;//lnode和rnode記錄最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置</p><p>  for

69、(k=0;k<=i-1;k++)</p><p><b>  {</b></p><p>  if (ht[k].parent==-1)//只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p><b>  {</b></p><p>  if (ht[k].weight<min1)//若權(quán)

70、值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b>  {</b></p><p>  min2=min1;rnode=lnode;</p><p>  min1=ht[k].weight;lnode=k;</p><p><b>  }</b></p><p>  else

71、if (ht[k].weight<min2)</p><p><b>  {</b></p><p>  min2=ht[k].weight;rnode=k;</p><p><b>  }</b></p><p><b>  }</b></p><p

72、><b>  }</b></p><p>  ht[lnode].parent=i;ht[rnode].parent=i;//兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p>  ht[i].weight=ht[lnode].weight+ht[rnode].weight;//兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)權(quán)值之和</p><p>  

73、ht[i].lchild=lnode;ht[i].rchild=rnode;//父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CreateHCode(HTNode ht[],HCode hcd[],int n)</p>

74、<p><b>  {</b></p><p>  int i,f,c;</p><p><b>  HCode hc;</b></p><p>  for (i=0;i<n;i++)//根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b>  {</b><

75、;/p><p>  hc.start=n;c=i;</p><p>  f=ht[i].parent;</p><p>  while (f!=-1)//循序直到樹根結(jié)點(diǎn)結(jié)束循環(huán)</p><p><b>  {</b></p><p>  if (ht[f].lchild==c)//處理左孩子

76、結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='0';</p><p>  else//處理右孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='1';</p><p>  c=f;f=ht[f].parent;</p><p><b>

77、;  }</b></p><p>  hc.start++;//start指向哈夫曼編碼hc.cd[]中最開始字符</p><p>  hcd[i]=hc;</p><p><b>  }</b></p><p><b>  }</b></p><p> 

78、 void DispHCode(HTNode ht[],HCode hcd[],int n)//輸出哈夫曼編碼的列表</p><p><b>  {</b></p><p><b>  int i,k;</b></p><p>  printf(" 輸出哈夫曼編碼:\n"); </p>

79、<p>  for (i=0;i<n;i++)//輸出data中的所有數(shù)據(jù),即A-Z</p><p><b>  {</b></p><p>  printf(" %c:\t",ht[i].data); </p><p>  for (k=hcd[i].s

80、tart;k<=n;k++)//輸出所有data中數(shù)據(jù)的編碼</p><p><b>  {</b></p><p>  printf("%c",hcd[i].cd[k]); </p><p><b>  }</b></p><p&

81、gt;  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p><b&g

82、t;  {</b></p><p>  char string[MAXSIZE]; </p><p>  int i,j,k;</p><p>  scanf("%s",string);//把要進(jìn)行編碼的字符串存入string數(shù)組中</p><p>  pri

83、ntf("\n輸出編碼結(jié)果:\n");</p><p>  for (i=0;string[i]!='#';i++)//#為終止標(biāo)志</p><p><b>  {</b></p><p>  for (j=0;j<n;j++)</p><p><b>  {<

84、/b></p><p>  if(string[i]==ht[j].data)//循環(huán)查找與輸入字符相同的編號(hào),相同的就輸出這個(gè)字符的編碼</p><p><b>  {</b></p><p>  for (k=hcd[j].start;k<=n;k++)</p><p><b>  {<

85、/b></p><p>  printf("%c",hcd[j].cd[k]);</p><p><b>  }</b></p><p>  break;//輸出完成后跳出當(dāng)前for循環(huán)</p><p><b>  }</b></p><p>

86、<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void deHCode(HTNode ht[],HCode hcd[],int n)//譯碼函數(shù)</p><p><b>  {</

87、b></p><p>  char code[MAXSIZE];</p><p>  int i,j,l,k,m,x;</p><p>  scanf("%s",code);//把要進(jìn)行譯碼的字符串存入code數(shù)組中</p><p>  while(code[0]!='#')</p&g

88、t;<p>  for (i=0;i<n;i++)</p><p><b>  {</b></p><p>  m=0;//m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p>  for (k=hcd[i].start,j=0;k<=n;k++,j++)//j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><

89、;p><b>  {</b></p><p>  if(code[j]==hcd[i].cd[k])//當(dāng)有相同編碼時(shí)m值加1</p><p><b>  m++;</b></p><p><b>  }</b></p><p>  if(m==j)//當(dāng)輸入的字符串

90、與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b>  {</b></p><p>  printf("%c",ht[i].data);</p><p>  for(x=0;code[x-1]!='#';x++)//把已經(jīng)使用過的code數(shù)組里的字符串刪除</p>&

91、lt;p><b>  {</b></p><p>  code[x]=code[x+j];</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

92、;<b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  int n=26,i;</p><p>  char orz,back,flag=1;</p><p>  char str[]={'A&

93、#39;,'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S'

94、,'T','U','V','W','X','Y','Z'}; //初始化</p><p>  int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16};//初始化</p&g

95、t;<p>  HTNode ht[M];//建立結(jié)構(gòu)體</p><p>  HCode hcd[N];//建立結(jié)構(gòu)體</p><p>  for (i=0;i<n;i++)//把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b>  {</b></p><p>  ht[i].data=

96、str[i];</p><p>  ht[i].weight=fnum[i];</p><p><b>  }</b></p><p>  while (flag)//菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p><b>  {</b></p><p>  pri

97、ntf("\n");</p><p>  printf(" **************************************");</p><p>  printf("\n ** A---------------顯示編碼 **");</p><p>  printf(&q

98、uot;\n ** B---------------進(jìn)行編碼 **");</p><p>  printf("\n ** C---------------進(jìn)行譯碼 **");</p><p>  printf("\n ** D---------------退出 **\n");</p>

99、<p>  printf(" ****************************************");</p><p>  printf("\n");</p><p>  printf(" 請(qǐng)輸入選擇的編號(hào):");</p><p>  scanf(&qu

100、ot;%c",&orz);</p><p>  switch(orz)</p><p><b>  {</b></p><p><b>  case 'a':</b></p><p><b>  case 'A':</b><

101、;/p><p>  system("cls");//清屏函數(shù)</p><p>  CreateHT(ht,n);</p><p>  CreateHCode(ht,hcd,n);</p><p>  DispHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返

102、回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case 'b':</b><

103、/p><p><b>  case 'B':</b></p><p>  system("cls");</p><p>  printf("請(qǐng)輸入要進(jìn)行編碼的字符串(以#結(jié)束):\n");</p><p>  editHCode(ht,hcd,n);</p>

104、<p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>

105、  case 'c':</b></p><p><b>  case 'C':</b></p><p>  system("cls");</p><p>  DispHCode(ht,hcd,n);</p><p>  printf("請(qǐng)輸入編碼(

106、以#結(jié)束):\n");</p><p>  deHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p>

107、<p><b>  break;</b></p><p><b>  case 'd':</b></p><p><b>  case 'D':</b></p><p><b>  flag=0;</b></p><

108、p><b>  break;</b></p><p><b>  default:</b></p><p>  system("cls");</p><p><b>  }</b></p><p><b>  }</b></

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論