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

下載本文檔

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

文檔簡介

1、<p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告</p><p>  課程名稱 :赫夫曼編碼系統(tǒng)</p><p>  姓 名 : </p><p>  學(xué) 號 : </p><p>  專 業(yè) : </p><p>  班

2、 級 : </p><p>  指導(dǎo)教師 : </p><p><b>  二〇一二年 十二月</b></p><p>  赫 夫 曼 編 碼 系 統(tǒng)</p><p>  目錄 Contents</p><p><

3、;b>  1.課程小組2</b></p><p>  1.1.小組成員及分工2</p><p>  2.設(shè)計目的和要求2</p><p><b>  3.需求分析2</b></p><p><b>  4.設(shè)計說明2</b></p><p&g

4、t;  4.1.文件編碼(加密)2</p><p>  4.2.文件解碼(解密)3</p><p><b>  5.詳細設(shè)計3</b></p><p>  5.1.程序主體結(jié)構(gòu)3</p><p>  5.2.主要算法說明3</p><p>  5.2.1.Huffman樹3

5、</p><p>  5.2.2.Huffman編碼5</p><p>  5.2.3.字符權(quán)重計算6</p><p>  5.2.4.字符解碼9</p><p>  6.實驗結(jié)果10</p><p>  6.1.實驗結(jié)果說明10</p><p>  6.2.程序運行截圖

6、11</p><p>  7.設(shè)計體會12</p><p>  8.參考文獻13</p><p>  9.附:程序代碼13</p><p><b>  課程小組</b></p><p><b>  小組成員及分工</b></p><p>&

7、lt;b>  …</b></p><p><b>  設(shè)計目的和要求</b></p><p>  通過課程設(shè)計,讓學(xué)生進一步熟悉與鞏固數(shù)據(jù)結(jié)構(gòu)中常用算法,加深體會利用數(shù)據(jù)結(jié)構(gòu)的算法解決實際問題的能力,培養(yǎng)學(xué)生進行復(fù)雜程序設(shè)計的技能,提高學(xué)生的思維能力、并促進其綜合應(yīng)用能力、分析能力和團隊合作能力的提高。</p><p><

8、;b>  需求分析</b></p><p>  隨著網(wǎng)絡(luò)信息科技的不斷高速發(fā)展,網(wǎng)絡(luò)上的問題也不斷顯露出來,特別是人們特別關(guān)注的安全隱私問題,所以文件的傳輸安全性要特別地亟待解決和提高。</p><p>  本次的課程設(shè)計以赫夫曼編碼為題,設(shè)計出赫夫曼文件編碼系統(tǒng),旨在對文件中的內(nèi)容進行分析、統(tǒng)計、處理,進而按照赫夫曼編碼的理論,對文件進行簡單加密。特別是,不同的文本文件

9、有不同的字符處理形式,所以因此每一個文本都會有一個相應(yīng)的密鑰,用于對文本的解碼。</p><p><b>  設(shè)計說明</b></p><p>  本次編寫的程序按著對文件的編碼(加密)和解碼(解密)的兩大步驟展開。</p><p><b>  文件編碼(加密)</b></p><p>  首先選擇

10、文件編碼程序。進入程序后,會要求操作人員選擇將要編碼的文件,并將其導(dǎo)入到程序中,程序正確導(dǎo)入文件后將會對文件從開始至結(jié)束掃描一遍,對文件中的字符進行統(tǒng)計,在最后計算出每個字符出現(xiàn)的頻率,并將頻率換算成每個字符相應(yīng)的權(quán)重。然后根據(jù)得到的字符權(quán)重,構(gòu)造赫夫曼樹并因此完成赫夫曼編碼(至此,文件的導(dǎo)入分析過程已完成)。</p><p>  然后讓操作人員選擇對文件進行編碼。此時,程序?qū)^續(xù)打開文件,繼續(xù)掃描一遍,并在掃

