数据结构文件压缩
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
实验名称:文件压缩
实验类型:综合性试验
班级:20112111
学号:2011211107
姓名:冯若航
实验日期:2003.6.19 下午4:00
1.问题描述
文件压缩
①基本要求
哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。
●统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,
并将该哈夫曼树保存到文件HufTree.dat中。
●根据哈夫曼树(保存在HufTree.dat中)对每个字符进行哈夫曼编码,并
将字符编码保存到HufCode.txt文件中。
●压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。
●解压:将CodeFile.dat文件利用哈夫曼树译码解压,恢复为源文件。
2.数据结构设计
此类问题,应设计文件的数据结构。
* 4 压缩头标记
* 1 文件名长度
* ns 文件名
* 4 源文件长度
* 1020 huffman树
* 1021~EOF 文件内容
赫夫曼树节点的数据结构
typedef struct node
{
long w; //权
short p,l,r; //父亲,左孩子,右孩子
}HTNODE,*HTNP; //霍夫曼树的结点
赫夫曼编码数组元素的数据结构设计
typedef struct huffman_code
{
BYTE len; //长度
BYTE *codestr; //字符串
}HFCODE; //霍夫曼编码数组元素
3.算法设计
源代码
#define_CRT_SECURE_NO_DEPRECATE
#include
#include
#include
typedef unsigned int UINT;
typedef unsigned char BYTE;
typedef struct node
{
long w; //权
short p,l,r; //父亲,左孩子,右孩子
}HTNODE,*HTNP; //霍夫曼树的结点
typedef struct huffman_code
{
BYTE len; //长度
BYTE *codestr; //字符串
}HFCODE; //霍夫曼编码数组元素
#define OK 1
#define ERROR -1
#define UNUSE -1 //未链接节点标志
#define CHAR_BITS 8 //一个字符中的位数
#define INT_BITS 32 //一个整型中的位数
#define HUFCODE_SIZE 256 //霍夫曼编码个数
#define BUFFERSIZE 256 //缓冲区大小大小
#define UINTSIZE sizeof(UINT)
#define BYTESIZE sizeof(BYTE)
#define TAG_ZIGHEAD 0xFFFFFFFF //压缩文件头标
#define MAX_FILENAME512
//函数声明
//压缩模块
int Compress(char *SourceFilename,char *DestinationFilename);
//压缩调用
int Initializing(char *SourceFilename,FILE **inp,char *DestinationFilename,FILE **outp); //初始化文件工作环境
long AnalysisFiles(FILE *in,long frequency[]);
//计算每个不同字节的频率以及所有的字节数
int CreateHuffmanTree(long w[],int n,HTNODE ht[]);
//生成霍夫曼树
int HuffmanTreeCoding(HTNP htp,int n,HFCODE hc[]);
//霍夫曼编码
int Search(HTNP ht,int n);
//查找当前最小权值的霍夫曼树节点并置为占用
BYTE Char2Bit(const BYTE chars[CHAR_BITS]);
//将一个字符数组转换成二进制数字
int Search(HTNP ht,int n);
//查找当前最小权值的霍夫曼树节点并置为占用
int WriteZipFiles(FILE *in,FILE *out,HTNP ht,HFCODE hc[],char* SourceFilename,long source_filesize);//写压缩文件
//解压缩模块
int DeCompress(char *SourceFilename,char *DestinationFilename);
//解压缩调用
int Initializing_Dezip(char *SourceFilename,FILE **inp,char
*DestinationFilename,FILE **outp); //为处理解压缩流程初始化文件
void ReadHuffmanTree(FILE* in,short mini_ht[][2]);
//从待解压缩文件中读取huffman树
int WriteDeZipFiles(FILE *in,FILE* out,short mini_ht[][2],long bits_pos,long
Dst_Filesize); //写解压缩文件
void ErrorReport(int error_code);
//报错
//函数定义
//函数实现
//压缩
int Compress(char *SourceFilename,char *DestinationFilename)
{
FILE *in,*out; //输入输出流
int i; //计数变量
float Compress_rate; //存放压缩率
HFCODE hc[HUFCODE_SIZE]; //存放256个字符的huffman编码
HTNODE ht[HUFCODE_SIZE*2-1]; //256个字符的huffman树需要2*256-1=511个节点。
long frequency[HUFCODE_SIZE],source_filesize,Dst_Filesize=0;//字符频率数组,源文件,目标文件。
//处理待压缩与压缩文件文件
Initializing(SourceFilename,&in,DestinationFilename,&out);
puts("Loading Files...");
//处理各个字符的频率,并输出原始文件长度