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

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設(shè) 計</b></p><p>  課程名稱_ _數(shù)據(jù)結(jié)構(gòu)課程設(shè)計_ </p><p>  題目名稱_ 哈夫曼編碼譯碼器_ </p><p>  學(xué)生學(xué)院 </p><p>  專業(yè)班級

2、 </p><p>  學(xué) 號 </p><p>  學(xué)生姓名 </p><p>  指導(dǎo)教師 </p><p>  2011 年 12月 23日</p>

3、<p><b>  摘要:</b></p><p>  在當(dāng)今信息爆炸時代,如何采用有效的數(shù)據(jù)壓縮技術(shù)來節(jié)省數(shù)據(jù)文件的存儲空間和計算機網(wǎng)絡(luò)的傳送時間已越來越引起人們的重視。電報通信是傳遞文字的二進制碼形式的字符串。但在信息傳遞時,總希望總長度盡可能最短,即采用最短碼。</p><p><b>  關(guān)鍵字:</b></p>

4、<p>  哈夫曼樹 編碼 解碼 數(shù)據(jù)壓縮技術(shù)</p><p><b>  目 錄</b></p><p><b>  摘要:1</b></p><p><b>  關(guān)鍵字:1</b></p><p>  第一章 需求分析3</p

5、><p>  第二章 數(shù)據(jù)結(jié)構(gòu)定義及其操作實現(xiàn)3</p><p>  第三章 程序設(shè)計及其實現(xiàn)3</p><p>  3.1 從文件讀入原文3</p><p>  3.2 統(tǒng)計原文中各字符的權(quán)值4</p><p><b>  3.3 編碼5</b></p><p>

6、;  3.4 解碼6</p><p><b>  3.5 主函數(shù)7</b></p><p>  第四章 運行結(jié)果及其分析8</p><p>  第五章 問題及其解決方法10</p><p>  第六章 心得體會(設(shè)計總結(jié))10</p><p>  附錄——源程序11</p&g

7、t;<p><b>  1、 頭文件11</b></p><p>  2、 赫夫曼編碼算法12</p><p><b>  3、 主函數(shù)18</b></p><p>  參 考 文 獻21</p><p><b>  需求分析</b></p&g

8、t;<p>  1.問題要求:打開一篇英文文章,統(tǒng)計出每個字符出現(xiàn)的次數(shù),然后以他們?yōu)闄?quán)值,對每個字符進行編碼,編碼完成后對其編碼進行譯碼。</p><p>  程序運行環(huán)境:windows、visual c++或java等</p><p><b>  要求:</b></p><p>  輸入一篇英文文章,根據(jù)字符出現(xiàn)的次數(shù)給出哈

9、夫曼編碼方式。</p><p>  對英文文章進行編碼;</p><p>  對編碼進行譯碼核對正確性</p><p>  數(shù)據(jù)結(jié)構(gòu)定義及其操作實現(xiàn)</p><p>  2.1 哈弗曼樹節(jié)點</p><p>  typedef struct </p><p><b>  {</b

10、></p><p>  unsigned int weight;</p><p>  unsigned int parent;</p><p>  unsigned int lchild;</p><p>  unsigned int rchild;</p><p>  }HuffTreeNode,*HuffTr

