哈夫曼树的建立

寵の児 提交于 2019-12-06 04:51:27

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXVALUE 10000

typedef struct{
    int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;

typedef char **HuffmanCode;

void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n);
void Select(HuffmanTree t, int k, int *s1, int *s2);

void main()
{
    HuffmanTree HT;HTNode t;
    HuffmanCode HC;
    int n,w[8] ={5, 29, 7, 8, 14, 23, 3, 11};
    HT = &t;
    n = 8;
    HuffmanCoding(HT,&HC,w,n);
}



void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,int *w,int n){
    HuffmanTree p;
    int i,m,s1,s2,start,c,f,j;
    char *cd;
    if(n<=1) return;
    m = 2 * n -1;
    HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));
    p = HT;
    for(i = 1;i<=n;++i,++w){
        p[i].weight = *w;
        p[i].parent=p[i].lchild=p[i].rchild = 0;
    }
    for( ;i<=m;++i)
        p[i].weight=p[i].parent=p[i].lchild=p[i].rchild = 0;
    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;
    }
    printf("  weight   parent   lchild   rchild");
    for(i = 1;i<=m;i++)
        printf("\n%8d %8d %8d %8d",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
    *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]);
    }

    for(i = 1;i<=n;i++){
        printf("\n    %4d 的哈夫曼编码为: ",HT[i].weight);
        printf("%s ",(*HC)[i]);
    }
    free(cd);
}
void Select(HuffmanTree t, int k, int *s1, int *s2)
{
    int small1, small2,i;
    *s1 = *s2 = 0;
    small1 = small2 = MAXVALUE;
    for (i = 0; i <= k; i++)
    {
        if (t[i].parent == 0)
        {
            if (t[i].weight < small1)
            {
                small2 = small1;
                small1 = t[i].weight;
                *s2 = *s1;
                *s1 = i;
            }
            else if (t[i].weight < small2)
            {
                small2 = t[i].weight;
                *s2 = i;
            }
        }
    }
}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!