数据结构作业之哈夫曼树的创建,编码,解码

数据结构作业,哈夫曼树的创建,编码,解码

哈夫曼树的生成:


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

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值