数据结构第六次上机试验——哈夫曼编码算法的实现

实验目的:

(1) 掌握二叉树的定义;

(2) 掌握哈夫曼树和哈夫曼编码算法的实现。     

实验内容:

实现一个哈夫曼编码系统,系统包括以下功能:

(1) 字符信息统计:读取待编码的源文件SourceFile.txt,统计出现的字符及其频率。

附:SourceFile.txt文件内容为

AAAAABBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCDDDDDDDDEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFGGGHHHHHHHHHHH

(2) 建立哈夫曼树:根据统计结果建立哈夫曼树。

(3) 建立哈夫曼码表:利用得到的哈夫曼树,将各字符对应的编码表保存在文件Code.txt中。

(4) 对源文件进行编码:根据哈夫曼码表,将SourceFile.txt中的字符转换成相应的编码文件ResultFile.txt。

实现提示:

(1) 字符信息统计:假设源文件SourceFile.txt中的字符只有大小写英文字母(同一个字母的大小写看作一个字符),则字符统计算法的实现过程可以归纳为:先定义一个含有26个元素的整形数组,用来存储各个字母出现的次数,最后还要排除其中出现次数为0的数组元素。

(2) 建立哈夫曼树:参考教材算法5.10,补充函数Select的实现。

(3) 建立哈夫曼码表:参考教材算法5.11,将编译表HC中的内容写到文件Code.txt中。

(4) 对源文件进行编码:依次读入文件SourceFile.txt中的字符 c,在编码表 HC 中找到此字符,将字符c转换为编码表中存放的编码串,写入编码文件ResultFile.txt中,直到所有的字符处理完毕为止。

#include
#include
#include
#include
#include
using namespace std;
typedef struct{
	int weight;
	int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode; 
int a[24+1],b[24+1];
char c[24+1];
void Select(HuffmanTree &HT,int n,int &s1,int &s2){
	for(int i=1;i<=n;i++)
		if(HT[i].parent==0&&s1==0) {s1=i;break;} 
	for(int i=1;i<=n;i++)	
		if(HT[i].parent==0&&HT[i].weight

输出结果:

字符对应的编码表保存在文件Code.txt,结果为:

A:0001
B:10
C:1110
D:1111
E:110
F:01
G:0000
H:001

 根据哈夫曼码表,将SourceFile.txt中的字符转换成相应的编码文件ResultFile.txt,结果为:

0001000100010001000110101010101010101010101010101010101010101010101010111011101110111011101110111011111111111111111111111111111111110110110110110110110110110110110110110110010101010101010101010101010101010101010101000000000000001001001001001001001001001001001

 

你可能感兴趣的:(算法,数据结构)