for(i=1,j=0;i<=n;++i,++j)
{
HT[i].weight=w[j];
HT[i].parent=HT[i].lchild=HT[i].rchild=0;
//n 个叶子赋初值
}
for(;i<=m;++i)
HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=0;
//除叶子外的节点赋初
值
for(i=n+1;i<=m;i++)
{
//建赫夫曼树
//在 HT[1..i-1]选择 parent 为 0 且 weight 最小的两个节点,其序号为别为 s1,s2.
temp1=temp2=100;
for(j=1;j<=i-1;j++)
if(HT[j].parent==0)
if(HT[j].weight
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
//编码结束符位置
//从叶子到根逆向求编码
if(HT[f].lchild==c)
cd[--start]='0';
else cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],cd+start);
//从 cd 复制编码到 HC
//为第 i 个字符编码分配空间
}
free(cd);
printf("\nnum bianma\n");
for(i=1;i<=n;i++)
printf("%-5d%s\n",i,HC[i]);
//--------------Huffmancoding-----------------------------------------------------
printf("\n 请输入一段 0-1 编码\n");
gets(g);
printf("\n 解码后为:");
mm=m;
for(i=0;i<=(signed)strlen(g);)
{
if(HT[mm].lchild==0&&HT[mm].rchild==0)
{
printf("%c",HT[mm].ch);
mm=m;
//continue;
}
else
{
if(g[i]=='0')
{
mm=HT[mm].lchild;
i++;
}
else
{
mm=HT[mm].rchild;
i++;
}
}
}
printf("\n");
return 0;
}