赫夫曼编码实现包括以下几个功能:
(1) 初始化。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree.txt中。
(2) 编码。利用已建好的哈夫曼树,对文件ToBeTra.txt中的正文进行编码,然后将结果存入文件CodeFil.txt中。
(3) 译码。利用已建好的哈夫曼树将文件CodeFile.txt中的代码进行译码,结果存入文件Textfile.txt中。
(4) 印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint.txt 中。
头文件:包括声明与实现
#ifndef HUFFMANTREE_H
#define HUFFMANTREE_H
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
typedef struct
{//顺序结构存储树
char ch; // 数据域,字符
int weight; //权重
int parent; //父节点下标
int left; //左儿子节点下标
int right; //右儿子节点下标
}HTNode, *HuffmanTree;
typedef struct
{
char ch;
string code;
}HuffmanList, *HuffmanCode;
HuffmanTree HT; //存储节点的数组
HuffmanCode HC; //存储字符以及对应的赫夫曼码值
static void Select(int length, int & s1, int & s2)
{
s1 = 0;
s2 = 0;
for (int i = 1; i <= length; i++){
if (HT[i].weight < HT[s1].weight && HT[i].parent == 0){
s1 = i;
}
else if (HT[i].weight < HT[s2].weight && HT[i].parent == 0){
s2 = i;
}
}
}
static void Search(int index, string s, int flag) //可能会栈溢出? ,第一次输入的index一定要是权值最大的根下标
{//1表示左,2表示右
if (flag == 1){//采用递归实现编码,通过路径指示对应叶子节点的编码值
s.append(1, '1');
}
else if (flag == 2){
s.