用哈夫曼编码实现文件压缩实验报告
一、实验目的
1、了解文件的概念。
2、掌握线性链表的插入、删除等算法。
3、掌握Huffman树的概念及构造方法。
4、掌握二叉树的存储结构及遍历算法。
5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。
二、实验环境
微型计算机、Windows系列操作系统 、Visual C++6.0软件等。
三、实验内容
根据ASCII码文件中各ASCII字符出现的频率情况创建Huffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。
四、实验结果及分析
1.概要设计
(1)构造哈夫曼树的哈夫曼算法
构造哈夫曼树步骤:
a.根据给定的n个权值{w1,w2……wn},构造n棵树只有根结点的二叉树,起权值为wj。
b.在森林中选取两棵根结点权值最小和次小的树作为左右子树,构造一棵新的二叉树,置新的二叉树根结点权值为其左右子树根结点权值之和。
c.在森林中删除这两棵树,同时将新得到的二叉树加入森林中。
d.重复上述两步,直到只含一棵树为止,这棵树即为哈夫曼树。
算法结构如图:
(2)哈夫曼编码:数据通信用的二进制编码
思想:根据字符出现的频率编码,使电文总长最短
编码:根据字符出现的频率构造哈夫曼树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。
(3)文本编码
读取存放在文本中的字母,一对一的进行编译,将对应的编码存放在另一个文本中。
2.详细设计
(1)压缩过程图解
(2)详细代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
/*哈夫曼树结构定义*/
struct head
{
unsigned char b; /*定义一个字符*/
long count; /*频率数据*/
long parent,lch,rch; /*创建哈夫曼树*/
char bits[256]; /*哈夫曼结点*/
}header[512],tmp;
/*压缩文件*/
void yasuo()
{
char filename[255],outputfile[255],buf[512];
unsigned char c;
char wenjia