huffman

 

#include <stdio.h>
#include <string.h>
#define n 5
#define m (2*n-1)
typedef struct{
    int weight;
    int lchild,rchild,parent;
}HTNode;
typedef HTNode HuffmanTree[m];

void InitHuffmanTree(HuffmanTree ht){
    for(int i=0;i<m;++i){
        ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
    }
    printf("init done\n");
}

void InputWeight(HuffmanTree ht){
    for(int i=0;i<n;++i){
        scanf("%d",&ht[i].weight);
    }
    printf("input done\n");
}


void CreateHT(HuffmanTree ht){
    InitHuffmanTree(ht);
    InputWeight(ht);
    int min1,min2,lnode,rnode,k;
    for(int i=n;i<m;++i){
        min1=min2=32767;
        lnode=rnode=-1;
        for(k=0;k<i-1;++k){
            if(ht[k].parent==-1){
                if(ht[k].parent==-1){
                    if(ht[k].weight<min1){
                        min2=min1;
                        rnode=lnode;
                        min1=ht[k].weight;
                        lnode=k;
                    }
                    else if(ht[k].weight<min2){
                        min2=ht[k].weight;
                        rnode=k;
                    }
                }
            }
        }
        ht[lnode].parent=i;
        ht[rnode].parent=i;
        ht[i].lchild=lnode;
        ht[i].rchild=rnode;
        ht[i].weight=ht[lnode].weight+ht[rnode].weight;
    }
}

typedef struct {
    char ch;
    char bits[n+1];
}CodeNode;
typedef CodeNode HuffmanCode[n]; 
void CharSetHuffmanEncoding(HuffmanTree T,HuffmanCode H)
{
    int c,p,i;
    char cd[n+1]; 
    int start; 
    cd[n]='\0'; 
    for(i=0;i<n;++i){
        H[i].ch=getchar();
        start=n;
        c=i; 
        while((p=T[c].parent)>=0){
            cd[--start]=(T[p].lchild==c)?'0':'1';
            c=p; //继续上溯
        }
        strcpy(H[i].bits,&cd[start]);
    }
}

posted on 2013-07-27 21:54  一羽赐命  阅读(306)  评论(0编辑  收藏  举报