当前位置:   article > 正文

数据结构:哈夫曼树及哈夫曼编码_从终端读入字符集大小n以及n个字符和n个权值,构建哈夫曼树

从终端读入字符集大小n以及n个字符和n个权值,构建哈夫曼树

问题描述:

哈夫曼编码进行通信时,可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对要传输的数据预先编码。试为这样的信息发送端写一个哈夫曼编码程序。

1.初始化:从终端输入字符集大小 n ,以及 n 个字符和 n 个权值,试构造一棵哈夫曼树,要求左子树的权值小于右子树的权值。

2.编码。若输入的权值分别是报文中不同字符出现的频率,利用已建好的哈夫曼树,对n个字符进行哈夫曼编码,每个编码的指针存放在一个一维数组中,并将编码输出。

设计要求:

首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。

主控菜单设计要求:

程序运行后,给出5个菜单项的内容和输入提示:

  1. 输入字符集大小
  2. 输入带编码字符及其权值
  3. 建立哈夫曼树HT
  4. 完成哈夫曼编码HC,并显示编码
  5. 退出

请选择菜单1--5:

功能要求:

完成各菜单的功能,并能正确显示编码内容

1.初始化:从终端输入字符集大小 n ,以及 n 个字符和 n 个权值,试构造一棵哈夫曼树,要求左子树的权值小于右子树的权值。

2.编码。若输入的权值分别是报文中不同字符出现的频率,利用已建好的哈夫曼树,对n个字符进行哈夫曼编码,每个编码的指针存放在一个一维数组中,并将编码输出。

实现要求:

  1. 哈夫曼树建立后,从叶子到根逆向求每一个字符的哈夫曼编码
  2.  设在通信中只可能出现的10种字符,其对应的概率如下表所示:试设计哈夫曼编码。

a

b

e

f

i

k

s

t

y

z

0.12

0.05

0.07

0.08

0.14

0.23

0.03

0.15

0.02

0.11

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char a[100];
  5. //哈夫曼树的存储表示
  6. typedef struct{
  7. int weight;
  8. int parent,lchild,rchild;
  9. }HTNode,*HuffmanTree;
  10. typedef char **HuffmanCode;
  11. HuffmanTree HT;
  12. HuffmanCode HC;
  13. //Select函数
  14. void Select(HuffmanTree HT,int m,int *s1,int *s2)
  15. {
  16. int i;
  17. int min1=1000;
  18. int min2=1000;
  19. for(i=1;i<=m;i++){
  20. if(HT[i].parent==0&&min1>HT[i].weight){
  21. min1=HT[i].weight;
  22. *s1=i;
  23. }
  24. }
  25. for(i=1;i<=m;i++){
  26. if(i!=(*s1)&&HT[i].parent==0){
  27. if(HT[i].weight<min2){
  28. min2=HT[i].weight;
  29. *s2=i;
  30. }
  31. }
  32. }
  33. }
  34. //构造哈夫曼树
  35. void CreateHuffmanTree(HuffmanTree &HT,int n)
  36. {
  37. int s1,s2;
  38. if(n<=1)
  39. return ;
  40. int m=2*n-1;
  41. HT=new HTNode[m+1];
  42. for(int i=1;i<=m;i++)
  43. {
  44. HT[i].parent=0;
  45. HT[i].lchild=0;
  46. HT[i].rchild=0;
  47. }
  48. printf("输入前n个单元中叶子结点的权值:\n");
  49. for(i=1;i<=n;i++)
  50. {
  51. scanf("%d",&HT[i].weight);
  52. }
  53. for(i=n+1;i<=m;i++)
  54. {
  55. Select(HT,i-1,&s1,& s2);
  56. HT[s1].parent=i;
  57. HT[s2].parent=i;
  58. HT[i].lchild=s1;
  59. HT[i].rchild=s2;
  60. HT[i].weight=HT[s1].weight+HT[s2].weight;
  61. }
  62. }
  63. //完成哈夫曼编码HC,并显示编码
  64. void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n)
  65. {
  66. char *cd;
  67. HC=new char*[n+1];
  68. cd=new char[n];
  69. cd[n-1]='\0';
  70. for(int i=1;i<=n;++i)
  71. {
  72. int start=n-1;
  73. int c=i;
  74. int f=HT[i].parent;
  75. while(f!=0)
  76. {
  77. --start;
  78. if(HT[f].lchild==c)
  79. cd[start]='0';
  80. else
  81. cd[start]='1';
  82. c=f;
  83. f=HT[f].parent;
  84. }
  85. HC[i]=new char[n-start];
  86. strcpy(HC[i],&cd[start]);
  87. }
  88. printf("输出叶子结点及其哈夫曼编码为:\n");
  89. for(i=1;i<=n;i++){
  90. printf("%c:",a[i]);
  91. printf("%s\n",HC[i]);
  92. }
  93. delete cd;
  94. }
  95. //主函数
  96. int main()
  97. {
  98. int n,m,i;
  99. int choice;
  100. printf("**********哈夫曼树及哈夫曼编码**********\n");
  101. printf("1.输入字符集大小\n");
  102. printf("2.输入带编码字符及其权值\n");
  103. printf("3.建立哈夫曼树HT\n");
  104. printf("4.完成哈夫曼编码HC,并显示编码\n");
  105. printf("5.退出\n");
  106. while(choice)
  107. {
  108. printf("请选择菜单1--5:\n");
  109. scanf("%d",&choice);
  110. if(choice>5||choice<=0)
  111. {
  112. printf("您输入的数据有误!\n");
  113. return 0;
  114. }
  115. while(choice<=5)
  116. {
  117. if(choice==1)
  118. {
  119. printf("请输入字符集大小:\n");
  120. scanf("%d",&n);
  121. break;
  122. }
  123. if(choice==2)
  124. {
  125. printf("输入带编码字符及其权值\n");
  126. printf("请输入%d个字符:\n",n);
  127. for(i=0;i<=n;i++){
  128. scanf("%c",&a[i]);
  129. }
  130. getchar();
  131. break;
  132. }
  133. if(choice==3)
  134. {
  135. printf("建立哈夫曼树HT:\n");
  136. CreateHuffmanTree(HT,n);
  137. break;
  138. }
  139. if(choice==4)
  140. {
  141. printf("完成哈夫曼编码HC,并显示编码:\n");
  142. getchar();
  143. CreateHuffmanCode(HT,HC,n);
  144. break;
  145. }
  146. if(choice==5)
  147. {
  148. printf("退出!\n");
  149. return 0;
  150. }
  151. }
  152. }
  153. }

 

实验结果:eba8f27951c147f89d888ec5150a72c6.png

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/595978
推荐阅读
相关标签
  

闽ICP备14008679号