请教哈夫曼树编码问题
请大家帮我看一下我的程序有什么问题 谢谢大家
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct
{
char data;
unsigned weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树
typedef char **HuffmanCode; //动态分配数组存储赫夫曼编码表
void HuffmanCoding();
void select(HuffmanTree,int ,int *,int *);
void main()
{
HuffmanCoding();
}
void HuffmanCoding()
//d存放n个字符,w存放字符的权值(w>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
{
HuffmanTree HT;
HuffmanCode HC;
char d;
int w,n;
printf("请输入待编码字符数:\n");
scanf("%d",&n);
if(n<=1)return;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用
int i;
for(i=1;i<=n;++i)
{
printf("请输入待编码字符:\n");
scanf("%c",&d);
printf("请输入字符的相应权值:\n");
scanf("%d",&w);
HT[i].data=d;
HT[i].weight=w;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{ HT[i].data=0;
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
//
for(i=n+1;i<=m;++i)
{ //建赫夫曼树,在HT[1...k-1]选择parent为零且weight最小的两个结点,其序号分别为s1和s2
int s1,s2;
select(HT,i-1,&s1,&s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
//---从叶子到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配n个字符编码的头指针向量
char*cd=(char*)malloc(n*sizeof(char)); //分配求编码的工作空间
cd[n-1]='\0'; //编码结束符
for(i=1;i<=n;i++)
{ //逐个字符求赫夫曼编码
int start=n-1; //编码结束符位置
for(int k=i,j=HT[i].parent;j!=0;k=j,j=HT[j].parent)
{ //从叶子到根逆向求编码
if(HT[j].lchild==k)
cd[--start]='0';
else cd[--start]='1';
}
HC[i]=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间
strcpy(HC[i],&cd[start]); //从cd复制编码到HC
free(cd);//释放工作空间
} //HuffmanCoding
for(i=1;i<=n;++i)
printf("%c的编码是%s",HT[i].data,HC[i]);
}
void select(HuffmanTree ht,int r,int * u1,int * u2)//选择权值最小的两个节点
{
for(int e=1;e<=r-1;e++)
{
if(ht[e].parent)continue;
*u1=e;
for(;e<=r-1;e++)
{
if(ht[e+1].parent==0)
if(ht[*u1].weight>ht[e+1].weight)
*u1=e+1;
ht[*u1].parent=1;
}
break;
}
for(e=1;e<=r-1;e++)
{
if(ht[e].parent)continue;
*u2=e;
for(;e<=r-1;e++)
{
if(ht[e+1].parent==0)
if(ht[*u2].weight>ht[e+1].weight)
*u2=e+1;
}
break;
}
}