数据结构赫夫曼树源程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hhy2014yatan/article/details/46922569
#include<string.h>
#include<stdlib.h> 
#include<stdio.h> 
typedef struct { 
unsigned int weight; 
    unsigned int parent,lchild,rchild; 
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树 
typedef char * *HuffmanCode;
int min(HuffmanTree t,int i)
{
   int j,flag;
   unsigned int k = 1000;
   for(j=1; j<=i; j++) 
   {
      if(t[j].weight<k && t[j].parent==0) 
 {
         k = t[j].weight;
         flag = j;
 }
   }
   t[flag].parent = 1;
   return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{
    int j;
    s1 = min(t,i);
    s2 = min(t,i);
    if(s1>s2) 
{
      j = s1;
      s1 = s2;
      s2 = j;
}
}
void HuffmanCoding(HuffmanTree& HT,HuffmanCode& HC,int *w,int n)
{
    int m = 0;
    int i = 0;
    int s1 = 0; 
    int s2 = 0;
    int start = 0;
    char *cd;
    HuffmanTree p;
    unsigned int c,f;
if(n<=1) return;
m = 2*n - 1;
    HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1; i<=n; ++i,++p,++w)
{
       (*p).weight = *w;
       (*p).lchild = 0;
       (*p).rchild = 0;
       (*p).parent = 0;
}
for(; i<=m; ++i,++p) 
{
(*p).parent = 0;
}
for(i=n+1; i<=m; ++i)
{
select(HT,i-1,s1,s2);
HT[s1].parent = 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]);
}
    free(cd);
}




void main() 
{
//int *w,n,i;
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i; 
printf("请输入权值的个数:"); 
scanf("%d",&n); 
   
w = (int *)malloc(n*sizeof(int)); 
printf("输入%d个结点的权值\n",n); 
for(i = 0;i < n;i++) 
{
scanf(" %d",w+i);
}

HuffmanCoding(HT,HC,w,n); 
for(i = 1;i <= n;i++) 
{
printf("权值为%d 的字符的编码为 ",*(w+i-1));
   puts(HC[i]);
}
return;

}

猜你喜欢

转载自blog.csdn.net/hhy2014yatan/article/details/46922569
今日推荐