[技术支持] 用哈夫曼树编码并译码,为啥没有输出呢?

[复制链接]
 楼主| 范德萨发法国队 发表于 2022-6-30 09:53 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:37 编辑
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. typedef struct
  5. {
  6. char data;
  7. int weight;
  8. int parent,lchild,rchild;
  9. }HTNode,*HuffmanTree;

  10. typedef char **HuffmanCode;

  11. void Select(HuffmanTree &HT,int m,int &s1,int &s2)//选择两个权值较小的结点,并返回序号
  12. {
  13. int i,j,min1,min2;
  14. min1=min2=1000;
  15. for(i=1;i<=m;i++)
  16. if(HT[i].parent==0&&HT[i].weight<min1)
  17. {
  18. min1=HT[i].weight;
  19. s1=i;
  20. }
  21. for(j=1;j<=m&&j!=s1;j++)
  22. if(HT[i].parent==0&&HT[i].weight<min2)
  23. {
  24. min2=HT[j].weight;
  25. s2=j;
  26. }
  27. }

  28. void CreateHuffmanTree(HuffmanTree &HT,int n)//建立哈夫曼树
  29. {
  30. if(n<=1) return;
  31. HT=(HuffmanTree)malloc(sizeof(HTNode)2n);
  32. int i,j,s1,s2;
  33. char ch='a';
  34. for(i=1;i<=(2n-1);++i)
  35. {
  36. HT[i].parent=0;
  37. HT[i].lchild=0;
  38. HT[i].rchild=0;
  39. }
  40. for(j=1;j<=n;++j,ch++)
  41. {
  42. if(j==1)
  43. {
  44. HT[1].data=' ';
  45. scanf("%d",&HT[j].weight);
  46. }
  47. else
  48. {
  49. HT[j].data=ch;
  50. scanf("%d",&HT[j].weight);
  51. }
  52. }
  53. for(i=n+1;i<=(2n-1);++i)
  54. {
  55. Select(HT,i-1,s1,s2);
  56. HT[s1].parent=i;
  57. HT[s2].parent=i;
  58. HT[i].weight=HT[s1].weight+HT[s2].weight;
  59. HT[i].lchild=s1;
  60. HT[i].rchild=s2;
  61. }
  62. }

  63. void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n)//求哈夫曼编码
  64. {
  65. HC=new char*[n+1];
  66. char *cd;
  67. cd=(char *)malloc(sizeof(char)*n);
  68. int i,start,c,f;
  69. for(i=1;i<=n;++i)
  70. {
  71. start=n-1;
  72. c=i;
  73. f=HT[i].parent;
  74. while(f!=0)
  75. {
  76. --start;
  77. if(HT[f].lchild==c) cd[start]='0';//回溯时走左分支为0,右分支为1
  78. else cd[start]='1';
  79. c=f;
  80. f=HT[f].parent;
  81. }
  82. HC[i]=(char)malloc(sizeof(char)(n-start));
  83. strcpy(HC[i],&cd[start]);
  84. }
  85. delete(cd);
  86. }

  87. void InterpretCode(HuffmanCode HC,char *str)//译码
  88. {
  89. int i;
  90. for(i=0;i<strlen(str);i++)
  91. {
  92. if(str[i]==' ') printf("%s",HC[1]);
  93. else{
  94. if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]+32;
  95. if(str[i]>='a'&&str[i]<='z') printf("%s",HC[str[i]-95]);
  96. }
  97. }
  98. }

  99. int main()
  100. {
  101. HuffmanTree HT;
  102. HuffmanCode HC;
  103. CreateHuffmanTree(HT,27);
  104. printf("请输入报文:");
  105. CreateHuffmanCode(HT,HC,27);
  106. char s[100];
  107. gets(s);
  108. InterpretCode(HC,s);
  109. return 0;
  110. }


tpgf 发表于 2022-7-5 13:39 | 显示全部楼层
这是一个算法吗
晓伍 发表于 2022-7-5 13:48 | 显示全部楼层
这种编码方式用在什么产品上啊
八层楼 发表于 2022-7-5 14:11 | 显示全部楼层
这种主要就是用于编码解码吗
观海 发表于 2022-7-5 14:20 | 显示全部楼层
看代码好像并不复杂啊
guanjiaer 发表于 2022-7-5 14:29 | 显示全部楼层
理论上应该有什么输出呢
heimaojingzhang 发表于 2022-7-5 14:40 | 显示全部楼层
会输出一些编码吗?
chenqianqian 发表于 2022-7-6 08:29 来自手机 | 显示全部楼层
算法实现对吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

93

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部