数据结构文件压缩

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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...");

//处理各个字符的频率,并输出原始文件长度

相关文档
最新文档