#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int s2;
int s1;
typedef struct {
int data;
int p,lc,rc;
}Htree,*Hufftree;
typedef char **Huffcode;
void select (Hufftree &Ht,int n,int s1,int s2)
{
char *cd;
int min1,min2;
min1=min2=32765;
s1=s2=0;
int i;
for (i=1;i<=n;i++)
{
if (!Ht[i].p)
if (Ht[i].data<min1)
{
min2=min1;
s2=s1;
min1=Ht[i].data;
s1=i;
}
else if (Ht[i].data<min2)
{
s2=i;
min2=Ht[i].data;
}
}
}
void Huffman(Hufftree &Ht,Huffcode &Hc,int *w,int n)
{
int m,start;
char*cd;
int i,c,f;
int s1,s2;
Hufftree p;
if (n<1)return;
m=2*n-1;
Ht=(Hufftree)malloc ((m+1)*sizeof(Huffcode));
for (p=Ht,i=1;i<=n;i++,++p,++w)
*p={*w,0,0,0};
for(;i<=m;++i,++p)
*p={0,0,0,0};
for (i=n+1;i<=m;++i)
{
select(Ht,i-1,s1,s2);
Ht[s1].p=i;Ht[s2].p=i;
Ht[i].lc=s1;Ht[i].rc=s2;
Ht[i].data=Ht[s1].data+Ht[s2].data;
}
Hc=(Huffcode)malloc ((n+1)*sizeof(char*));
cd=(char *)malloc (n*sizeof(char));
cd[n-1]='\0';
for (i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=Ht[i].p;f!=0;c=f,f=Ht[f].p)
{
if (Ht[i].lc==c)
cd[--start]='0';
else
cd[--start]='1';
}
Hc[i]=(char *)malloc ((n-start)*sizeof(char));
strcpy (Hc[i],&cd[start]);
puts(Hc[i]);
}
}
int main ()
{
Hufftree Ht;
Huffcode Hc;
int w[10];
int i,n;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&w[i]);
Huffman(Ht,Hc,w,n);
return 0;
}
哈夫曼树与编码
最新推荐文章于 2024-08-11 20:18:31 发布