哈夫曼树、哈夫曼编码与译码实现(c语言)

源于一次实验课,要求实现哈夫曼树、哈夫曼编码与译码;我就直接贴实验要求和代码实现了。
注:因为当时时间有限,故其实该代码还有优化空间,且输出文件是0/1字符串文本(UTF-8)并不是ASCII码编码文件,计算压缩率除以8即可。

实验项目:哈夫曼编码与译码方法

哈夫曼编码是一种以哈夫曼树(最优二叉树,带权路径长度最小的二叉
树)为基础的基于统计学的变长编码方式。其基本思想是:将使用次数多的代
码转换成长度较短的编码,而使用次数少的采用较长的编码,并且保持编码的
唯一可解性。在计算机信息处理中,经常应用于数据压缩。是一种一致性编码
法(又称"熵编码法"),用于数据的无损耗压缩。本实验要求利用贪心算法实
现一个完整的哈夫曼编码与译码系统。

实验内容和实验要求:

  1. 从文件中读入任意一篇英文文本文件,分别统计英文文本文件中各字符(包
    括标点符号和空格)的使用频率;
  2. 根据已统计的字符使用频率构造哈夫曼编码树,并给出每个字符的哈夫曼编
    码(字符集的哈夫曼编码表);
  3. 将文本文件利用哈夫曼树进行编码,存储成压缩文件(哈夫曼编码文件);
  4. 计算哈夫曼编码文件的压缩率;
  5. 将哈夫曼编码文件译码为文本文件,并与原文件进行比较。
    C代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define n 65

//哈夫曼树节点存储结构
typedef struct{
   
   
    char data;
    int weight;
    int lchild;
    int rchild;
    int parent;
}Htnode;

typedef Htnode HuffmanT[129];

//哈夫曼编码表的存储结构
typedef struct{
   
   
    char ch;        //储存被编码的字符
    char bits[n+1]; //字符编码位串
}CodeNode;

typedef CodeNode HuffmanCode[n];


//0-9为数字;10-35为小写字母;36-61为大写字母;62-64为特殊字符
void InitHT(HuffmanT T)   //初始化
{
   
   
    char sz = '0';
    char xzm = 'a';
    char dzm = 'A';
    char kong = ' ';
    char dh = ',';
    char jh = '.';

    for(int i=0; i<n; i++)        
    {
   
   
        T[i].lchild = T[i].rchild = T[i].parent = -1;
        T[i].weight = 0;
        if(i>=0&&i<=9)
        {
   
   
            T[i].data = sz;
            sz++;
        }
        if(i>=10&&i<=35)
        {
   
   
            T[i].data = xzm;
            xzm++;
        }
        if(i>=36&&i<=61)
        {
   
   
            T[i].data = dzm;
            dzm++;
        }
        if(i>=62&&i<=64)
        {
   
   
            T[62].data = kong;
            T[63].data  = dh;
            T[64].data= jh;
        }
    }

    for(int j = n; j<2*n-1; j++)
    {
   
   
        T[j].weight = 0;
        T[j]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值