哈夫曼树

来源:互联网 发布:ubuntu怎么编译c语言 编辑:程序博客网 时间:2024/04/29 13:03

这是我曾经做的关于哈弗曼树的小程序:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define n 8
#define m 2*n-1
typedef struct
{ int weight;
 int lchild,rchild,parent;
}HTNode,*huffmantree;
typedef char **huffmancode;

void inputhf(huffmantree &T)      //输入哈夫曼树的数据
{ int i;int k;
T=(huffmantree)malloc((m+1)*sizeof(HTNode));
 for(i=1;i<=n;i++)
  { scanf("%d",&k);
    T[i].weight=k;
 T[i].parent=0;
    T[i].lchild=0;
    T[i].rchild=0;  
  }

 for(i=n+1;i<=m;i++)
  { T[i].weight=0;
    T[i].parent=0;
    T[i].lchild=0;
    T[i].rchild=0;
  }
}
void selectmin(huffmantree &T,int k,int *p1,int *p2)//寻找两个weight最小的结点
{ int i;int s1=10000,s2=10000;
 for(i=1;i<=k;i++)
  { if(T[i].parent==0)
     if(T[i].weight<s1)
   { s2=s1;
  s1=T[i].weight;
  *p2=*p1;
  *p1=i;
   }
  else
   if(T[i].weight<s2)
      { s2=T[i].weight;
*p2=i;
      }
  }
}

void creathftree(huffmantree &T)    //建哈夫曼树
{ int i,p1,p2;
  inputhf(T);
 for(i=n+1;i<=m;i++)
  { selectmin(T,i-1,&p1,&p2);
    T[p1].parent=T[p2].parent=i;
    T[i].lchild=p1;
    T[i].rchild=p2;
    T[i].weight=T[p1].weight+T[p2].weight;
  }
}
void creathfcode(huffmantree T, huffmancode &H)  //哈夫曼编码表
{ int i,c,p,start;char cd[n];
H=(huffmancode)malloc((n+1)*sizeof(char *));
 cd[n-1]='/0';
 for(i=1;i<=n;i++)
  {
    start=n-1;
    
 for(c=i,p=T[i].parent;p!=0;c=p,p=T[p].parent)
   
  if(T[p].lchild==c)
 cd[--start]='0';
  else
   cd[--start]='1';
     H[i]=(char *)malloc((n-start)*sizeof(char));
    strcpy(H[i],&cd[start]);
  }
 printf("赫夫曼编码:/n");
 for(i=1;i<=n;i++) {
  printf("%d-> %s/n",T[i].weight,H[i]);}
}

void main()
{
 HTNode *T;
 huffmancode H;
 printf("请输入%d个结点的权值:/n",n);
 creathftree(T);
 creathfcode(T,H);

}

原创粉丝点击