11、描的過程中將掃描到得字符根據(jù)剛才編好的赫夫曼編碼進行對照,將對應(yīng)的赫夫曼編碼寫入另一個文件(即加密的文件),所以,如果用戶代開加密的文件即看到里面全是二進制代碼,并不能分析出里面究竟是什么內(nèi)容。(至此,加密的文件應(yīng)經(jīng)生成)。</p><p>  最后,因為每個文件中的內(nèi)容不同,所以每個文件的赫夫曼編碼也不同,而赫夫曼編碼是根據(jù)字符的權(quán)重生成的,所以每個文件都對應(yīng)一個字符權(quán)重系列(即密鑰),如果失去這個密鑰,即使對

12、文件進行了加密,也不同解密文件的內(nèi)容,即文件加密失效,所以在生成加密文件后,一定要導(dǎo)出文件的字符權(quán)重(即密鑰),以待之后的解碼使用。(至此,文件的加密工作應(yīng)經(jīng)全部完成)。</p><p><b>  文件解碼(解密)</b></p><p>  文件的解碼程序是一步完成的,即要求操作者首先將之前生成的字符權(quán)重(即密鑰)導(dǎo)入程序,程序根據(jù)獲取到得字符權(quán)重,調(diào)用赫夫曼編碼

13、子程序,進行赫夫曼編碼。然后程序會提示操作者將加密后的文件導(dǎo)入程序中,程序會根據(jù)在程序中獲取到的二進制編碼與赫夫曼編碼進行對照識別,顯示出對應(yīng)的字符,因此,文件的解密工作完成。</p><p><b>  詳細設(shè)計</b></p><p><b>  程序主體結(jié)構(gòu)</b></p><p>  程序主體結(jié)構(gòu)分為文件編碼與文件

14、解碼兩個子程序。</p><p>  文件編碼后分別導(dǎo)出編碼后文件與文件密鑰。</p><p>  文件解碼需導(dǎo)入編碼文件與文件密鑰,然后顯示文本內(nèi)容。</p><p><b>  主要算法說明</b></p><p><b>  Huffman樹</b></p><p> 

15、 //HuffmanTree list: list為赫夫曼樹.</p><p>  typedef struct</p><p><b>  {</b></p><p>  char data; //存放字符數(shù)據(jù)</p><p>  int weight; //存放字符權(quán)重</p>

16、<p>  int parent, lchild, rchild; //分別為根、左子樹、右子樹</p><p>  }HuffmanTree;</p><p>  //Static info: info為存放字符權(quán)重的數(shù)組指針. </p><p>  typedef struct</p><p><b>  {&l

17、t;/b></p><p>  char data; //存放字符數(shù)據(jù)</p><p>  int weight; //存放字符權(quán)重</p><p><b>  }Static;</b></p><p>  //int codeSize: codeSize為字符種類個數(shù).</

18、p><p>  void CreatHuffmanTree(HuffmanTree *&list, Static *info, int codeSize)</p><p><b>  {</b></p><p>  int i, j, limit;</p><p>  int lnode, rnode;</p&

19、gt;<p>  int value1, value2;</p><p>  HuffmanTree *ptr;</p><p>  limit = codeSize * 2 - 1;//limit為赫夫曼樹結(jié)點個數(shù)</p><p>  if ((list = (HuffmanTree *)malloc(sizeof(HuffmanTree) *

20、limit)) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p>

21、<p>  /*******************初始化赫夫曼樹各結(jié)點信息**************************/</p><p>  for(i=0, ptr=list; i<codeSize; ++i, ++ptr)</p><p><b>  {</b></p><p>  ptr->data =

22、 info[i].data;</p><p>  ptr->weight = info[i].weight;</p><p>  ptr->parent = ptr->lchild = ptr->rchild = -1;</p><p><b>  }</b></p><p>  for(; i&

23、lt;limit; ++i, ++ptr)</p><p><b>  {</b></p><p>  ptr->data = '0';</p><p>  ptr->weight = 0;</p><p>  ptr->parent = ptr->lchild = ptr->

24、;rchild = -1;</p><p><b>  }</b></p><p>  /***********************開始建立赫夫曼樹******************************/</p><p>  for(i=codeSize; i<limit; ++i)</p><p>&l

