哈夫曼码

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct HTNode{
char c;
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
HuffmanTree  CreatHuffmanTree( int n);
void Select(HuffmanTree HT,int i,int *s1,int *s2);
void CreatHuffmanCode(HuffmanTree *HT, int n);
void EnCoding(HuffmanTree HT,HuffmanCode HC,int n);
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    HuffmanTree HT;
    HT=CreatHuffmanTree(n);
    HuffmanCode HC;
    CreatHuffmanCode(&HT, n);
    EnCoding(HT,HC,n);
    return 0;
}
HuffmanTree CreatHuffmanTree( int n) //creat a huffmantree which is HT
{
    int s1 , s2,j,k=1;
    if(n <= 1)
        return ;
    int m = 2*n-1 ;
    HuffmanTree HT;
    HT =(HuffmanTree)malloc(sizeof(HTNode)*(m+1));
    for(int i = 1;i <= m;i++)
    {
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    for(int i = 1;i <= n;i++)
    {
        scanf("%c%d",&HT[i].c,&HT[i].weight);
    }
    for(int i = n+1;i <= m;++i)
    {
        while(HT[k].parent!=0)  //s2 is the second least of HT[].weight
            k++;
        s1=k;
        for(j=1;j<=i-1;++j)
            if(HT[j].parent==0&&HT[j].weight<HT[s1].weight)
                s1=j;
        k=1;
        while((HT[k].parent!=0||k==s1))
            k++;
        s2=k;
        for(j=1;j<=i-1;++j)
            if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)
                s2=j;
        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;
    }
    return HT;
}
void CreatHuffmanCode(HuffmanTree *HT, int n)  // Create the HuffmanCode
{
    int start,c,f;
    char *cd;
    HuffmanCode HC;
    HC =(HuffmanCode)malloc(sizeof(char*)*(n+1));
    cd = (char*)malloc(n*sizeof(char));
    cd[n-1] = '\0';
    for (int i = 1;i <= n;i++)
    {
        start = n-1;
        c = i;
        f = (*HT)[i].parent;
        while (f != 0)
        {
            start--;
            if((*HT)[f].lchild == c)
                cd[start] = '0';
            else
                cd[start] = '1';
            c = f;
            f = (*HT)[f].parent;
        }
        HC[i] = (char*)malloc((n-start)*sizeof(char));
        strcpy(HC[i],&cd[start]);
        printf("%c's Huffman code is: %s",(*HT)[i].c,HC[i]);
        printf("\n");
    }
    free(cd);
}
void EnCoding(HuffmanTree HT,HuffmanCode HC,int n)
{
    int len,i,j;
    char str[1000];
    scanf("%s",str);
    len = strlen(str);
    for(i = 0;i<len;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(str[i] == HT[j].c)
                printf("%s",HC[j]);
        }
    }
    printf("\n");
}
发布了38 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41514794/article/details/83550186