#include<iostream>
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树
typedef char **HuffmanCode; //动态分配数组存储赫夫曼编码表
void SetWeight(HuffmanTree &HT,unsigned int *w,int n)
{
int m=2*n-1;
int i;
HuffmanTree p;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;i++,p++)
{
p->weight=w[i];
p->lchild=0;
p->rchild=0;
p->parent=0;
}
for(; i<=m;++i,++p)
{
p->lchild=0;
p->parent=0;
p->rchild=0;
p->weight=0;
}
}
void Select(HuffmanTree HT,int end,int &S1,int &S2)
{
int i;
for(i=1;i<=end;i++)
{
if(HT[i].parent==0)
{
S1=i;
break;}
}
for(i=1;i<=end;i++)
{
if(HT[i].parent==0&&HT[i].weight<HT[S1].weight)
S1=i;
}
for(i=1;i<=end;i++)
{
if(HT[i].parent==0&&i!=S1)
{
S2=i;
break;
}
}
for(i=1;i<=end;i++)
if(HT[i].parent==0&&HT[i].weight<HT[S2].weight&&i!=S1)
S2=i;
if(S1>S2)
{
int temp;
temp=S1;
S1=S2;
S2=temp;
}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,unsigned int *w,int n)
{
int m=2*n-1;
int i,f,c,start;
int S1,S2;
char *cd;
SetWeight(HT,w,n);
for(i=n+1;i<=m;i++)
{
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 *));
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].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]);
cout<<"第"<<i<<"个字符的编码为 :"<<HC[i]<<endl;
}
free(cd);
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
unsigned int *w;
int n;
int i;
cout<<"请输入字符数: "<<endl;
cin>>n;
w=(unsigned int *)malloc((n+1)*sizeof(unsigned int));
cout<<"请输入字符的权重"<<endl;
for(i=1;i<=n;i++)
{
cin>>w[i];
}
SetWeight(HT,w,n);
HuffmanCoding(HT,HC,w,n);
return 0;
}
浙公网安备 33010602011771号