25、t;b>  {</b></p><p>  value1 = value2 = 32767;</p><p>  lnode = rnode = -1;</p><p>  //此部分函數(shù)功能為選擇權(quán)值最小的兩個結(jié)點</p><p>  for(j=0; j<i; ++j)</p><p>&l

26、t;b>  {</b></p><p>  if (list[j].parent == -1)</p><p><b>  {</b></p><p>  if (list[j].weight < value1)</p><p><b>  {</b></p>

27、<p>  value2 = value1;</p><p>  rnode = lnode;</p><p>  value1 = list[j].weight;</p><p>  lnode = j;</p><p><b>  }</b></p><p>  else if (l

28、ist[j].weight < value2)</p><p><b>  {</b></p><p>  value2 = list[j].weight;</p><p>  rnode = j;</p><p><b>  }</b></p><p><b&g

29、t;  }</b></p><p><b>  }</b></p><p>  //此部分函數(shù)功能為選擇出的結(jié)點建立關(guān)系</p><p>  list[lnode].parent = i;</p><p>  list[rnode].parent = i;</p><p>  list

30、[i].weight = list[lnode].weight + list[rnode].weight;</p><p>  list[i].lchild = lnode;</p><p>  list[i].rchild = rnode;</p><p><b>  }</b></p><p><b>  

