"iloveyou“ 霍夫曼编码

本文介绍了一种使用C语言实现霍夫曼编码的方法,详细展示了霍夫曼树的构建过程及编码、译码的实现细节。

以前做的数据结构上机实验

 

#include "stdio.h"
#include "stdlib.h"
#include "string.h"


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


void Select (HuffmanTree &HT, int n, int &S1, int &S2)
{
    int i,j;
    int temp=1000;
    for (i=1;i<=n;++i)
    {
        if(HT[i].parent==0 && temp>=HT[i].weight )
        {
              
               temp=HT[i].weight;
               j=i;
        }
    }
    S1=j;
    temp=1000;
    for (i=1;i<=n;++i)
    {
        if(HT[i].parent==0 && i!=S1 && temp>=HT[i].weight )
        {
           
            temp=HT[i].weight;
            j=i;
        }
    }
    S2=j;
}


void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int w[],int n)
{
    int i,S1,S2,c,m,f,start;
   
    char *cd;
   
    if(n<=1) return;
    m=2*(n-1)-1;
    HT=new HTNode[m+1];
   
    for(i=1; i<n;++i)
    {
        HT[i].weight=w[i];
        HT[i].parent=0;
        HT[i].lchild=0;
        HT[i].rchild=0;
    }
    for(;i<=m;++i)
    {
        HT[i].weight=0;
        HT[i].parent=0;
        HT[i].lchild=0;
        HT[i].rchild=0;
    }
   
    for(i=n;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;
    }
   
    HC=new char*[n];
    cd=new char[n-1];
    cd[n-2]='/0';
   
    for(i=1;i<n;++i)
    {
        start=n-2;
        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]=new char[n-start];
           
            strcpy(HC[i],&cd[start]);
    }
        delete cd;
}  


void HuffmanTran (HuffmanTree HT, char string[], int n)
{
    int i,j;
    char c='1';
     i=2*(n-1)-1;
     j=i;
     printf("输入huffman码(以*结束:)/n");
   
   
    c=getchar();
    while (c!='*')
    {
       
        while(1)
        {  
            switch (c)
            {
                case '0': j=i; i=HT[i].lchild;  break;
                case '1': i=HT[i].rchild;  break;
               
            }
            c=getchar();
            if(i<=8)   /*条件善待改进, 在本实验中 存储数组位置<8的节点均为叶子节点*/
            break;
           
        }
        printf("%c",string[i]);
        i=2*(n-1)-1;
    }
}

main()
{
    HuffmanTree HT;
    HuffmanCode HC;
    int w[9]={0,5,29,7,8,14,23,3,11};
    char string[9]={'*','o','m','i','v','l','e','y','u'};
    int n=9;
    int i;
    HuffmanCoding(HT,HC,w,n);
    printf("各字符出现的概率 对应的huffman码:/n");
    for(i=1;i<=8;++i)
        printf("%c::%d::%s/n",string[i],w[i],HC[i]);
       
   
    printf("选择操作:/n1.Huffman编码./n2.huffman译码./n");
   
    switch(char c=getchar())
    {
        case '1':
            {
                printf("输入待编码字符串(以*结束):/n");
                char s;
                s=getchar();
            while(s!='*')
            {
                switch (s)
                {
                    case 'o': printf("%s",HC[1]);break;
                    case 'm': printf("%s",HC[2]);break;
                    case 'i': printf("%s",HC[3]);break;
                    case 'v': printf("%s",HC[4]);break;
                    case 'l': printf("%s",HC[5]);break;
                    case 'e': printf("%s",HC[6]);break;
                    case 'y': printf("%s",HC[7]);break;
                    case 'u': printf("%s",HC[8]);break;
                }
                s=getchar();
            }
            break;   
            }  
                case '2': HuffmanTran(HT,string,n);break;
    }
    system("pause");
}  
   
       
       
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值