#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;
}

 

 

posted on 2009-07-22 10:48  Forgetting  阅读(440)  评论(0)    收藏  举报