31、}</b></p><p><b>  Huffman編碼</b></p><p>  void CreatHuffmanCode(HuffmanTree *list, HuffmanCode &code, int codeSize)</p><p><b>  {</b></p><

32、;p>  int i, start;</p><p>  int flag1, flag2; </p><p>  char *tempCode;</p><p>  if ((code = (char **)malloc(sizeof(char *) * codeSize)) == NULL)</p><p><b>  {

33、</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  if ((tempCode = (char *)malloc(sizeo

34、f(char) * codeSize)) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b&

35、gt;</p><p>  tempCode[codeSize-1] = '\0';</p><p>  /**************************從葉子結(jié)點到根結(jié)點逆向求編碼***********************/</p><p>  for(i=0; i<codeSize; ++i)</p><p&g

36、t;<b>  {</b></p><p>  start = codeSize - 1;</p><p>  for(flag1=i, flag2=list[i].parent; flag2 != -1; flag1=flag2, flag2=list[flag2].parent)</p><p><b>  {</b>

37、</p><p>  if (list[flag2].lchild == flag1)</p><p><b>  {</b></p><p>  tempCode[--start] = '0';</p><p><b>  }</b></p><p><

38、;b>  else</b></p><p><b>  {</b></p><p>  tempCode[--start] = '1';</p><p><b>  }</b></p><p><b>  }</b></p>&l

39、t;p>  if ((code[i] = (char *)malloc(sizeof(char) * (codeSize - start))) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit

40、(0);</b></p><p><b>  }</b></p><p>  strcpy(code[i], &tempCode[start]);</p><p><b>  }</b></p><p>  free(tempCode);</p><p>

41、<b>  }</b></p><p><b>  字符權(quán)重計算</b></p><p>  //Data characterList: characterList為動態(tài)建立的存放字符種類及在文本中出現(xiàn)次數(shù)的單鏈表.</p><p>  typedef struct node</p><p><

42、;b>  {</b></p><p>  char data;//存放字符數(shù)據(jù)</p><p>  int number;//存放字符個數(shù)</p><p>  struct node *next;</p><p><b>  }Data;</b></p><p>  //此算法中

43、設(shè)計導(dǎo)入文件操作.</p><p>  void DataCount(Static *&info)</p><p><b>  {</b></p><p><b>  FILE *fp;</b></p><p><b>  char ch;</b></p>

44、<p>  char choice;</p><p>  int characterNumber, typeNumber;</p><p>  Data characterList;</p><p>  Data *ptr, *current, *previous;</p><p>  system("CLS"

45、);</p><p>  printf("\n 請輸入需要打開的文件名稱: ");</p><p>  fflush(stdin);</p><p>  gets(fileName);</p><p>  while ((fp = fopen(fileName, "rb")) == NULL)</

46、p><p><b>  {</b></p><p>  printf("\n 您需要打開的文件不存在, 是否需要重新打開(Y/N)? : ");</p><p>  fflush(stdin);</p><p>  choice = getchar();</p><p>  swi

47、tch (choice)</p><p><b>  {</b></p><p><b>  case 'Y':</b></p><p>  system("CLS");</p><p>  printf("\n 請輸入需要打開的文件名稱: "

48、);</p><p>  fflush(stdin);</p><p>  gets(fileName);</p><p><b>  continue;</b></p><p><b>  case 'N':</b></p><p><b>  

49、return;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

50、t;  characterNumber = typeNumber = 0;</p><p>  characterList.next = NULL;</p><p>  //從文件中讀取信息并統(tǒng)計</p><p>  while ((ch = fgetc(fp)) != EOF)</p><p><b>  {</b>&

51、lt;/p><p>  current = characterList.next;</p><p>  if (current == NULL)</p><p><b>  {</b></p><p>  if ((ptr = (Data *)malloc(sizeof(Data))) == NULL)</p>

52、<p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  ptr->data =

53、 ch;</p><p>  ptr->number = 1;</p><p>  ptr->next = characterList.next;</p><p>  characterList.next = ptr;</p><p>  ++typeNumber;</p><p><b>  }

54、</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while ((current != NULL) && (current->data != ch))</p><p><b>  {<

55、/b></p><p>  previous = current;</p><p>  current = current->next;</p><p><b>  }</b></p><p>  if (current != NULL)</p><p><b>  {<

56、;/b></p><p>  ++(current->number);</p><p>  ++characterNumber;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {<

57、/b></p><p>  if ((ptr = (Data *)malloc(sizeof(Data))) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);&

58、lt;/b></p><p><b>  }</b></p><p>  ptr->data = ch;</p><p>  ptr->number = 1;</p><p>  ptr->next = current;</p><p>  previous->nex

59、t = ptr;</p><p>  ++typeNumber;</p><p>  ++characterNumber;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p

60、><p>  fclose(fp);</p><p>  codeSize = typeNumber;</p><p>  info = (Static *)malloc(sizeof(Static) * codeSize);</p><p>  current = characterList.next;</p><p>

61、  //將統(tǒng)計好的字符權(quán)重信息存入權(quán)重文件中</p><p>  for (int i=0; i<codeSize; ++i)</p><p><b>  {</b></p><p>  info[i].data = current->data;</p><p>  info[i].weight = (int

62、)(current->number * 100.0 / characterNumber);</p><p>  current = current->next;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  字符解碼

63、</b></p><p>  //此代碼用于比較查找赫夫曼編碼</p><p>  bool CompareData(char *tempCode, int &position)</p><p><b>  {</b></p><p>  for (position = 0; position <

64、; codeSize; ++position)</p><p><b>  {</b></p><p>  if (strcmp(tempCode, code[position]) == 0)</p><p><b>  {</b></p><p>  return true;</p>

65、<p><b>  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p>  void DisplayContext()</p><p>&

66、lt;b>  {</b></p><p>  InportCharacterWeight();</p><p>  CreatHuffmanTree(list, info, codeSize);</p><p>  CreatHuffmanCode(list, code, codeSize);</p><p>  Inpor

67、tFileCoding();</p><p><b>  FILE *fp;</b></p><p>  int position;</p><p><b>  int end;</b></p><p>  char *tempCode;</p><p><b> 

68、 char ch;</b></p><p>  fp = fopen(fileName, "rb");</p><p>  if ((tempCode = (char *)malloc(sizeof(char) * codeSize)) == NULL)</p><p><b>  {</b></p>

69、<p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  end = 0;</b></p><p>  /*****

70、*************************此部分為解碼過程************************/</p><p>  printf("\n 文件內(nèi)容為:\n\n ");</p><p>  while ((ch = fgetc(fp)) != EOF)</p><p><b>  {</b></p&

71、gt;<p>  tempCode[end] = ch;</p><p><b>  ++end;</b></p><p>  tempCode[end] = '\0';</p><p>  if (CompareData(tempCode, position))</p><p><b

72、>  {</b></p><p>  printf("%c", info[position].data);</p><p><b>  end = 0;</b></p><p><b>  }</b></p><p><b>  }</b>

73、</p><p>  printf("\n\n 按任意鍵結(jié)束!");</p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  實驗結(jié)果</b></p><p><

74、b>  實驗結(jié)果說明</b></p><p>  經(jīng)過多次對本程序的實驗,此次編譯完成的程序可以對簡單的文本文件進行加密和解密,因為限于對文件的基本操作不是太完全清楚,只是匆匆查閱了一些關(guān)于C語言文件操作部分的資料,所以這也是文件操作方面的一個瑕疵。所以綜上,次此的程序只能進行簡單的加密與解密操作。</p><p><b>  程序運行截圖</b>&

75、lt;/p><p>  (圖1:赫夫曼加密程序主體窗口)</p><p> ?。▓D2:赫夫曼文件編碼程序窗口)</p><p> ?。▓D3:用于測試的文本 原始文本內(nèi)內(nèi)容)</p><p> ?。▓D4:導(dǎo)出文件編碼后,在創(chuàng)建的編碼文件中生成的二進制數(shù))</p><p> ?。▓D5:導(dǎo)出的文本密鑰(即字符權(quán)重))</

76、p><p> ?。▓D6:赫夫曼文件譯碼程序窗口)</p><p> ?。▓D7:將之前生成的編碼文件與密鑰導(dǎo)入進來后顯示出原來的文本內(nèi)容)</p><p><b>  設(shè)計體會</b></p><p>  進過此次的實驗,讓我對樹結(jié)構(gòu)及最優(yōu)二叉樹概念與操作的理解。</p><p>  在此次選擇赫夫曼編

77、碼操作的時候,本打算用赫夫曼編碼的程序?qū)ξ募M行壓縮存儲,可是限于不知道怎樣將生成的赫夫曼編碼進行bit級別的存儲(只知道進行Byte級別的存儲),所以壓縮存儲的想法失敗了,之后根據(jù)赫夫曼編碼的結(jié)構(gòu)及生成的文件,不得不讓我想到了文件的加密與解密,于是按著這個思路來設(shè)計了本文件加密解密系統(tǒng)。在設(shè)計的時候,曾準(zhǔn)備根據(jù)網(wǎng)上之前對26個英文字符的使用統(tǒng)計來事先對字符權(quán)重進行分配(這樣加密的文件可解密性增加了),而且考慮到文件中不僅有26個英文字

78、母,如果對各種字符的使用頻率進行統(tǒng)計,這個事先工作的負擔(dān)會很重,所以之后編寫了自動統(tǒng)計文本字符的頻率程序,這樣工作量會減小很多(而且文件的可解密性大大減小,但是也帶來了記錄密鑰的不方便)。</p><p>  總體感覺程序還行,就是代碼的簡潔性還是有點差,條理還是不那么清晰。</p><p><b>  參考文獻</b></p><p>  [

79、1]嚴(yán)蔚敏、吳偉明.數(shù)據(jù)結(jié)構(gòu).清華大學(xué)出版社.1997.4</p><p>  [2]Thomas H.Cormen、Charles E.Leiserson .算法導(dǎo)論.機械工業(yè)出版社.2006.9</p><p><b>  附:程序代碼</b></p><p>  #include<stdio.h></p><

80、;p>  #include<conio.h></p><p>  #include<string.h></p><p>  #include<stdlib.h></p><p><b>  //赫夫曼樹結(jié)構(gòu)</b></p><p>  typedef struct</p&g

81、t;<p><b>  {</b></p><p>  char data;</p><p>  int weight;</p><p>  int parent, lchild, rchild;</p><p>  }HuffmanTree; </p><p><b> 

82、 //字符權(quán)重結(jié)構(gòu)</b></p><p>  typedef struct</p><p><b>  {</b></p><p>  char data;</p><p>  int weight;</p><p><b>  }Static;</b><

83、/p><p>  //統(tǒng)計字符時所用到的鏈表結(jié)構(gòu)</p><p>  typedef struct node</p><p><b>  {</b></p><p>  char data;</p><p>  int number;</p><p>  struct node

84、 *next;</p><p><b>  }Data;</b></p><p><b>  //赫夫曼代碼結(jié)構(gòu)</b></p><p>  typedef char** HuffmanCode;</p><p><b>  //創(chuàng)建赫夫曼樹</b></p>&l

85、t;p>  void CreatHuffmanTree(HuffmanTree *&list, Static *info, int codeSize);</p><p><b>  //創(chuàng)建赫夫曼代碼</b></p><p>  void CreatHuffmanCode(HuffmanTree *list, HuffmanCode &code,

86、 int codeSize);</p><p>  //從文件中讀取數(shù)據(jù)并計算各字符出現(xiàn)頻率</p><p>  void DataCount(Static *&info);</p><p><b>  //文件編碼程序</b></p><p>  void FileEncoding();</p>

