huffman编码的实现与详解

首先我们看看它的原理。

huffman编码的实现与详解_第1张图片

过程很简单

1:首先定义结构体

/* *************huffman code的实现**************** */
#include
#include
#include
typedef struct{
    float weight;
    int parent,lchild,rchild;
    char value;

}Node;//定义结构体,value储存字符本身,weight表示权值。
int n;//叶子结点的个数
Node *tree;//树的指针
2:根据输入的n创建相应的2*n-1个结点,并进行处理。

void CreateTree()
{
    int i;
    printf("-----------------welcome to the super huffmancode------------------\n");
    printf("please enter the number of the words:\n");
    scanf("%d",&n);
    printf("please enter the word and it's weight(such as A 12.3):\n");
    tree=(Node*)malloc(sizeof(Node)*(2*n-1));
    for(i=0;i
原理就是根据输入的n申请内存(都假设申请成功,并未判断是否成功),接着处理前面n个结点,前面n个叶子结点的权值由用户输入,后面的结点的权值都为0,并且初始化全部结点的双亲结点以及孩子结点都为-1.

4:接着进入CombineNode函数将结点的关系梳理出来。
void CombineNode()//结合两结点,供建树使用
{
    int i,j,x1,x2,m1,m2;//x1,x2分别储存最小的两个权值的结点的下标,m1,m2分别为所对应的权值。
    for(i=0;i一共有n个结点,需要连接n-1次,这也是为什么其余的结点为n-1个的原因,用来做bond
    {
        m1=m2=1000000;//先假设权值都为一个非常大的值,并且x1,x2随意取
        x1=x2=0;
        for(j=0;j

5: 树建好了,接下来就是编码了,通过叶子结点往根节点从而获取huffman编码。
char ** encode()
{
    char **p,*temp;//temp用来临时存放每个字符所对应的编码
    int i,j,start,c,f;//i,j循环变量,start用来记录每个字符的编码所在的起始位置,毕竟不是每个字符的编码都是n个长度。
    temp=(char*)malloc(sizeof(char)*n);//申请temp的内存,仅需要n个char的空间即可。
    temp[n-1]='\0';//让temp有个结尾字符
    p=(char**)malloc(sizeof(char*)*n);//p是指向一堆字符指针的指针,它最后的元素是指向每个不同字符所对应编码的首字符。例如,p[0]就是第0个字符的编码的首字符。
    for(i=0;i

6:main函数如下
int main()
{
    int i;
    char **p;
    CreateTree();
    p=encode();
    printf("Finished processing.........................\n");
    for(i=0;i
总代码如下:

/* *************huffman code的实现**************** */
#include
#include
#include
typedef struct{
    float weight;
    int parent,lchild,rchild;
    char value;


}Node;//定义结构体,value储存字符本身,weight表示权值。
int n;//叶子结点的个数
Node *tree;//树的指针
void CombineNode()//结合两结点,供建树使用
{
    int i,j,x1,x2,m1,m2;//x1,x2分别储存最小的两个权值的结点的下标,m1,m2分别为所对应的权值。
    for(i=0;i     {
        m1=m2=1000000;
        x1=x2=0;
        for(j=0;j         {
            if(tree[j].weight             {
                m2=m1;
                x2=x1;
                m1=tree[j].weight;
                x1=j;
            }
            else if(tree[j].weight             {
                m2=tree[j].weight;
                x2=j;
            }


        }
        tree[x1].parent  = n+i;
        tree[x2].parent  = n+i;
        tree[n+i].weight = tree[x1].weight + tree[x2].weight;
        tree[n+i].lchild = x2;
        tree[n+i].rchild = x1;
    }
}
void CreateTree()
{
    int i;
    printf("-----------------welcome to the super huffmancode------------------\n");
    printf("please enter the number of the words:\n");
    scanf("%d",&n);
    printf("please enter the word and it's weight(such as A 12.3):\n");
    tree=(Node*)malloc(sizeof(Node)*(2*n-1));
    for(i=0;i     {
        getchar();//吸收回车
        scanf("%c%f",&tree[i].value,&tree[i].weight);
        tree[i].parent=tree[i].lchild=tree[i].rchild=-1;


    }//叶子结点处理完毕
    for(;i<2*n-1;i++){
            tree[i].weight=0;
            tree[i].parent=tree[i].lchild=tree[i].rchild=-1;
    }//接着处理其余结点
    CombineNode();
}
char ** encode()
{
    char **p,*temp;
    int i,j,start,c,f;
    temp=(char*)malloc(sizeof(char)*n);
    temp[n-1]='\0';
    p=(char**)malloc(sizeof(char*)*n);
    for(i=0;i         start=n-1;
        for(c=i,f=tree[i].parent;f!=-1;c=f,f=tree[f].parent)
            if(tree[f].lchild==c)   temp[--start]='0';
            else temp[--start]='1';
        p[i]=(char*)malloc((n-start)*sizeof(char));
        strcpy(p[i],&temp[start]);
    }
    free(temp);
    return p;
}


int main()
{
    int i;
    char **p;
    CreateTree();
    p=encode();
    printf("Finished processing.........................\n");
    for(i=0;i     {
        printf("%c's huffmancode is %s\n",tree[i].value,p[i]);
    }
    return 0;
}



你可能感兴趣的:(算法学习)