11、ee;</p><p>  2.2 字符-權(quán)值-編碼映射</p><p>  typedef struct</p><p><b>  {</b></p><p><b>  char c;</b></p><p>  unsigned int weight;</p&g

12、t;<p>  char *code;</p><p>  }CharMapNode,*CharMap;</p><p><b>  程序設(shè)計及其實現(xiàn)</b></p><p>  3.1 從文件讀入原文</p><p>  void Huffman::ReadTextFromFile(char *filen

13、ame)</p><p><b>  {</b></p><p>  ifstream infile(filename);</p><p>  if(!infile)</p><p><b>  {</b></p><p>  cerr << "無法打開

14、文件!" <<endl;</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  char c;</b></p><p>  while(infile.get(c))</p>&

15、lt;p><b>  {</b></p><p>  text += c;</p><p><b>  }</b></p><p><b>  } </b></p><p>  3.2 統(tǒng)計原文中各字符的權(quán)值</p><p>  void Huf

16、fman::CountCharsWeight()</p><p><b>  {</b></p><p>  if (text.empty())</p><p><b>  return;</b></p><p>  if (chars != NULL)</p><p>  

17、delete chars;</p><p>  int i = 0;</p><p><b>  n = 0;</b></p><p>  chars = new CharMapNode[2];</p><p>  chars[1].c = text[i];</p><p>  chars[1].

18、weight = 1;</p><p><b>  ++n;</b></p><p>  for (i = 1; i != text.size(); ++i)</p><p><b>  {</b></p><p><b>  int j;</b></p><

19、;p>  for (j = 1; j <= n; ++j)//遍歷當(dāng)前字符表,如果已存在該字符,權(quán)值+1</p><p><b>  {</b></p><p>  if (text[i] == chars[j].c)</p><p><b>  {</b></p><p>  ++c

20、hars[j].weight;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (j > n)//該字符不存在,添加該字符</p><p&g

21、t;<b>  {</b></p><p><b>  ++n;</b></p><p>  CharMap newchars = new CharMapNode[n + 1];</p><p>  memcpy(newchars, chars, n * sizeof(CharMapNode));</p>&

22、lt;p>  delete chars;</p><p>  chars = newchars;</p><p>  chars[n].c = text[i];</p><p>  chars[n].weight = 1;</p><p><b>  }</b></p><p><b&

23、gt;  }</b></p><p><b>  }</b></p><p><b>  3.3 編碼</b></p><p>  void Huffman::MakeCharMap()</p><p><b>  {</b></p><p&g

24、t;  if (n <= 1)</p><p><b>  return;</b></p><p>  int m = 2 * n - 1;//哈弗曼樹所需節(jié)點數(shù)</p><p>  huffTree = new HuffTreeNode[m+1];//0號單元未使用</p><p><b>  

25、//初始化</b></p><p><b>  int i;</b></p><p>  for (i = 1; i <= n; ++i)</p><p><b>  {</b></p><p>  huffTree[i].weight = chars[i].weight;<

26、/p><p>  huffTree[i].parent = 0;</p><p>  huffTree[i].lchild = 0;</p><p>  huffTree[i].rchild = 0;</p><p><b>  }</b></p><p>  for (i = n + 1; i &l

27、t;= m; ++i)</p><p><b>  {</b></p><p>  huffTree[i].weight = 0;</p><p>  huffTree[i].parent = 0;</p><p>  huffTree[i].lchild = 0;</p><p>  huffT

28、ree[i].rchild = 0;</p><p><b>  }</b></p><p><b>  //建哈弗曼樹</b></p><p>  for (i = n + 1; i <= m; ++i)</p><p><b>  {</b></p>&

29、lt;p>  int s1,s2;</p><p>  select(i - 1, s1, s2);</p><p>  huffTree[s1].parent = huffTree[s2].parent = i;</p><p>  huffTree[i].lchild = s1;</p><p>  huffTree[i].rchi

30、ld = s2;</p><p>  huffTree[i].weight = huffTree[s1].weight + huffTree[s2].weight;</p><p><b>  }</b></p><p>  //從葉子到根節(jié)點逆向求每個字符的哈弗曼編碼</p><p>  char *cd = new

31、char[n];//分配求編碼的工作空間(每個字符編碼結(jié)果最長n-1再加上'\0')</p><p>  cd[n-1] = '\0';//編碼結(jié)束符</p><p>  for(i = 1; i <= n; ++i)//逐個字符求哈弗曼編碼</p><p><b>  {</b></p&

32、gt;<p>  int start = n - 1;</p><p><b>  int c,f;</b></p><p>  //從葉子到根逆向求編碼</p><p>  for (c = i, f = huffTree[i].parent; f != 0; c = f, f = huffTree[f].parent)<

33、/p><p><b>  {</b></p><p>  if (huffTree[f].lchild == c)//左孩子編碼為0</p><p>  cd[--start] = '0';</p><p>  else//右孩子編碼為1</p><p>  cd[--

34、start] = '1';</p><p><b>  }</b></p><p>  chars[i].code = new char[n - start];//為第i個字符編碼分配空間</p><p>  strcpy(chars[i].code,&cd[start]);</p><p>&

