该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
设电文符集D及各字符出现的概率F如下:
D={a,b,c,d,e,f,g,h}(字符数n=8)
F={5,29,7,8,14,23,3,11}(%)
编写完成下列功能的程序:
1.构造关于F的Huffman数;
2.求出并打印D中各字符的Huffman编码。
#include
#include
#include
#define n 8 //设定权值数
#define m
2*n-1 //H树的节点数
typedef
struct //定义节点
{
int wi; //节点权值
char
data; //该节点data值
int parent ,Lchild ,Rchild; //双亲及左、右子指针
}huffm; //H树节点说明符
void
HuffmTree(huffm HT[m+1] ) //构造H树的算法
{
int i, j, p1, p2; int w, s1, s2,max;
for(i=1;i<=m;i++) //初始化
{ HT[i].wi=0;
HT[i].parent=HT[i].Lchild=HT[i].Rchild=0;
}
for(i=1; i<=n; i++)
scanf("%d",&w ); //读入权值
for(i=n+1;
i<=m; i++) //进行n-1次循环,产生n-1个新节点,构造H树
{
p1=p2=0; //p1、p2 为所选权值最小的根节点序号
s1=s2=max; //设max为机器能表示的最大整数
for(j=1;j<=i-1;j++) //从HT[1]~HT[i-1]中选两个权值最小的根节点
if(HT[j].parent==0)
if(HT[j].wi
{ s2=s1; p2=p1; //以j节点为第一个权值最小的根节点
s1=HT[j].wi; p1=j; }
else if(HT[j].wi