C语言大作业(基于哈夫曼树的压缩程序)

2026/4/30 4:34:12

2009级《高级语言程序设计》大作业上机报告

题目:基于哈弗曼算法的压缩

参与人员:

【姓名】 【学号】

[问题定义] 压缩机解压的实现 [开发工具] DEV-C++ [数据结构] struct head {

unsigned char b; /*记录字符在数组中的位置*/ long count; /*字符出现频率(权值)*/ long parent,lch,rch; /*定义哈夫曼树指针变量*/ char bits[256]; /*定义存储哈夫曼编码的数组*/ }

header[512],tmp;

tmp 用于交换值

header[512] 用于储存数据

filename[255] 用于储存文件地址

[算法描述]

本程序是基于哈弗曼编码的程序

主要分为两个函数: 压缩函数 void compress() 解压函数 void uncompress() 主要流程如下

主函数 统计字符,得出统计出的字符 编码 解码 退出 根据权值进行建立哈夫曼树 输出编码 压缩编码 解压 输出哈夫曼树 生成文件 生成新的文件 [算法描述] main函数

入口 输入1 输入2 执行 执行 compress() uncompress() 结束

compress()函数

入口 输入文件地址 地址存在u 输入压缩后文件地址 打印错误 地址存在u 压缩(具体 见代码注 释)

打印压缩成 功 输出文件 打印错误

压缩算法 1打开文件

2逐个读取文件的ASCII码,储存在c,统计频率 fread(&c,1,1,ifp); header[c].count++;

3每个哈夫曼码值及其对应的ASCII码存放在一维数组header[i]中 if(header[i].count!=0) header[i].b=(unsigned char)i; 4据频率(权值)大小,对结点进行排序 5构建哈曼树,亚此选择权值最小的入树 6计算权值大小

7从文件开始将字符编码每8各编入一个字节,剩下超过4位再编入下一个, 少于4位,则放入新字节

uncompress()函数

入口 输入文件地址

地址存在u

输入压缩后文件地址 打印错误

地址存在u

解压(具体打印错误 见程序注 释)

输入解压成 功

解压算法

1读取原文件长度,对文件进行定位 fread(&flength,sizeof(long),1,ifp); 2取原文件字符的权值 p=(long)c;

3将 f转换为二进制表示的字符串 itoa(f,buf,2);

4据哈夫曼编码的长短,对结点进行排序 5根据哈夫曼编码的长短,对结点进行排序

6通过哈夫曼编码的长短,依次解码,从原来的位存储还原到字节存储 7在单字节内对相应位置补0

8从压缩文件中的按位存储还原到按字节存储字符; 字符位置不改变


C语言大作业(基于哈夫曼树的压缩程序).doc 将本文的Word文档下载到电脑
搜索更多关于: C语言大作业(基于哈夫曼树的压缩程序) 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219