• 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
    ");
    }
    
    void InputWeight(HuffmanTree ht){
        for(int i=0;i<n;++i){
            scanf("%d",&ht[i].weight);
        }
        printf("input done
    ");
    }
    
    
    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]=''; 
        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]);
        }
    }
  • 相关阅读:
    poj 3411 Paid Roads
    uva 111 A History Grading
    hdu 4248 A Famous Stone Collector
    阶乘模版
    uva Coin Change
    POJ图论分类
    求 组合数 dp
    判断点是否在三角形中(三角形的有向积计算)
    扩展欧几里德
    UVA 116 Unidirectional TSP (白书dp)
  • 原文地址:https://www.cnblogs.com/wocaca/p/3220360.html
Copyright © 2020-2023  润新知