/*
Description:哈夫曼树编码问题 创建哈夫曼树并编码
*/
#include<stdio.h>
#include<stdlib.h>
#define max 20
struct huffnode
{
char date;//数据域
int weight;//权值
int parent;//双亲域
int left;//左孩子
int right; //右孩子
};
struct huffcode
{
char cd[max];
int start;
};
int main()
{
struct huffnode ht[2*max];//存放哈夫曼结点的数组
struct huffcode hcd[max],d;//哈夫曼编码栈类型
int n,i;
printf("请输入n:");//n结点个数
scanf("%d",&n);
for(i=1;i<=n;i++)//为每个结点负权值
{
//getchar();
printf("%d:",i);
scanf("%c",&ht[i].date);
printf("weight:");
scanf("%d",&ht[i].weight); //负权值
}
int m1,m2,l,r,k,c,f;
for(i=1;i<=2*n-1;i++)//初始化每个结点的双亲 左右指针域
{
m1=32767;//设初始值无穷大
r=0;l r为指向左右孩子的指针
l=0;
for(k=1;k<=i-1;k++)//找权值最小的两棵树,并用吗
if(ht[k].weight==0)
if(ht[k].weight<m1)
{
m2=m1;
r=l;
m1=ht[k].weight;
l=k;
}
else if(ht[k].weight<m2)
{
m2=ht[k].weight;
r=k;
}
ht[l].parent=i;
ht[r].parent=i;
ht[i].left=l;
ht[i].right=r;
}
for(i=1;i<=n;i++)//进行哈夫曼编码
{
d.start=n;
c=i;
f=ht[i].parent;
while(f!=0)
{
if(ht[f].left==c)
d.cd[d.start]='0';
else
d.start=d.start-1;
c=f;
f=ht[f].parent;
}
hcd[i]=d;
}
printf("输出哈夫曼编码:/n");
for(i=1;i<=n;i++)
{
printf("%c:",ht[i].date);
for(k=hcd[i].start;k<=n;k++)
printf("%c",hcd[i].cd[k]);
printf("/n");
}
}
实验四、4哈夫曼树编码
最新推荐文章于 2022-10-17 10:13:23 发布