【数据结构】哈夫曼编码

前端之家收集整理的这篇文章主要介绍了【数据结构】哈夫曼编码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef struct{
  6. unsigned int weight; //权值
  7. unsigned int parent,lchild,rchild; //父节点,左子树,右子树
  8. }HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树
  9.  
  10. typedef char ** HuffmanCode; //动态分配数组存储赫夫曼编码表
  11.  
  12. unsigned int min1,min2;
  13.  
  14. void Select(HuffmanTree &HT,int i,int &s1,int &s2)
  15. {
  16. min1=min2=32767;
  17. s1=s2=0;
  18. int j;
  19. for(j=1;j<=i;j++)
  20. {
  21. if(HT[j].weight<min1&&!HT[j].parent)
  22. {
  23. min2=min1;
  24. s2=s1;
  25. min1=HT[j].weight;
  26. s1=j;
  27. }
  28. else if(HT[j].weight<min2&&!HT[j].parent)
  29. {
  30. min2=HT[j].weight;
  31. s2=j;
  32. }
  33. }
  34. }
  35. void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
  36. //w存放n个字符的权值,构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
  37. int m;//m表示赫夫曼树总共结点
  38. int i;
  39. int s1=0;
  40. int s2=0;
  41. HuffmanTree p;
  42. char *cd;
  43. unsigned int start,c,f;
  44. if(n<=1)
  45. return;
  46. m = 2*n -1 ; //节点数
  47. HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); //分配存储空间,0号单元未用
  48. for(p = HT+1,i=1;i<=n;++i,++p){
  49. p->weight = w[i];
  50. p->parent = 0;
  51. p->lchild = 0;
  52. p->rchild = 0;
  53. }
  54. for(i=n+1;i<=m;++i,++p){
  55. p->weight = 0;
  56. p->parent = 0;
  57. p->lchild = 0;
  58. p->rchild = 0;
  59. }
  60. for(i=n+1;i<=m;++i){ //建赫夫曼树
  61. //在HT[1...i-1]选择parent为0且weight最小的两个结点,其序号分别为是s1和s2
  62. Select(HT,i-1,s1,s2);
  63. HT[s1].parent = i;
  64. HT[s2].parent = i;
  65. HT[i].lchild = s1;
  66. HT[i].rchild = s2;
  67. HT[i].weight = HT[s1].weight + HT[s2].weight;
  68. }
  69. for(i=1;i<=m;i++)
  70. printf("%d,%d,%d\n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
  71. //从叶子到根逆向求每个字符的赫夫曼编码
  72. HC = (HuffmanCode)malloc((n+1)*sizeof(char *)); //分配n个字符编码的头指针向量
  73. cd = (char *)malloc(n*sizeof(char)); //分配求编码的工作空间
  74. cd[n-1] ='\0'; //编码结束符
  75. for(i=1;i<=n;++i){
  76. start = n-1;
  77. for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶子到根逆向求编码
  78. if(HT[f].lchild == c)
  79. cd[--start] = '0';
  80. else
  81. cd[--start] = '1';
  82. HC[i] = (char *)malloc((n-start)*sizeof(char));
  83. strcpy(HC[i],&cd[start]); //
  84. }
  85. free(cd);
  86. }
  87. void main(){
  88. int n;
  89. int NT[100];
  90. int i;
  91. HuffmanTree HT;
  92. HuffmanCode HC;
  93. printf("请输入你的赫夫曼树的叶子结点个数:\n\n");
  94. scanf("%d",&n);
  95. for(i=1;i<=n;i++)
  96. {
  97. printf("输入第 %d 个数字的权重",i);
  98. scanf("%d",&NT[i]);
  99. }
  100. HuffmanCoding(HT,HC,NT,n);
  101. printf("赫夫曼树编码如下:\n\n");
  102. for(i=1;i<=n;i++)
  103. {
  104. printf("%d :%s\n",HC[i]);
  105. }
  106. printf("\n\n");
  107. }



By Mr.Z

猜你在找的数据结构相关文章