35、lt;b>  }</b></p><p>  delete cd;</p><p><b>  }</b></p><p><b>  3.4 解碼</b></p><p>  void Huffman::Decode()</p><p><b&g

36、t;  {</b></p><p>  text = "";</p><p>  string::size_type i,count;</p><p>  for (i = 0; i < code.size(); i += count)</p><p><b>  {</b><

37、/p><p>  //每個字符的編碼結(jié)果最長n-1,從1至n-1依次嘗試</p><p>  for (count = 1; count < n; ++count)</p><p><b>  {</b></p><p>  for (int j = 1; j <= n; ++j)</p><

38、p>  if (code.substr(i, count) == chars[j].code)</p><p><b>  {</b></p><p>  text += chars[j].c;</p><p>  goto next;</p><p><b>  }</b></p>

39、;<p><b>  }</b></p><p><b>  next:</b></p><p><b>  ;</b></p><p><b>  }</b></p><p><b>  }</b></p>

40、<p><b>  3.5 主函數(shù)</b></p><p>  int main()</p><p><b>  {</b></p><p>  cout << " ********************************************************

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

42、 哈夫曼編碼譯碼器 *" << endl;</p><p>  cout << " * 1、打開一篇英文文章或輸入一篇文章 *"<< endl;</p><p>  cout << " *

43、 2、根據(jù)字符出現(xiàn)的次數(shù)以他們?yōu)闄?quán)值給出哈夫曼編碼方式 *" << endl;</p><p>  cout << " * 3、對英文文章進行編碼 *" << endl;</p><p>  cout << "

44、 * 4、對編碼進行譯碼核對正確性 *" << endl;</p><p>  cout << " * *" << endl;</p><p&

45、gt;  cout << " ************************************************************" << endl<<endl;</p><p>  system("pause");</p><p>  cout << endl;</

46、p><p>  Huffman huffman;</p><p>  huffman.ReadTextFromFile("text.txt");</p><p>  cout << "程序自動統(tǒng)計字符和權(quán)值" << endl;</p><p>  huffman.CountChars

47、Weight();</p><p>  cout << endl;</p><p>  cout << "字符及對應(yīng)權(quán)值:" << endl;</p><p>  huffman.PrintCharWeight();</p><p>  cout << endl;</p

48、><p>  system("pause");</p><p>  cout << endl;</p><p>  huffman.MakeCharMap();</p><p>  cout << "字符及對應(yīng)編碼:" << endl;</p><p&

49、gt;  huffman.PrintCharCode();</p><p>  cout << endl;</p><p>  system("pause");</p><p>  cout << endl;</p><p>  cout << "對原文進行編碼:"

50、<< endl;</p><p>  cout << "原文:" << endl;</p><p>  huffman.PrintText();</p><p>  huffman.Encode();</p><p>  cout << endl;</p>&l

51、t;p>  cout << "編碼:" << endl;</p><p>  huffman.PrintCode();</p><p>  huffman.SaveCodeToFile("code.txt");</p><p>  cout << endl;</p>&l

52、t;p>  system("pause");</p><p>  cout << endl;</p><p>  cout << "對編碼進行解碼:" << endl;</p><p>  huffman.ReadCodeFromFile("code.txt");&

53、lt;/p><p>  cout << "編碼:" << endl;</p><p>  huffman.PrintCode();</p><p>  huffman.Decode();</p><p>  cout << endl;</p><p>  cout &

54、lt;< "原文:" << endl;</p><p>  huffman.PrintText();</p><p>  huffman.SaveTextToFile("resulttext.txt");</p><p>  cout << endl;</p><p>&l

55、t;b>  return 0;</b></p><p><b>  }</b></p><p><b>  運行結(jié)果及其分析</b></p><p>  本次測試是先建立一個名為test.txt的文本文檔,內(nèi)容為:This is my HuffmanCoding.</p><p>

