数据结构作业,哈夫曼树的创建,编码,解码
哈夫曼树的生成:
#define M 80
typedef struct
{
char data;
int weight;
int parent,lch,rch;
}NodeType;
typedef NodeType HufTree[M+1];
typedef char ** HufCode;
/*在huffman树中选出两个双亲为0且权值最小的结点*/
void select(HufTree ht,int n,int *s1,int *s2)
{
int i,j;int t=1000;
for(i=1;i<=n;i++)
{
if(ht[i].parent==0&&ht[i].weight<=t)
{
*s1=i;
t=ht[i].weight;
}
}
t=1000;
for(j=1;j<=n;j++)
{
if(ht[j].parent==0&&ht[j].weight<=t&&j!=*s1)
{
*s2=j;
t=ht[j].weight;
}
}
}
/*生成huffman树*/
void huf_tree(float w[],char data[],HufTree &ht,int n)
{
int i;int s1,s2;
for(i=1;i<=n;i++)
{
ht[i].weight=w[i-1];
ht[i].data=data[i-1];
ht[i].parent=0;
ht[i].lch=0;ht[i].rch=0;
}
for(i=n+1;i<=2*n-1;i++)
ht[i].parent=0;
for(i=n+1;i<=2*n-1;i++)
{
select(ht,i-1,&s1,&s2);
ht[i].weight=ht[s1].weight+ht[s2].weight;
ht[i].lch=s2;ht[i].rch=s1;
ht[s1].parent=i;ht[s2].parent=i;
}
}
哈夫曼树的编码:
void huf_code(HufCode &hcd,HufTree ht,int n)
{
hcd=(HufCode)malloc(sizeof(char *)*(n+1));
char *cd;
cd=(char *)malloc(sizeof(char)*n);
int i;
for(i=1;i<=n;i++)
{
cd[n-1]='\0';
int start;
start=n-1;int c=i;
int f=ht[c].parent;
while(f!=0)
{
if(ht[f].lch==c)
cd[--start]='0';
else
cd[--start]='1';
c=f;f=ht[c].parent;
}
hcd[i]=(char *)malloc(sizeof(char)*(n-start));
strcpy(hcd[i],&cd[start]);
}
}
int search(char data[],HufCode hcd,int n)
{
int i,t=0;
for(i=1;i<=n;i++)
{
if(strcmp(hcd[i],data)==0)
{
t=i;
break;
}
}
return t;
}
哈夫曼树的解码:
void huf_decode(HufCode hcd,HufTree ht,char code[],int n)
{
char data[20];
int i=0,j=0;int t;
while(code[i]!='\0')
{
data[j]=code[i];
data[j+1]='\0';
if((t=search(data,hcd,n))!=0)
{
printf("%c",ht[t].data);
j=0;i++;
}
else
{
i++;j++;
}
}
}