C语言哈夫曼树的实现---小勇勇

来源:互联网 发布:手机淘宝号怎么注册 编辑:程序博客网 时间:2024/06/13 08:46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int weight;
int parent;
int Lchild;
int Rchild;
}HFTree;
int n;
int s1,s2;
void HFMT(HFTree* HT,int* a){
int i;
HT = (HFTree*)malloc((2 * n) * sizeof(HFTree));
for(i = 1;i <= n;i++){
HT[i].weight = a[i];

}
for(i = 1;i < 2 * n;i++){
HT[i].parent = 0;
HT[i].Lchild = 0;
HT[i].Rchild = 0;
}
for(i = n + 1;i < 2 * n;i++){
Select(HT,i-1);
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;
HT[i].weight = HT[i - 1].weight + HT[s1].weight;
}
printf("data\tweight\tparent\tLchild\tRchild\n");
for(i = 1 ;i < 2 * n;i++){
printf("%d\t%d\t%d\t%d\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].Lchild,HT[i].Rchild);

CreatHFcode(HT,a);
free(HT); 
}
int Select(HFTree* HT,int i){
    int tmp =10000, tmpi = 0;                             
int j; 

  for(j = 1; j <= i; j++){  
    if(HT[j].parent == 0){  
    if(tmp > HT[j].weight){  
      tmp = HT[j].weight; 
        tmpi = j;  
          }  
       }  
    }  
    s1 = tmpi;  
     
    tmp = 10000;  
    tmpi = 0;  
    for(j = 1; j <= i; j++){  
    if(HT[j].parent == 0 && j != s1){ 
      if(tmp > HT[j].weight){  
        tmp = HT[j].weight;  
          tmpi = j;  
            }  
       }  
    }  
    s2 = tmpi;    
}
int CreatHFcode(HFTree* HT,int* a){
int i;
char** Hc;
char* cd;
int star,c,f;
cd = (char*)malloc(n * sizeof(char));
Hc = (char**)malloc(sizeof(char*) * n);

cd[n - 1] = '\0';
for(i = 1;i <= n ;++i){
star = n - 1;
c = i;
f = HT[i].parent;
while(f != 0){
--star;
if(HT[f].Lchild == c)cd[star] = '0';
else cd[star] = '1';
c = f;
f = HT[f].parent;
}
Hc[i] = (char*)malloc((n - star) * sizeof(char));
strcpy(Hc[i],&cd[star]);

}
printf("\n*******编码值*********\n");
for(i = 1 ;i <= n;i++){
printf("%d\t%s\n",a[i],Hc[i]);
}  
free(cd);
free(Hc);

int main(int argc, char *argv[])
{
HFTree* HT;
int* a;
int i; 
 
printf("请输入您所要输入的个数:");
scanf("%d",&n); 
a = (int*)malloc((n + 1) * sizeof(int));

printf("请输入%d个数字:",n);
for(i = 1;i <= n;i++)
scanf("%d",&a[i]); 
HFMT(HT,a);
free(a);
return 0;
}
原创粉丝点击