56、  運行程序,結(jié)果如圖:</p><p><b>  問題及其解決方法</b></p><p>  編碼不熟練,經(jīng)常出現(xiàn)漏符號或多符號,多次調(diào)試改正</p><p>  C++不熟練,讀取保存文件出錯,回歸課本,改正代碼</p><p>  心得體會(設(shè)計總結(jié))</p><p>  在課程設(shè)計過程

57、中,我們每個人選擇一個課題,認真研究,根據(jù)課堂講授內(nèi)容,借助書本,自己動手實踐。這樣不但有助于我們消化課堂所講解的內(nèi)容,還可以增強我們的獨立思考能力和動手能力;通過編寫實驗代碼和調(diào)試運行,我們可以逐步積累調(diào)試C程序的經(jīng)驗并逐漸培養(yǎng)我們的編程能力、用計算機解決實際問題的能力。</p><p>  在課程設(shè)計過程中,我們不但有自己的獨立思考,還借助各種參考文獻來幫助我們完成系統(tǒng)。更為重要的是,我們同學(xué)之間加強了交流,

58、在對問題的認識方面可以交換不同的意見。</p><p>  數(shù)據(jù)結(jié)構(gòu)課程具有比較強的理論性,同時也具有較強的可應(yīng)用性和實踐性。課程設(shè)計是一個重要的教學(xué)環(huán)節(jié)。我們在一般情況下都能夠重視實驗環(huán)節(jié),但是容易忽略實驗的總結(jié),忽略實驗報告的撰寫。通過這次實驗讓我們明白:作為一名大學(xué)生必須嚴(yán)格訓(xùn)練分析總結(jié)能力、書面表達能力。需要逐步培養(yǎng)書寫科學(xué)實驗報告以及科技論文的能力。只有這樣,我們的綜合素質(zhì)才會有好的提高。</p&

59、gt;<p><b>  附錄——源程序</b></p><p><b>  頭文件</b></p><p>  // Huffman.h</p><p>  #pragma once</p><p>  #endif // _MSC_VER > 1000</p>

60、<p>  #include <string></p><p>  /***********************數(shù)據(jù)結(jié)構(gòu)***********************/</p><p><b>  //哈弗曼樹節(jié)點</b></p><p>  typedef struct </p><p>&l

61、t;b>  {</b></p><p>  unsigned int weight;</p><p>  unsigned int parent;</p><p>  unsigned int lchild;</p><p>  unsigned int rchild;</p><p>  }Huff

62、TreeNode,*HuffTree;</p><p>  //字符-權(quán)值-編碼映射</p><p>  typedef struct</p><p><b>  {</b></p><p><b>  char c;</b></p><p>  unsigned int w

63、eight;</p><p>  char *code;</p><p>  }CharMapNode,*CharMap;</p><p>  /*************************類定義****************************/</p><p>  class Huffman </p><

64、p><b>  {</b></p><p><b>  private:</b></p><p>  void select(int n, int &s1, int &s2);</p><p>  HuffTree huffTree;//哈弗曼樹</p><p>  Char

65、Map chars;//字符表</p><p>  int n;//字符數(shù)</p><p>  std::string text;//原文</p><p>  std::string code;//編碼</p><p><b>  public:</b></p><p>  

66、void InputCharsWeight();</p><p>  void CountCharsWeight();</p><p>  void Decode();</p><p>  void ReadTextFromFile(char *filename);</p><p>  void ReadCodeFromFile(char *

67、filename);</p><p>  void SaveTextToFile(char *filename);</p><p>  void SaveCodeToFile(char *filename);</p><p>  void PrintCode();</p><p>  void MakeCharMap();</p>

68、<p>  void PrintText();</p><p>  void PrintCharCode();</p><p>  void PrintCharWeight();</p><p>  void SetCharMap(CharMap m, int number);</p><p>  void Encode();

69、</p><p>  Huffman();</p><p>  virtual ~Huffman();</p><p><b>  };</b></p><p><b>  赫夫曼編碼算法</b></p><p>  // Huffman.cpp</p><

70、;p>  #include "Huffman.h"</p><p>  #include <iostream></p><p>  #include <fstream></p><p>  using namespace std;</p><p>  Huffman::Huffman()<

71、;/p><p><b>  {</b></p><p>  huffTree = NULL;</p><p>  chars = NULL;</p><p><b>  n = 0;</b></p><p><b>  }</b></p>&l

