输入任意字符串,str[]={"a","b","c","d","e”,"f","g","h"},每种字符出现频率fnum[]={0.070.19,0.02,0.06,0.32,0.03,0.21,0.1},根据出现频率,利用哈夫曼编码原理,对每个字符进行(0.1)编码,并输出每种字符编码。
注意:写清具体步骤(文字描述)和程序流程图!
![](https://profile-avatar.csdnimg.cn/6a1ae9fe99af4963b7475dbaf8578bb7_weixin_70123323.jpg!4)
输入任意字符串,str[]={"a","b","c","d","e”,"f","g","h"}
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- CSDN专家-深度学习进阶 2022-06-15 17:54关注
#include <stdio.h> #include <string.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; #define N 50 //叶子结点数 #define M 2*N-1 //树中结点总数 //哈夫曼树的节点结构类型 typedef struct { char data; //结点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩子结点 } HTNode; //每个节点哈夫曼编码的结构类型 typedef struct { char cd[N]; //存放哈夫曼码 int start; } HCode; void CreateHT(HTNode ht[],int n) { int i,k,lnode,rnode; double min1,min2; for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n; i<2*n-1; i++) //构造哈夫曼树 { min1=min2=32767; //lnode和rnode为最小权重的两个结点位置 lnode=rnode=-1; for (k=0; k<=i-1; k++) if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找 { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; } } //实现哈夫曼编码 void CreateHCode(HTNode ht[],HCode hcd[],int n) { int i,f,c; HCode hc; for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) //循序直到树根结点 { if (ht[f].lchild==c) //处理左孩子结点 hc.cd[hc.start--]='0'; else //处理右孩子结点 hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; //start指向哈夫曼编码最开始字符 hcd[i]=hc; } } //输出哈夫曼编码 void DispHCode(HTNode ht[],HCode hcd[],int n) { int i,k; double sum=0,m=0; int j; printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码 for (i=0; i<n; i++) { j=0; printf(" %c:\t",ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c",hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; printf("\n"); } printf("\n 平均长度=%g\n",1.0*sum/m); } int main() { int n=8,i; //n表示初始字符串的个数 char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1}; HTNode ht[M]; HCode hcd[N]; for (i=0; i<n; i++) { ht[i].data=str[i]; ht[i].weight=fnum[i]; } printf("\n"); CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); printf("\n");}
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 3无用
悬赏问题
- ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
- ¥20 关于#c++#的问题:(2)运算二叉树·表达式一般由一个运算符和两个操作数组成:(相关搜索:二叉树遍历)
- ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
- ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
- ¥45 求17位带符号原码乘法器verilog代码
- ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
- ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
- ¥15 怎么看我在bios每次修改的日志
- ¥15 python+mysql图书管理系统
- ¥15 Questasim Error: (vcom-13)