Huffman类声明与实现:
Huffman.h
#ifndef HUFFMAN_H
#define HUFFMAN_H
#include<vector>
#include<string>
#include<sstream>
struct Huffman_Node;
class Huffman;
struct Huffman_Node
{
Huffman_Node() = default;
Huffman_Node(int w, char W, Huffman_Node *D, Huffman_Node *L,Huffman_Node *R,bool use = false)
{
weight = w;
Word = W;
Parent = D;
Left = L;
Right = R;
Used = use;
};
~Huffman_Node() { };
int weight;//权值,字符,父节点指针,左右孩子指针。
char Word;
Huffman_Node *Parent;
Huffman_Node *Left;
Huffman_Node *Right;
bool Used;
};
class Huffman
{
public:
Huffman() = default;
Huffman(std::ifstream &In);//构造霍夫曼树。
~Huffman() { };
void Codeing();//编码。
void Translating();//解码。
void PrintCode();//在显示器上打印编码并格式化的写入文件。
void PrintTree();//打印构建好的霍夫曼树。
private:
std::vector<Huffman_Node*> Huf;//储存霍夫曼树节点。
Huffman_Node *root;
void print(Huffman_Node* p, std::string s,std::ofstream &Write);//打印霍夫曼树。
};
#endif // !HUFFMAN_H
Huffman.c
#include"Huffman.h"
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<fstream>
#include<sstream>
#include<iostream>
#include<stdlib.h>
bool Less(int &a, int &b);//用于对vector排序的可调用函数。
bool Less(int &a, int &b)//小于。
{
return (a < b) ? true : false;
}
Huffman::Huffman(std::ifstream &In)//构造函数,初始化数据并构建霍夫曼树。
{
if (!In.is_open())
{
std::cerr << "无法打开文件!" << std::endl;
return;
}
while (!In.eof())
{
std::string Line;
std::getline(In, Line);//从文件中取得一行。
if (Line.empty())
continue;
std::string Word;//文件中的字符。
std::string Weight;//文件中对应该字符的权值。
std::istringstream Input(Line);//string流,分离数据。
Input >> Word;//先提取字符,再提取权值。
Input >> Weight;
auto T_n = [](std::string s)->int {return atoi(s.c_str()); };//Lambad,得到int型权值。
auto T_c = [](std::string ss)->char {return ss[0]; };//Lambad,从string转化为char。
Huffman_Node *Node = new Huffman_Node(T_n(Weight), T_c(Word), NULL, NULL, NULL);
Huf.push_back(Node);//储存。
}
In.close();//文件读取结束,关闭!
//构建霍夫曼树。
std::vector<int> WeightOfHuf;//获取霍夫曼树节点的权值。
for (auto X : Huf)
WeightOfHuf.push_back(X->weight);
std::sort(WeightOfHuf.begin(), WeightOfHuf.end(), Less);//调用标准库函数,对权值容器内容排序。
while (WeightOfHuf.size() != 1)
{
Huffman_Node *Deal_1 = NULL, *Deal_2 = NULL;//用来处理各个节点。
for (auto Find_1 : Huf)//找到第一个