72、t;p>  Huffman::~Huffman()</p><p><b>  {</b></p><p><b>  }</b></p><p>  void Huffman::Encode()</p><p><b>  {</b></p><p&

73、gt;  code = "";</p><p>  for (string::size_type i = 0; i != text.size(); ++i)</p><p><b>  {</b></p><p>  for (int j = 1; j <= n; ++j)</p><p>  

74、if (chars[j].c == text[i])</p><p>  code += chars[j].code;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Huffman::SetCharMap(CharMap m, int

75、number)</p><p><b>  {</b></p><p>  chars = m;</p><p>  n = number;</p><p><b>  }</b></p><p>  void Huffman::select(int n, int &

76、s1, int &s2)</p><p><b>  {</b></p><p>  s1 = s2 = 0;</p><p>  for (int i = 1; i <= n; ++i)</p><p><b>  {</b></p><p>  if (hu

77、ffTree[i].parent != 0)</p><p><b>  continue;</b></p><p>  if (s1 == 0)</p><p><b>  s1 = i;</b></p><p>  else if (s2 == 0)</p><p>&l

78、t;b>  {</b></p><p>  if (huffTree[i].weight < huffTree[s1].weight)</p><p><b>  {</b></p><p><b>  s2 = s1;</b></p><p><b>  s1 =

79、 i;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  s2 = i;</b></p><p><b>  }</b></p><p><b

80、>  else</b></p><p><b>  {</b></p><p>  if (huffTree[i].weight < huffTree[s1].weight)</p><p><b>  {</b></p><p><b>  s2 = s1;<

81、;/b></p><p><b>  s1 = i;</b></p><p><b>  }</b></p><p>  else if (huffTree[i].weight < huffTree[s2].weight)</p><p><b>  s2 = i;</b

82、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Huffman::PrintCharWeight()</p><p><b>  {

83、</b></p><p>  for (int i = 1; i <= n; ++i)</p><p><b>  {</b></p><p>  switch (chars[i].c)</p><p><b>  {</b></p><p>  case

84、'\t':</p><p>  cout << "\\t";</p><p><b>  break;</b></p><p>  case '\n':</p><p>  cout << "\\n";</p>

85、<p><b>  break;</b></p><p><b>  default:</b></p><p>  cout << chars[i].c;</p><p><b>  break;</b></p><p><b>  }</

86、b></p><p>  cout << "——" << chars[i].weight << endl;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Huffman::P

87、rintCharCode()</p><p><b>  {</b></p><p>  for (int i = 1; i <= n; ++i)</p><p><b>  {</b></p><p>  switch (chars[i].c)</p><p><

88、;b>  {</b></p><p>  case '\t':</p><p>  cout << "\\t";</p><p><b>  break;</b></p><p>  case '\n':</p><p&

89、gt;  cout << "\\n";</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  cout << chars[i].c;</p><p><b>  break;&

90、lt;/b></p><p><b>  }</b></p><p>  cout << "——" << chars[i].code << endl;</p><p><b>  }</b></p><p><b>  }<

91、;/b></p><p>  void Huffman::PrintText()</p><p><b>  {</b></p><p>  cout << text << endl;</p><p><b>  }</b></p><p>  

92、void Huffman::PrintCode()</p><p><b>  {</b></p><p>  cout << code << endl;</p><p><b>  }</b></p><p>  void Huffman::MakeCharMap()<

93、;/p><p><b>  {</b></p><p>  if (n <= 1)</p><p><b>  return;</b></p><p>  int m = 2 * n - 1;</p><p>  huffTree = new HuffTreeNode[

94、m+1];</p><p><b>  int i;</b></p><p>  for (i = 1; i <= n; ++i)</p><p><b>  {</b></p><p>  huffTree[i].weight = chars[i].weight;</p>&

95、lt;p>  huffTree[i].parent = 0;</p><p>  huffTree[i].lchild = 0;</p><p>  huffTree[i].rchild = 0;</p><p><b>  }</b></p><p>  for (i = n + 1; i <= m; ++

96、i)</p><p><b>  {</b></p><p>  huffTree[i].weight = 0;</p><p>  huffTree[i].parent = 0;</p><p>  huffTree[i].lchild = 0;</p><p>  huffTree[i].rc

97、hild = 0;</p><p><b>  }</b></p><p>  for (i = n + 1; i <= m; ++i)</p><p><b>  {</b></p><p>  int s1,s2;</p><p>  select(i - 1, s

98、1, s2);</p><p>  huffTree[s1].parent = huffTree[s2].parent = i;</p><p>  huffTree[i].lchild = s1;</p><p>  huffTree[i].rchild = s2;</p><p>  huffTree[i].weight = huffTr

99、ee[s1].weight + huffTree[s2].weight;</p><p><b>  }</b></p><p>  char *cd = new char[n];</p><p>  cd[n-1] = '\0';</p><p>  for(i = 1; i <= n;

100、++i)</p><p><b>  {</b></p><p>  int start = n - 1;</p><p><b>  int c,f;</b></p><p>  for (c = i, f = huffTree[i].parent; f != 0; c = f, f = hu

101、ffTree[f].parent)</p><p><b>  {</b></p><p>  if (huffTree[f].lchild == c)</p><p>  cd[--start] = '0';</p><p>  else</p><p>  cd

102、[--start] = '1';</p><p><b>  }</b></p><p>  chars[i].code = new char[n - start];</p><p>  strcpy(chars[i].code,&cd[start]);</p><p><b>  }&

103、lt;/b></p><p>  delete cd;</p><p><b>  }</b></p><p>  void Huffman::ReadTextFromFile(char *filename)</p><p><b>  {</b></p><p>  

104、ifstream infile(filename);</p><p>  if(!infile)</p><p><b>  {</b></p><p>  cerr << "無法打開文件!" <<endl;</p><p><b>  return;</b&g

105、t;</p><p><b>  }</b></p><p><b>  char c;</b></p><p>  while(infile.get(c))</p><p><b>  {</b></p><p>  text += c;</p&

106、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  void Huffman::SaveCodeToFile(char *filename)</p><p><b>  {</b></p><p>  ofstream

107、 outfile(filename);</p><p>  if (!outfile)</p><p><b>  {</b></p><p>  cerr << "保存文件出錯!" << endl;</p><p><b>  return;</b>&l

108、t;/p><p><b>  }</b></p><p>  outfile << code;</p><p><b>  }</b></p><p>  void Huffman::ReadCodeFromFile(char *filename)</p><p>&

109、lt;b>  {</b></p><p>  ifstream infile(filename);</p><p>  if (!infile)</p><p><b>  {</b></p><p>  cerr << "無法打開文件!" <<endl;&l

110、t;/p><p><b>  return;</b></p><p><b>  }</b></p><p>  infile >> code;</p><p><b>  }</b></p><p>  void Huffman::Decode

111、()</p><p><b>  {</b></p><p>  text = "";</p><p>  string::size_type i,count;</p><p>  for (i = 0; i < code.size(); i += count)</p><p

112、><b>  {</b></p><p>  for (count = 1; count < n; ++count)</p><p><b>  {</b></p><p>  for (int j = 1; j <= n; ++j)</p><p>  if (code.subs

113、tr(i, count) == chars[j].code)</p><p><b>  {</b></p><p>  text += chars[j].c;</p><p>  goto next;</p><p><b>  }</b></p><p><b>

114、;  }</b></p><p><b>  next:</b></p><p><b>  ;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void Hu

115、ffman::CountCharsWeight()</p><p><b>  {</b></p><p>  if (text.empty())</p><p><b>  return;</b></p><p>  if (chars != NULL)</p><p> 

116、 delete chars;</p><p>  int i = 0;</p><p><b>  n = 0;</b></p><p>  chars = new CharMapNode[2];</p><p>  chars[1].c = text[i];</p><p>  chars[1]

117、.weight = 1;</p><p><b>  ++n;</b></p><p>  for (i = 1; i != text.size(); ++i)</p><p><b>  {</b></p><p><b>  int j;</b></p>&l

118、t;p>  for (j = 1; j <= n; ++j)</p><p><b>  {</b></p><p>  if (text[i] == chars[j].c)</p><p><b>  {</b></p><p>  ++chars[j].weight;</p&

119、gt;<p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (j > n)</p><p><b>  {</b></p>&

120、lt;p><b>  ++n;</b></p><p>  CharMap newchars = new CharMapNode[n + 1];</p><p>  memcpy(newchars, chars, n * sizeof(CharMapNode));</p><p>  delete chars;</p>&l

121、t;p>  chars = newchars;</p><p>  chars[n].c = text[i];</p><p>  chars[n].weight = 1;</p><p><b>  }</b></p><p><b>  }</b></p><p>

122、<b>  }</b></p><p>  void Huffman::SaveTextToFile(char *filename)</p><p><b>  {</b></p><p>  ofstream outfile(filename);</p><p>  if (!outfile)&l

123、t;/p><p><b>  {</b></p><p>  cerr << "保存文件出錯!" << endl;</p><p><b>  return;</b></p><p><b>  }</b></p><

124、p>  outfile << text;</p><p><b>  }</b></p><p><b>  主函數(shù)</b></p><p>  //main.cpp</p><p>  #include <iostream></p><p> 

125、 #include "Huffman.h"</p><p>  using namespace std;</p><p>  int main()</p><p><b>  {</b></p><p>  cout << " *********************

126、***************************************" << endl;</p><p>  cout << " * *" << endl;</p><p>  cout &l

127、t;< " * 哈夫曼編碼譯碼器 *" << endl;</p><p>  cout << " * 1、打開一篇英文文章或輸入一篇文章 *"<< endl;</p><

128、;p>  cout << " * 2、根據(jù)字符出現(xiàn)的次數(shù)以他們?yōu)闄?quán)值給出哈夫曼編碼方式 *" << endl;</p><p>  cout << " * 3、對英文文章進行編碼 *" << endl;</p>

129、<p>  cout << " * 4、對編碼進行譯碼核對正確性 *" << endl;</p><p>  cout << " * *&quo

130、t; << endl;</p><p>  cout << " ************************************************************" << endl<<endl;</p><p>  system("pause");</p>

131、<p>  cout << endl;</p><p>  Huffman huffman;</p><p>  huffman.ReadTextFromFile("text.txt");</p><p>  cout << "程序自動統(tǒng)計字符和權(quán)值" << endl;</p

132、><p>  huffman.CountCharsWeight();</p><p>  cout << endl;</p><p>  cout << "字符及對應(yīng)權(quán)值:" << endl;</p><p>  huffman.PrintCharWeight();</p>&

133、lt;p>  cout << endl;</p><p>  system("pause");</p><p>  cout << endl;</p><p>  huffman.MakeCharMap();</p><p>  cout << "字符及對應(yīng)編碼:&quo

134、t; << endl;</p><p>  huffman.PrintCharCode();</p><p>  cout << endl;</p><p>  system("pause");</p><p>  cout << endl;</p><p>  

135、cout << "對原文進行編碼:" << endl;</p><p>  cout << "原文:" << endl;</p><p>  huffman.PrintText();</p><p>  huffman.Encode();</p><p>

136、  cout << endl;</p><p>  cout << "編碼:" << endl;</p><p>  huffman.PrintCode();</p><p>  huffman.SaveCodeToFile("code.txt");</p><p>

137、  cout << endl;</p><p>  system("pause");</p><p>  cout << endl;</p><p>  cout << "對編碼進行解碼:" << endl;</p><p>  huffman.ReadC

138、odeFromFile("code.txt");</p><p>  cout << "編碼:" << endl;</p><p>  huffman.PrintCode();</p><p>  huffman.Decode();</p><p>  cout <<

139、 endl;</p><p>  cout << "原文:" << endl;</p><p>  huffman.PrintText();</p><p>  huffman.SaveTextToFile("resulttext.txt");</p><p>  cout &l

140、t;< endl;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  參 考 文 獻</p><p>  [1] 嚴(yán)蔚敏,數(shù)據(jù)結(jié)構(gòu)(C語言版),清華大學(xué)出版社,2007</p><p>  [2]

溫馨提示

  • 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

提交評論