欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      數(shù)據(jù)結(jié)構實驗三哈夫曼樹實驗報告

      時間:2019-05-12 08:38:58下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《數(shù)據(jù)結(jié)構實驗三哈夫曼樹實驗報告》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數(shù)據(jù)結(jié)構實驗三哈夫曼樹實驗報告》。

      第一篇:數(shù)據(jù)結(jié)構實驗三哈夫曼樹實驗報告

      實驗報告3:哈夫曼編/譯碼器

      題目:哈夫曼編/譯碼器

      一、題目要求:

      寫一個哈夫曼碼的編/譯碼系統(tǒng),要求能對要傳輸?shù)膱笪倪M行編碼和解碼。構造哈夫曼樹時,權值小的放左子樹,權值大的放右子樹,編碼時右子樹編碼為1,左子樹編碼為0.二、概要設計:

      數(shù)據(jù)結(jié)構:

      typedef struct { int bit[MAXBIT];int start;} HCodeType;/* 編碼結(jié)構體 */

      typedef struct { int weight;int parent;int lchild;int rchild;char value;} HNode;/* 結(jié)點結(jié)構體 */ 函數(shù):

      void DEMONHuffmanTree(HNode HuffNode[MAXNODE], int n)作用:構造一個哈夫曼樹,并循環(huán)構建 int main()作用:運用已經(jīng)構建好的哈弗曼樹,進行節(jié)點的處理,達到成功解碼編譯

      三、詳細設計: 哈夫曼樹的建立:

      void DEMONHuffmanTree(HNode HuffNode[MAXNODE], int n){

      int i = 0, j, m1, m2, x1, x2;

      char x;

      /* 初始化存放哈夫曼樹數(shù)組 HuffNode[] 中的結(jié)點 */

      while(i

      {

      HuffNode[i].weight = 0;//權值 實驗報告3:哈夫曼編/譯碼器

      HuffNode[i].parent =-1;

      HuffNode[i].lchild =-1;

      HuffNode[i].rchild =-1;

      scanf(“%c”,&x);

      scanf(“%c”,&HuffNode[i].value);//實際值,可根據(jù)情況替換為字母

      i++;

      }

      /* 輸入 n 個葉子結(jié)點的權值 */ scanf(“%c”,&x);for(i=0;i

      {

      scanf(“%d”, &HuffNode[i].weight);

      }

      for(i=n;i<2*n-1;i++)

      {

      HuffNode[i].weight = 0;//權值

      HuffNode[i].parent =-1;

      HuffNode[i].lchild =-1;

      HuffNode[i].rchild =-1;

      HuffNode[i].value=i;

      }

      /* 循環(huán)構造 Huffman 樹 */

      for(i=0;i

      {

      m1=m2=MAXQZ;

      // m1、m2中存放兩個無父結(jié)點且結(jié)點權值最小的兩個結(jié)點

      x1=x2=0;//找出所有結(jié)點中權值最小、無父結(jié)點的兩個結(jié)點,并合并之為一顆二叉樹

      for(j=0;j

      {

      if(HuffNode[j].weight < m1 && HuffNode[j].parent==-1)

      {

      m2=m1;//m1中是最小

      x2=x1;

      m1=HuffNode[j].weight;

      x1=j;

      }

      else if(HuffNode[j].weight < m2 && HuffNode[j].parent==-1)

      {

      m2=HuffNode[j].weight;

      x2=j;

      }

      實驗報告3:哈夫曼編/譯碼器

      } /* end for */

      /* 設置找到的兩個子結(jié)點 x1、x2 的父結(jié)點信息 */

      HuffNode[x1].parent = n+i;

      HuffNode[x2].parent = n+i;

      HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;

      HuffNode[n+i].lchild = x1;

      HuffNode[n+i].rchild = x2;

      } }

      葉子節(jié)點的哈夫曼編碼的保存: for(j=cd.start+1;j

      HuffCode[i].bit[j] = cd.bit[j];

      HuffCode[i].start = cd.start;

      主函數(shù)展示: int main(){

      HNode HuffNode[MAXNODE];

      HCodeType HuffCode[MAXLEAF],cd;

      int i, j, c, p, n,k=0;

      char wen[100];

      char z;

      scanf(“%d”, &n);

      HuffmanTree(HuffNode, n);

      for(i=0;i < n;i++)

      {

      cd.start = n-1;

      c = i;

      p = HuffNode[c].parent;

      while(p!=-1)

      /* 父結(jié)點存在 */

      {

      if(HuffNode[p].lchild == c)

      cd.bit[cd.start] = 0;

      else

      cd.bit[cd.start] = 1;

      cd.start--;

      /* 求編碼的低一位 */

      c=p;

      p=HuffNode[c].parent;

      /* 設置下一循環(huán)條件 */

      } /* end while */ 實驗報告3:哈夫曼編/譯碼器

      for(j=cd.start+1;j

      HuffCode[i].bit[j] = cd.bit[j];

      HuffCode[i].start = cd.start;

      } /* end for */

      z=getchar();

      z=getchar();

      for(;z!='n';z=getchar()){

      wen[k++]=z;

      for(i=0;i

      {

      if(z==HuffNode[i].value)

      {

      for(j=HuffCode[i].start+1;j < n;j++)

      printf(“%d”, HuffCode[i].bit[j]);

      break;

      }

      else;

      } } printf(“n”);for(i=0;i

      {

      printf(“%c”,wen[i]);

      }

      printf(“n”);

      return 0;}

      四、調(diào)試分析與心得體會:

      雖然哈夫曼樹的建立有書上的參考,但是實際寫整個代碼的時候還是問題重重。首先就是哈弗曼樹忘記了初始的賦值,導致最后出現(xiàn)了問題。這樣的錯誤還是很容易解決,但是之后就出現(xiàn)了WA的情況。在同學的幫助下,最后發(fā)現(xiàn)是因為在選取節(jié)點的時候,循環(huán)出現(xiàn)了問題,雖然看起來編譯沒有錯,但是邊緣情況就會出現(xiàn)數(shù)據(jù)錯誤,這個還是很令人警醒,而這種思考的不全面的問題,在debug的過程中會耗去大量的時間,這是要注意的。

      五、用戶操作說明:

      輸入表示字符集大小為n(n <= 100)的正整數(shù),以及n個字符和n個權值(正整數(shù),值

      越大表示該字符出現(xiàn)的概率越大); 輸入串長小于或等于100的目標報文。實驗報告3:哈夫曼編/譯碼器

      六、運行結(jié)果:

      附帶自己的算法完成的結(jié)果圖,可以通過Prt Sc和圖片編輯器獲得;

      實驗報告3:哈夫曼編/譯碼器

      七、附錄:

      #include #include

      #define MAXBIT 100 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXQZ 10000 //權值

      typedef struct { int bit[MAXBIT];int start;} HCodeType;/* 編碼結(jié)構體 */

      實驗報告3:哈夫曼編/譯碼器 typedef struct { int weight;int parent;int lchild;int rchild;char value;} HNode;/* 結(jié)點結(jié)構體 */

      /* 構造一顆哈夫曼樹 */ void HuffmanTree(HNode HuffNode[MAXNODE], int n){

      int i = 0, j, m1, m2, x1, x2;char x;/* 初始化存放哈夫曼樹數(shù)組 HuffNode[] 中的結(jié)點 */ while(i

      scanf(“%c”,&x);scanf(“%c”,&HuffNode[i].value);//實際值,可根據(jù)情況替換為字母 i++;}

      /* 輸入 n 個葉子結(jié)點的權值 */ scanf(“%c”,&x);i = 0;while(i

      for(i=n;i<2*n-1;i++){ HuffNode[i].weight = 0;//權值 HuffNode[i].parent =-1;HuffNode[i].lchild =-1;HuffNode[i].rchild =-1;HuffNode[i].value=i;}

      實驗報告3:哈夫曼編/譯碼器

      /* 循環(huán)構造 Huffman 樹 */ for(i=0;i

      x1=x2=0;//找出所有結(jié)點中權值最小、無父結(jié)點的兩個結(jié)點,并合并之為一顆二叉樹 for(j=0;j

      } }

      int main(){

      HNode HuffNode[MAXNODE];/* 定義一個結(jié)點結(jié)構體數(shù)組 */ HCodeType HuffCode[MAXLEAF],cd;/* 定義一個編碼結(jié)構體數(shù)組,同時定義一個臨時變量來存放求解編碼時的信息 */ int i, j, c, p, n,k=0;char wen[100];char z;scanf(“%d”, &n);HuffmanTree(HuffNode, n);8 3:哈夫曼編/譯碼器

      for(i=0;i < n;i++){ cd.start = n-1;c = i;p = HuffNode[c].parent;while(p!=-1)/* 父結(jié)點存在 */ { if(HuffNode[p].lchild == c)cd.bit[cd.start] = 0;else cd.bit[cd.start] = 1;cd.start--;/* 求編碼的低一位 */ c=p;p=HuffNode[c].parent;/* 設置下一循環(huán)條件 */ } /* end while */

      /* 保存求出的每個葉結(jié)點的哈夫曼編碼和編碼的起始位 */ for(j=cd.start+1;j

      z=getchar();z=getchar();for(;z!='n';z=getchar()){

      wen[k++]=z;

      for(i=0;i

      {

      if(z==HuffNode[i].value)

      {

      for(j=HuffCode[i].start+1;j < n;j++)

      printf(“%d”, HuffCode[i].bit[j]);

      break;

      }

      else;

      } } printf(“n”);i = 0;while(i

      {

      printf(“%c”,wen[i]);實驗報告 實驗報告3:哈夫曼編/譯碼器

      }

      printf(“n”);return 0;} ? i++;

      實驗報告3:哈夫曼編/譯碼器

      上機實習要求:

      1、認真準備,按時參加上機實習,不得無故缺席,抽查不到者扣分;

      2、獨立完成老師布置的題目,上機完成程序并調(diào)試正確,課后完成實驗報告的編寫,將上機程序和實驗報告打包后交給輔導老師評定分數(shù),實驗報告要求和評分標準見后面;

      3、提倡創(chuàng)新,可對課本上提供的算法進行改進;

      4、上機程序必須在程序中提供足夠的注釋,詳細為好。

      5、實驗報告不用寫出算法,只要寫出對課程設計的見解,如對某一算法的改進思想,算法設計思想,調(diào)試算法過程中出現(xiàn)的問題及改進方法,調(diào)試程序的體會等。只要是自己編程和調(diào)試就會寫出相應的報告。

      考核標準

      1、機試程序和結(jié)果、設計報告缺一不可,機試程序和結(jié)果壓縮打包后上交給輔導老師,設計報告主要是自己的設計過程和調(diào)試心得,報告中不必附帶全部的源程序)。機試成績占總成績60%,設計報告占40%。

      2、上機程序和設計報告必須獨立完成,嚴禁抄襲,若發(fā)現(xiàn)雷同,原創(chuàng)者視上機結(jié)果最多60分,抄襲者按0分計,若找不到原創(chuàng),都按0分計。

      所以原創(chuàng)同學注意,我們的檢查專門針對抄襲情況,一旦發(fā)現(xiàn)將嚴肅處理??!

      第二篇:數(shù)據(jù)結(jié)構實驗三哈夫曼樹實驗報告

      題目:哈夫曼編/譯碼器

      一、題目要求:

      寫一個哈夫曼碼的編/譯碼系統(tǒng),要求能對要傳輸?shù)膱笪倪M行編碼和解碼。構造哈夫曼樹時,權值小的放左子樹,權值大的放右子樹,編碼時右子樹編碼為1,左子樹編碼為0.二、概要設計:

      數(shù)據(jù)結(jié)構:

      typedef struct { int bit[MAXBIT];int start;} HCodeType;/* 編碼結(jié)構體 */

      typedef struct { int weight;int parent;int lchild;int rchild;char value;} HNode;/* 結(jié)點結(jié)構體 */ 函數(shù):

      void DEMONHuffmanTree(HNode HuffNode[MAXNODE], int n)作用:構造一個哈夫曼樹,并循環(huán)構建 int main()作用:運用已經(jīng)構建好的哈弗曼樹,進行節(jié)點的處理,達到成功解碼編譯

      三、詳細設計: 哈夫曼樹的建立:

      void DEMONHuffmanTree(HNode HuffNode[MAXNODE], int n){

      int i = 0, j, m1, m2, x1, x2;

      char x;

      /* 初始化存放哈夫曼樹數(shù)組 HuffNode[] 中的結(jié)點 */

      while(i

      {

      HuffNode[i].weight = 0;//權值

      HuffNode[i].parent =-1;

      HuffNode[i].lchild =-1;

      HuffNode[i].rchild =-1;

      scanf(“%c”,&x);

      scanf(“%c”,&HuffNode[i].value);//實際值,可根據(jù)情況替換為字母

      i++;

      }

      /* 輸入 n 個葉子結(jié)點的權值 */ scanf(“%c”,&x);for(i=0;i

      {

      scanf(“%d”, &HuffNode[i].weight);

      }

      for(i=n;i<2*n-1;i++)

      {

      HuffNode[i].weight = 0;//權值

      HuffNode[i].parent =-1;

      HuffNode[i].lchild =-1;

      HuffNode[i].rchild =-1;

      HuffNode[i].value=i;

      }

      /* 循環(huán)構造 Huffman 樹 */

      for(i=0;i

      {

      m1=m2=MAXQZ;

      // m1、m2中存放兩個無父結(jié)點且結(jié)點權值最小的兩個結(jié)點

      x1=x2=0;//找出所有結(jié)點中權值最小、無父結(jié)點的兩個結(jié)點,并合并之為一顆二叉樹

      for(j=0;j

      {

      if(HuffNode[j].weight < m1 && HuffNode[j].parent==-1)

      {

      m2=m1;//m1中是最小

      x2=x1;

      m1=HuffNode[j].weight;

      x1=j;

      }

      else if(HuffNode[j].weight < m2 && HuffNode[j].parent==-1)

      {

      m2=HuffNode[j].weight;

      x2=j;

      }

      } /* end for */

      /* 設置找到的兩個子結(jié)點 x1、x2 的父結(jié)點信息 */

      HuffNode[x1].parent = n+i;

      HuffNode[x2].parent = n+i;

      HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;

      HuffNode[n+i].lchild = x1;

      HuffNode[n+i].rchild = x2;

      } }

      葉子節(jié)點的哈夫曼編碼的保存: for(j=cd.start+1;j

      HuffCode[i].bit[j] = cd.bit[j];

      HuffCode[i].start = cd.start;

      主函數(shù)展示: int main(){

      HNode HuffNode[MAXNODE];

      HCodeType HuffCode[MAXLEAF],cd;

      int i, j, c, p, n,k=0;

      char wen[100];

      char z;

      scanf(“%d”, &n);

      HuffmanTree(HuffNode, n);

      for(i=0;i < n;i++)

      {

      cd.start = n-1;

      c = i;

      p = HuffNode[c].parent;

      while(p!=-1)

      /* 父結(jié)點存在 */

      {

      if(HuffNode[p].lchild == c)

      cd.bit[cd.start] = 0;

      else

      cd.bit[cd.start] = 1;

      cd.start--;

      /* 求編碼的低一位 */

      c=p;

      p=HuffNode[c].parent;

      /* 設置下一循環(huán)條件 */

      } /* end while */

      for(j=cd.start+1;j

      HuffCode[i].bit[j] = cd.bit[j];

      HuffCode[i].start = cd.start;

      } /* end for */

      z=getchar();

      z=getchar();

      for(;z!='n';z=getchar()){

      wen[k++]=z;

      for(i=0;i

      {

      if(z==HuffNode[i].value)

      {

      for(j=HuffCode[i].start+1;j < n;j++)

      printf(“%d”, HuffCode[i].bit[j]);

      break;

      }

      else;

      } } printf(“n”);for(i=0;i

      {

      printf(“%c”,wen[i]);

      }

      printf(“n”);

      return 0;}

      四、調(diào)試分析與心得體會:

      雖然哈夫曼樹的建立有書上的參考,但是實際寫整個代碼的時候還是問題重重。首先就是哈弗曼樹忘記了初始的賦值,導致最后出現(xiàn)了問題。這樣的錯誤還是很容易解決,但是之后就出現(xiàn)了WA的情況。在同學的幫助下,最后發(fā)現(xiàn)是因為在選取節(jié)點的時候,循環(huán)出現(xiàn)了問題,雖然看起來編譯沒有錯,但是邊緣情況就會出現(xiàn)數(shù)據(jù)錯誤,這個還是很令人警醒,而這種思考的不全面的問題,在debug的過程中會耗去大量的時間,這是要注意的。

      五、用戶操作說明:

      輸入表示字符集大小為n(n <= 100)的正整數(shù),以及n個字符和n個權值(正整數(shù),值

      越大表示該字符出現(xiàn)的概率越大); 輸入串長小于或等于100的目標報文。

      六、運行結(jié)果:

      附帶自己的算法完成的結(jié)果圖,可以通過Prt Sc和圖片編輯器獲得;

      七、附錄:

      #include #include

      #define MAXBIT 100 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXQZ 10000 //權值

      typedef struct { int bit[MAXBIT];int start;} HCodeType;/* 編碼結(jié)構體 */

      typedef struct { int weight;int parent;int lchild;int rchild;char value;} HNode;/* 結(jié)點結(jié)構體 */

      /* 構造一顆哈夫曼樹 */ void HuffmanTree(HNode HuffNode[MAXNODE], int n){

      int i = 0, j, m1, m2, x1, x2;char x;/* 初始化存放哈夫曼樹數(shù)組 HuffNode[] 中的結(jié)點 */ while(i

      scanf(“%c”,&x);scanf(“%c”,&HuffNode[i].value);//實際值,可根據(jù)情況替換為字母 i++;}

      /* 輸入 n 個葉子結(jié)點的權值 */ scanf(“%c”,&x);i = 0;while(i

      for(i=n;i<2*n-1;i++){ HuffNode[i].weight = 0;//權值 HuffNode[i].parent =-1;HuffNode[i].lchild =-1;HuffNode[i].rchild =-1;HuffNode[i].value=i;}

      /* 循環(huán)構造 Huffman 樹 */ for(i=0;i

      x1=x2=0;//找出所有結(jié)點中權值最小、無父結(jié)點的兩個結(jié)點,并合并之為一顆二叉樹 for(j=0;j

      } }

      int main(){

      HNode HuffNode[MAXNODE];/* 定義一個結(jié)點結(jié)構體數(shù)組 */ HCodeType HuffCode[MAXLEAF],cd;/* 定義一個編碼結(jié)構體數(shù)組,同時定義一個臨時變量來存放求解編碼時的信息 */ int i, j, c, p, n,k=0;char wen[100];char z;scanf(“%d”, &n);HuffmanTree(HuffNode, n);8

      for(i=0;i < n;i++){ cd.start = n-1;c = i;p = HuffNode[c].parent;while(p!=-1)/* 父結(jié)點存在 */ { if(HuffNode[p].lchild == c)cd.bit[cd.start] = 0;else cd.bit[cd.start] = 1;cd.start--;/* 求編碼的低一位 */ c=p;p=HuffNode[c].parent;/* 設置下一循環(huán)條件 */ } /* end while */

      /* 保存求出的每個葉結(jié)點的哈夫曼編碼和編碼的起始位 */ for(j=cd.start+1;j

      z=getchar();z=getchar();for(;z!='n';z=getchar()){

      wen[k++]=z;

      for(i=0;i

      {

      if(z==HuffNode[i].value)

      {

      for(j=HuffCode[i].start+1;j < n;j++)

      printf(“%d”, HuffCode[i].bit[j]);

      break;

      }

      else;

      } } printf(“n”);i = 0;while(i

      {

      printf(“%c”,wen[i]);

      }

      printf(“n”);return 0;} ? i++;

      上機實習要求:

      1、認真準備,按時參加上機實習,不得無故缺席,抽查不到者扣分;

      2、獨立完成老師布置的題目,上機完成程序并調(diào)試正確,課后完成實驗報告的編寫,將上機程序和實驗報告打包后交給輔導老師評定分數(shù),實驗報告要求和評分標準見后面;

      3、提倡創(chuàng)新,可對課本上提供的算法進行改進;

      4、上機程序必須在程序中提供足夠的注釋,詳細為好。

      5、實驗報告不用寫出算法,只要寫出對課程設計的見解,如對某一算法的改進思想,算法設計思想,調(diào)試算法過程中出現(xiàn)的問題及改進方法,調(diào)試程序的體會等。只要是自己編程和調(diào)試就會寫出相應的報告。

      考核標準

      1、機試程序和結(jié)果、設計報告缺一不可,機試程序和結(jié)果壓縮打包后上交給輔導老師,設計報告主要是自己的設計過程和調(diào)試心得,報告中不必附帶全部的源程序)。機試成績占總成績60%,設計報告占40%。

      2、上機程序和設計報告必須獨立完成,嚴禁抄襲,若發(fā)現(xiàn)雷同,原創(chuàng)者視上機結(jié)果最多60分,抄襲者按0分計,若找不到原創(chuàng),都按0分計。

      所以原創(chuàng)同學注意,我們的檢查專門針對抄襲情況,一旦發(fā)現(xiàn)將嚴肅處理?。?/p>

      第三篇:樹和哈夫曼樹實驗報告

      樹和哈夫曼樹實驗報告

      一.實驗目的

      練習樹和哈夫曼樹的有關操作,和各個算法程序,理解哈夫曼樹的編碼和譯碼 二.實驗環(huán)境

      Microsoft visual c++ 三.實驗問題描述

      1.問題描述:建立一棵用二叉鏈表方式存儲的二叉樹,并對其進行遍歷(先序、中序和后序),打印輸出遍歷結(jié)果。

      基本要求:從鍵盤接受輸入先序序列,以二叉鏈表作為存儲結(jié)構,建立二叉樹(以先序來建立),并將此二叉樹按照“樹狀形式”打印輸出,然后對其進行遍歷(先序、中序和后序),最后將遍歷結(jié)果打印輸出。在遍歷算法中要求至少有一種遍歷采用非遞歸方法。測試數(shù)據(jù):

      ABC??DE?G??F???(其中?表示空格字符)輸出結(jié)果為: 先序:ABCDEGF 先序:CBEGDFA 先序:CGEFDBA 2.問題描述:利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在接受端將傳來的數(shù)據(jù)進行譯碼(復原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼碼的編/譯碼系統(tǒng)?;疽螅?至少完成功能1-2)一個完整的系統(tǒng)應具有以下功能: I:初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹,并將它存于文件hfmTree中?;疽螅?/p>

      E:編碼(Encoding)。利用已建好的哈夫曼樹(如不在內(nèi)存,則從文件hfmTree中讀入),對文件ToBeTran中的正文進行編碼,然后將結(jié)果存入文件CodeFile中。

      D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結(jié)果存入文件TextFile中。

      P:印代碼文件(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrint中。T:印哈夫曼樹(TreePrinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。測試數(shù)據(jù):

      設權值w=(5,29,7,8,14,23,3,11),n=8。

      按照字符‘0’或‘1’確定找左孩子或右孩子,則權值對應的編碼為:

      5:0001,29:11,7:1110,8:1111 14:110,23:01,3:0000,11:001 用下表給出的字符集和頻度的實際統(tǒng)計數(shù)據(jù)建立哈夫曼樹,并實現(xiàn)以下報文的編碼和譯碼:“THIS PROGRAM IS MY FAVORITE”。四.實驗主要程序流

      實驗題目一主要程序:

      1.void CreatBiTree(BitTree *bt)//用擴展先序遍歷序列創(chuàng)建二叉樹,如果是#當前樹根置為空,否則申請一個新節(jié)點// { char ch;ch=getchar();if(ch=='.')*bt=NULL;else { *bt=(BitTree)malloc(sizeof(BitNode));(*bt)->data=ch;CreatBiTree(&((*bt)->LChild));CreatBiTree(&((*bt)->RChild));} } 2.void Visit(char ch)//訪問根節(jié)點 { printf(“%c ”,ch);} 3.

      void PreOrder(BitTree root){ if(root!=NULL){ Visit(root->data);PreOrder(root->LChild);PreOrder(root->RChild);} } 4. void InOrder(BitTree root){ if(root!=NULL){ InOrder(root->LChild);Visit(root->data);InOrder(root->RChild);} } 5.int PostTreeDepth(BitTree bt)//后序遍歷求二叉樹的高度遞歸算法// { int hl,hr,max;if(bt!=NULL){ hl=PostTreeDepth(bt->LChild);//求左子樹的深度

      hr=PostTreeDepth(bt->RChild);//求右子樹的深度

      max=hl>hr?hl:hr;//得到左、右子樹深度較大者

      return(max+1);//返回樹的深度 } else return(0);//如果是空樹,則返回0 } 6.void PrintTree(BitTree Boot,int nLayer)//按豎向樹狀打印的二叉樹 // { int i;if(Boot==NULL)return;PrintTree(Boot->RChild,nLayer+1);for(i=0;idata);PrintTree(Boot->LChild,nLayer+1);} 7.void main(){ BitTree T;int h;int layer;int treeleaf;layer=0;printf(“請輸入二叉樹中的元素(以擴展先序遍歷序列輸入,其中.代表空子樹):n”);CreatBiTree(&T);printf(“先序遍歷序列為:”);PreOrder(T);printf(“n中序遍歷序列為:”);InOrder(T);printf(“n后序遍歷序列為:”);PostOrder(T);h=PostTreeDepth(T);printf(“此二叉樹的深度為:%dn”,h);printf(“此二叉樹的橫向顯示為:n”);PrintTree(T,layer);} 實驗二主要程序流: 1.int main(){ HuffmanTree huftree;char Choose;while(1){ cout<<“n**********************歡迎使用哈夫曼編碼/譯碼系統(tǒng)**********************n”;cout<<“*您可以進行以下操作: *n”;cout<<“*1.建立哈夫曼樹 *n”;cout<<“*2.編碼(源文已在文件ToBeTra中,或鍵盤輸入)*n”;cout<<“* 3.譯碼(碼文已在文件CodeFile中)*n”;cout<<“* 4.顯示碼文 *n”;cout<<“* 5.顯示哈夫曼樹 *n”;cout<<“* 6.退出 *n”;cout<<“***********************************************************************n”;cout<<“請選擇一個操作:”;cin>>Choose;switch(Choose){ case '1': huftree.CreateHuffmanTree();break;case '2': huftree.Encoder();break;case '3': huftree.Decoder();break;case '4': huftree.PrintCodeFile();break;case '5': huftree.PrintHuffmanTree();break;case '6': cout<<“n**********************感謝使用本系統(tǒng)!*******************nn”;system(“pause”);return 0;}//switch }//while }//main 2.// 建立哈夫曼樹函數(shù)

      // 函數(shù)功能:建立哈夫曼樹(調(diào)用鍵盤建立哈夫曼樹或調(diào)用從文件建立哈夫曼樹的函數(shù))void HuffmanTree::CreateHuffmanTree(){char Choose;cout<<“你要從文件中讀入哈夫曼樹(按1),還是從鍵盤輸入哈夫曼樹(按2)?”;cin>>Choose;if(Choose=='2'){ //鍵盤輸入建立哈夫曼樹 CreateHuffmanTreeFromKeyboard();}//choose=='2' else { //從哈夫曼樹文件hfmTree.dat中讀入信息并建立哈夫曼樹

      CreateHuffmanTreeFromFile();} } 3.// 從鍵盤建立哈夫曼樹函數(shù)

      // 函數(shù)功能:從鍵盤建立哈夫曼樹 //函數(shù)參數(shù):無 //參數(shù)返回值:無

      void HuffmanTree::CreateHuffmanTreeFromKeyboard(){ int Num;cout<<“n請輸入源碼字符集個數(shù):”;cin>>Num;if(Num<=1){ cout<<“無法建立少于2個葉子結(jié)點的哈夫曼樹。nn”;return;} LeafNum=Num;Node=new HuffmanNode[2*Num-1];for(int i=0;i

      cout<<“請輸入第”<>Node[i].weight;//源文的字符權重存入Node[].weight Node[i].parent=-1;Node[i].lchild=-1;Node[i].rchild=-1;Node[i].code=“