哈夫曼树构造编码译码源程序
}
printf("The data and the bits is as follows:\n");
huffmancode(ht,n); /*调用函数*/
printf("请输入一组需要译码的二进制报文(单个数字之间请用空格隔开,如1011应该输入1 0 1 1,以-1结尾):\n");
huffmandecode(cd,ht,n); /*调用函数*/
#include"stdio.h"
#define maxbit 10 /*定义哈夫曼编码最大长度*/
#define maxvalue 10000 /*定义最大权值常量*/
#define maxnodenumber 100 /*定义结点最大数目常量*/
typedef struct /*定义结点结构*/
ht[n+i].lchild=k1;
ht[n+i].rchild=k2;
}
printf("\n构造的哈夫曼树如下:\n");
printf("\n");
printf("数组下标lchild data weight rchlid parent \n");
for(i=0;i<2*n-1;i++){
printf(" %d %d %c %f %d %d\n",i,ht[i].lchild,ht[i].data,ht[i].weight,ht[i].rchild,ht[i].parent);
{ht[i].weight=0.00000;
ht[i].data='0';
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}
for(i=0;i<n;i++)
{fflush(stdin);
scanf("%c %f",&ht[i].data,&ht[i].weight);}
i=2*n-2;
}
scanf("%d",&b);
}
printf("\n");
if((ht[i].lchild!=0)&&(i!=2*n-2))
printf("\n ERROR\n");
}
do
{j--;
p=ht[c].parent;
if(ht[p].lchild==c)
cd[i].bit[j]=0;
else
cd[i].bit[j]=1;
c=p;
} while(p!=0);
cd[i].start=++j;
}
for(i=0;i<n;i++)
{printf("data:%c bits:",ht[i].data);
}
else
if(ht[j].parent==0&&(m2-ht[j].weight)>=0.000001)
{m2=ht[j].weight;k2=j;
}
ht[k1].parent=n+i;
ht[k2].parent=n+i;
ht[n+i].weight=ht[k1].weight+ht[k2].weight;
for(i=0;i<n-1;i++)
{m1=maxvalue;
m2=maxvalue;
k1=0;k2=0;
for(j=0;j<n+i;j++)
if(ht[j].parent==0&&(m1-ht[j].weight)>=0.000001)
{m2=m1;k2=k1;
m1=ht[j].weight;k1=j;
i=2*n-2;
scanf("%d",&b);
printf("译码的结果如下:\n");
while(b!=endflag)
{ if(b==0) i=ht[i].lchild;
else i=ht[i].rchild;
if(ht[i].lchild==0)
{ printf("%c",ht[i].data);
}
void huffmancode(htnode ht[],int n)/*对具有n个叶子结点的哈夫曼树ht,求所有叶子结点的哈夫曼编码并输出*/
{int i,j,c,p,m,k;
char ch[100];
hcodetype cd[100];
for(i=0;i<n;i++)
{c=i;j=maxbit;
{float weight;
char data;
int parent,lchild,rchild;
}htnode;
typedef struct /*定义保存一个叶子结点哈曼编码的结构*/
{int bit[maxbit];
int start;
}hcodetype;
hcodetype cd[maxbit];
for(j=cd[i].start;j<maxbit;j++)
printf("%d",cd[i].bit[j]);
printf("\n");
}
}
void huffmandecode(hcodetype cd[],htnode ht[],int n)
{ int i,c,p,b;
int endflag=-1;
void main() /*主函数*/
{void huffmancode(htnode ht[],int n);
void huffmandecode(hcodetype cd[],htnode ht[],int n);
htnode ht[maxnodenumber];
int i,j,k1,பைடு நூலகம்2,n,a;
float m1,m2;
printf("哈夫曼树的构造及应用\n");
printf("请输入叶子数目n: "); /*提示输出叶子结点个数*/
scanf("%d",&n);
printf("Please input data and weight:\n"); /*提示输出各叶子结点的权值*/
for(i=0;i<2*n-1;i++)