87、<p><b>  //創(chuàng)建文件編碼</b></p><p>  void CreatFileCoding();</p><p><b>  //導(dǎo)出編碼后文件</b></p><p>  void ExportFileEncoding(HuffmanTree *list, HuffmanCode code, i

88、nt codeSize);</p><p>  //導(dǎo)出文件中字符權(quán)重</p><p>  void ExportCharacterWeight();</p><p><b>  //文件譯碼程序</b></p><p>  void FileDecoding();</p><p>  //導(dǎo)入編

89、碼后的文件</p><p>  void InportFileCoding();</p><p>  //導(dǎo)入文件中字符權(quán)重</p><p>  void InportCharacterWeight();</p><p>  //顯示譯碼后的文件內(nèi)容</p><p>  void DisplayContext();&l

90、t;/p><p>  bool CompareData(char *tempCode, int &position);</p><p>  void Bound(char character, int size);</p><p><b>  //赫夫曼樹</b></p><p>  HuffmanTree *lis

91、t;</p><p><b>  //赫夫曼代碼</b></p><p>  HuffmanCode code;</p><p><b>  //字符權(quán)重信息</b></p><p>  Static *info;</p><p><b>  //字符種數(shù)</

92、b></p><p>  int codeSize;</p><p><b>  //文件名</b></p><p>  char fileName[30];</p><p>  int main()</p><p><b>  {</b></p><

