数据结构实验报告-文件压缩

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与程序设计实验实验报告

哈尔滨工程大学

实验报告四

一、问题描述

哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。

统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,

并将该哈夫曼树保存到文件HufTree.dat 中。

根据哈夫曼树(保存在HufTree.dat 中)对每个字符进行哈夫曼编码,并

将字符编码保存到HufCode.txt 文件中。

压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件Code。

解压:将Code 文件利用哈夫曼树译码解压,恢复为源文件。

二、数据结构设计

由于哈夫曼树中没有度为1的结点,则一棵树有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中,而且对每个结点而言,即需知双亲结点的信息,又需知孩子结点的信息,由此可采用如下数据结构。

1.使用结构体数组统计词频,并存储:

typedef struct Node{

int weight; //叶子结点的权值

char c; //叶子结点

int num; //叶子结点的二进制码的长度

}LeafNode[N];

2.使用结构体数组存储哈夫曼树:

typedef struct{

unsigned int weight;//权值

unsigned int parent, LChild, RChild;

}HTNode,Huffman[M+1]; //huffman树

3.使用字符指针数组存储哈夫曼编码表:

typedef char *HuffmanCode[2*M]; //haffman编码表

三、算法设计

1.读取文件,获得字符串

void read_ const *, char *ch){

FILE *in_file = Fopen(, "r");

unsigned int flag = fread(ch, sizeof(char), N, in_file);

if(flag == 0){

printf("%s读取失败\n", );

fflush(stdout);

}

printf("读入的字符串是: %s\n\n", ch);

Fclose(in_file);

int len = strlen(ch);

2.运行程序,读取文件

3.统计叶子节点的权值

4.根据权值生成哈夫曼树,保存至HufTree.dat,并用新的结构体数组读取哈夫曼树

5.HufTree.dat内容

6.根据哈夫曼树生成叶子节点的前缀码,保存至HufCode.txt,之后用新的结构体数组读取HufCode.txt

7.HufCode.txt内容

8.根据前缀码生成哈夫曼编码,保存至Code

9.Code内容

10.根据Code解压,获得原字符串,并保存至str2.txt 11.str2.txt内容

五、实验收获与思考

通过使用哈夫曼树实现文件压缩,使我充分理解哈夫曼树的构造方法以及实际应用,巩固了课堂知识,同时认识到自己的不足。在编程中发现问题,通过查询求助解决问题,使我不断地我加深数据结构的学习。

六、附录(原程序)

#include

#include

#include

#define N 100

#define M 2*N-1

typedef char *HuffmanCode[2*M];//haffman编码

typedef struct{

unsigned int weight;//权值

unsigned int parent, LChild, RChild;

}HTNode,Huffman[M+1];//huffman树

typedef struct Node{

int weight; //叶子结点的权值

char c; //叶子结点

int num; //叶子结点的二进制码的长度

}LeafNode[N];

相关文档
最新文档