第六周作业1——利用哈夫曼编码英文字母表

来源:互联网 发布:助创cms众筹系统源码 编辑:程序博客网 时间:2024/05/16 15:46

代码:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<string>  
  3. #include<malloc.h>  
  4. using namespace std;  
  5. typedef struct{  
  6.     char charname;  
  7.     double weight;  
  8.     int parent, lchild, rchild;  
  9. }HTNode, *HuffmanTree;  
  10. typedef char **HuffmanCode;  
  11. int n;  
  12. char *a;  
  13. double *b;  
  14. void TestNum()  
  15. {  
  16.     n = 27;  
  17.     a = new char[27];  
  18.     b = new double[n];  
  19.   
  20.     char *Code[27] = {"space""e""t""a""o""i""n""s""h",  
  21.         "r""d""l""c""u""m""w""f""g",  
  22.         "y""p""b""v""k""j""x""q""z"};  
  23.   
  24.       
  25.     for (int i = 0; i < n; i++)  
  26.     {  
  27.         a[i] = *Code[i];  
  28.     }  
  29.   
  30.       
  31.     double WeightNum[27] = {18.3, 10.2, 7.7, 6.8, 5.9, 5.8, 5.5, 5.1, 4.9,  
  32.                     4.8, 3.5, 3.4, 2.6, 2.4, 2.1, 1.9, 1.8, 1.7, 1.6,   
  33.                     1.6, 1.3, 0.9, 0.6, 0.2, 0.2, 0.1, 0.1};  
  34.       
  35.       
  36.     for(int i = 0; i < n; i++)  
  37.     {  
  38.         b[i] = WeightNum[i];  
  39.     }  
  40.       
  41. }  
  42. void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *a,double *b,int n)  
  43. {  
  44.     if(n<=1)  
  45.     {  
  46.         return;  
  47.     }  
  48.     int m = 2 * n - 1;  
  49.     HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));  
  50.     int i;  
  51.     for(i = 1; i <= n; ++i)  
  52.     {  
  53.         HT[i].charname = a[i-1];  
  54.         HT[i].weight = b[i-1];  
  55.         HT[i].parent = HT[i].lchild = HT[i].rchild = 0;   
  56.     }  
  57.     for(; i <= m; ++i)  
  58.     {  
  59.         HT[i].charname = '0';  
  60.         HT[i].weight = 0;  
  61.         HT[i].parent = HT[i].lchild=HT[i].rchild = 0;  
  62.     }  
  63.     for(i = n + 1; i <= m; ++i)  
  64.     {   
  65.         int s1 = 0;  
  66.         int s2 = 0;  
  67.         for(s1 = 1; HT[s1].parent != 0;)  
  68.         {  
  69.             s1++;  
  70.         }  
  71.   
  72.         for (int j = s1; j <= i - 1; j++)  
  73.         {  
  74.             if(HT[j].parent != 0)  
  75.             {  
  76.                 continue;  
  77.             }  
  78.             s1 = HT[j].weight<HT[s1].weight?j:s1;  
  79.         }  
  80.   
  81.         HT[s1].parent = i;  
  82.         HT[i].lchild = s1;  
  83.   
  84.         for(s2 = 1; HT[s2].parent != 0;)  
  85.         {  
  86.             s2++;  
  87.         }  
  88.   
  89.         for (int j = s2; j <= i - 1; j++)  
  90.         {  
  91.             if(HT[j].parent != 0)  
  92.             {  
  93.                 continue;  
  94.             }  
  95.             s2 = HT[j].weight<HT[s2].weight?j:s2;  
  96.         }  
  97.         HT[s2].parent = i;  
  98.         HT[i].rchild = s2;  
  99.         HT[i].weight = HT[s1].weight+HT[s2].weight;  
  100.     }  
  101.     HC = (HuffmanCode)malloc((n+1)*sizeof(char*));  
  102.     char *cd = (char*)malloc(n*sizeof(char));  
  103.     cd[n-1] = '\0';  
  104.     for (i = 1; i <= n; ++i)  
  105.     {  
  106.         int start = n-1, c, f;  
  107.         for (c=i, f=HT[i].parent; f != 0; c = f, f = HT[f].parent)  
  108.         {  
  109.             if(HT[f].lchild==c)   
  110.             {  
  111.                 cd[--start]='0';  
  112.             }  
  113.             else if(HT[f].rchild==c)   
  114.             {  
  115.                 cd[--start]='1';  
  116.             }  
  117.         }  
  118.         HC[i] = (char*)malloc((n-start) * sizeof(char));  
  119.         f=n-start;  
  120.         for(int d = 0; d < f; d++, start++)  
  121.         {  
  122.             HC[i][d]=cd[start];  
  123.         }  
  124.     }  
  125.   
  126. }  
  127. void coutHC(HuffmanTree &HT,HuffmanCode &HC,int n, char* a)  
  128. {  
  129.     for (int i = 1; i <= n; i++)  
  130.     {  
  131.   
  132.     //  cout<<"ok";  
  133.         cout<<a[i]<<"的编码为:";  
  134.   
  135.         for(int d = 0; HC[i][d] != '\0'; d++)  
  136.         {  
  137.             cout<<HC[i][d];  
  138.         }  
  139.         cout<<endl;  
  140.     }  
  141. }  
  142.   
  143. void main()  
  144. {  
  145.     HuffmanTree HT;  
  146.     HuffmanCode HC;  
  147.     TestNum();  
  148.     HuffmanCoding(HT, HC, a, b, n);  
  149.     coutHC(HT, HC, n, a);  

运行结果:





0 0
原创粉丝点击