93、;p>  char choice;</p><p>  while (true)</p><p><b>  {</b></p><p>  system("CLS");</p><p>  printf(" 赫夫曼編碼加密程序\n");</p><

94、p>  Bound('-', 25);</p><p>  printf(" 1. 文 件 編 碼 \n");</p><p>  printf(" 2. 文 件 譯 碼 \n");</p><p>  printf(" 0. 退 出 程 序 \n"

95、);</p><p>  Bound('-', 25);</p><p>  printf(" 請選擇: ");</p><p>  fflush(stdin);</p><p>  choice = getchar();</p><p>  switch (choice)</

96、p><p><b>  {</b></p><p><b>  case '1':</b></p><p>  FileEncoding();</p><p><b>  break;</b></p><p><b>  case

97、'2':</b></p><p>  FileDecoding();</p><p><b>  break;</b></p><p><b>  case '0':</b></p><p>  printf("\n");</p&

98、gt;<p>  system("PAUSE");</p><p><b>  return 0;</b></p><p><b>  break;</b></p><p><b>  default:</b></p><p>  printf

99、("\n 您的輸入有誤, 按任意鍵后請從新輸入!");</p><p><b>  getch();</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b>

100、;</p><p><b>  }</b></p><p>  void CreatHuffmanTree(HuffmanTree *&list, Static *info, int codeSize)</p><p><b>  {</b></p><p>  int i, j, limi

101、t;</p><p>  int lnode, rnode;</p><p>  int value1, value2;</p><p>  HuffmanTree *ptr;</p><p>  limit = codeSize * 2 - 1;</p><p>  if ((list = (HuffmanTree

102、*)malloc(sizeof(HuffmanTree) * limit)) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p>&

103、lt;b>  }</b></p><p>  for(i=0, ptr=list; i<codeSize; ++i, ++ptr)</p><p><b>  {</b></p><p>  ptr->data = info[i].data;</p><p>  ptr->weight

104、 = info[i].weight;</p><p>  ptr->parent = ptr->lchild = ptr->rchild = -1;</p><p><b>  }</b></p><p>  for(; i<limit; ++i, ++ptr)</p><p><b>

105、  {</b></p><p>  ptr->data = '0';</p><p>  ptr->weight = 0;</p><p>  ptr->parent = ptr->lchild = ptr->rchild = -1;</p><p><b>  }</

106、b></p><p>  for(i=codeSize; i<limit; ++i)</p><p><b>  {</b></p><p>  value1 = value2 = 32767;</p><p>  lnode = rnode = -1;</p><p>  for(j

107、=0; j<i; ++j)</p><p><b>  {</b></p><p>  if (list[j].parent == -1)</p><p><b>  {</b></p><p>  if (list[j].weight < value1)</p><

108、p><b>  {</b></p><p>  value2 = value1;</p><p>  rnode = lnode;</p><p>  value1 = list[j].weight;</p><p>  lnode = j;</p><p><b>  }<

109、/b></p><p>  else if (list[j].weight < value2)</p><p><b>  {</b></p><p>  value2 = list[j].weight;</p><p>  rnode = j;</p><p><b>  

110、}</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  list[lnode].parent = i;</p><p>  list[rnode].parent = i;</p><p>  list[i].

111、weight = list[lnode].weight + list[rnode].weight;</p><p>  list[i].lchild = lnode;</p><p>  list[i].rchild = rnode;</p><p><b>  }</b></p><p><b>  }<

112、;/b></p><p>  void CreatHuffmanCode(HuffmanTree *list, HuffmanCode &code, int codeSize)</p><p><b>  {</b></p><p>  int i, start;</p><p>  int flag1,

113、flag2; </p><p>  char *tempCode;</p><p>  if ((code = (char **)malloc(sizeof(char *) * codeSize)) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作

114、失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  if ((tempCode = (char *)malloc(sizeof(char) * codeSize)) == NULL)</p><p><b

115、>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  tempCode[codeSize-1] = '\

116、0';</p><p>  for(i=0; i<codeSize; ++i)</p><p><b>  {</b></p><p>  start = codeSize - 1;</p><p>  for(flag1=i, flag2=list[i].parent; flag2 != -1; flag

117、1=flag2, flag2=list[flag2].parent)</p><p><b>  {</b></p><p>  if (list[flag2].lchild == flag1)</p><p><b>  {</b></p><p>  tempCode[--start] = &#

118、39;0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  tempCode[--start] = '1';</p><p>&l

119、t;b>  }</b></p><p><b>  }</b></p><p>  if ((code[i] = (char *)malloc(sizeof(char) * (codeSize - start))) == NULL)</p><p><b>  {</b></p><p

120、>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  strcpy(code[i], &tempCode[start]);</p><p><

121、b>  }</b></p><p>  free(tempCode);</p><p><b>  }</b></p><p>  void DataCount(Static *&info)</p><p><b>  {</b></p><p>&

122、lt;b>  FILE *fp;</b></p><p><b>  char ch;</b></p><p>  char choice;</p><p>  int characterNumber, typeNumber;</p><p>  Data characterList;</p>

123、;<p>  Data *ptr, *current, *previous;</p><p>  system("CLS");</p><p>  printf("\n 請輸入需要打開的文件名稱: ");</p><p>  fflush(stdin);</p><p>  gets(fi

124、leName);</p><p>  while ((fp = fopen(fileName, "rb")) == NULL)</p><p><b>  {</b></p><p>  printf("\n 您需要打開的文件不存在, 是否需要重新打開(Y/N)? : ");</p><

125、;p>  fflush(stdin);</p><p>  choice = getchar();</p><p>  switch (choice)</p><p><b>  {</b></p><p><b>  case 'Y':</b></p><

126、p>  system("CLS");</p><p>  printf("\n 請輸入需要打開的文件名稱: ");</p><p>  fflush(stdin);</p><p>  gets(fileName);</p><p><b>  continue;</b>&

127、lt;/p><p><b>  case 'N':</b></p><p><b>  return;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><

128、;p><b>  }</b></p><p><b>  }</b></p><p>  characterNumber = typeNumber = 0;</p><p>  characterList.next = NULL;</p><p>  while ((ch = fgetc(fp

129、)) != EOF)</p><p><b>  {</b></p><p>  current = characterList.next;</p><p>  if (current == NULL)</p><p><b>  {</b></p><p>  if ((p

130、tr = (Data *)malloc(sizeof(Data))) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作失敗!\n");</p><p><b>  exit(0);</b></p><p><b

131、>  }</b></p><p>  ptr->data = ch;</p><p>  ptr->number = 1;</p><p>  ptr->next = characterList.next;</p><p>  characterList.next = ptr;</p><

132、;p>  ++typeNumber;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while ((current != NULL) && (current

133、->data != ch))</p><p><b>  {</b></p><p>  previous = current;</p><p>  current = current->next;</p><p><b>  }</b></p><p>  if

134、 (current != NULL)</p><p><b>  {</b></p><p>  ++(current->number);</p><p>  ++characterNumber;</p><p><b>  }</b></p><p><b>

135、;  else</b></p><p><b>  {</b></p><p>  if ((ptr = (Data *)malloc(sizeof(Data))) == NULL)</p><p><b>  {</b></p><p>  printf(" 內(nèi)存不足, 操作

136、失敗!\n");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  ptr->data = ch;</p><p>  ptr->number = 1;</p><p>  ptr->

137、next = current;</p><p>  previous->next = ptr;</p><p>  ++typeNumber;</p><p>  ++characterNumber;</p><p><b>  }</b></p><p><b>  }</

138、b></p><p><b>  }</b></p><p>  fclose(fp);</p><p>  codeSize = typeNumber;</p><p>  info = (Static *)malloc(sizeof(Static) * codeSize);</p><p&g

139、t;  current = characterList.next;</p><p>  for (int i=0; i<codeSize; ++i)</p><p><b>  {</b></p><p>  info[i].data = current->data;</p><p>  info[i].we

140、ight = (int)(current->number * 100.0 / characterNumber);</p><p>  current = current->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  vo

141、id FileEncoding()</p><p><b>  {</b></p><p>  char choice;</p><p>  while (true)</p><p><b>  {</b></p><p>  system("CLS");

142、</p><p>  printf(" 文件編碼程序\n");</p><p>  Bound('-', 25);</p><p>  printf(" 1. 創(chuàng) 建 文 件 編 碼 \n");</p><p>  printf(" 2. 導(dǎo) 出 文 件 編 碼 \n

143、");</p><p>  printf(" 3. 導(dǎo) 出 文 件 密 鑰 \n");</p><p>  printf(" 0. 返 回 主 菜 單 \n");</p><p>  Bound('-', 25);</p><p>  printf(" 請選擇: &q

144、uot;);</p><p>  fflush(stdin);</p><p>  choice = getchar();</p><p>  switch (choice)</p><p><b>  {</b></p><p><b>  case '1':</

溫馨提示

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

最新文檔

評論

0/150

提交評論