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从压缩文件中的按位存储还原到按字节存储字符; 字符位置不改变

