用类与对象C++编程
分为头文件Huffman.h
和主函数main.cpp两部分
(功能陆续添加)
类的声明:
class Huffman
{
private:
HNode*HTree;//哈夫曼树节点
HCode*HCodeTable;//存储编码表
int N;//叶子节点数量
void code(int i, string newcode);//递归函数,对第i个节点编码
public:
Huffman() {
HTree = new HNode; HCodeTable = new HCode; N = 0;
};
void CreateHTree(int a[], int n, char name[]);//构建哈夫曼树
void CreateCodeTable();//创建编码表
void Encode(string s, char *d);//编码
void Decode(char *s, char *d);//解码
~Huffman();//析构函数
void SelectMin(int &x, int &y, int a, int b);//辅助搜索最小值函数
void Printeach(int retime);//打印每一个字母对应的编码
};//类的定义
两种结点的定义:
树中结点和编码中的结点:
struct HNode
{
int weight;//结点权值
int parent;//双亲数组下标
int LChild;//左孩子数组下标
int RChild;//右孩子数组下标
};//每个结点的结构体
struct HCode
{
char data;//存储节点的内存
string code;//存储结点对应的编码
};//记录每个节点的编码
具体代码如下:
Huffman.h
#include#include using namespace std; #define manum 0x3f3f3f3f struct HNode { int weight;//结点权值 int parent;//双亲数组下标 int LChild;//左孩子数组下标 int RChild;//右孩子数组下标 };//每个结点的结构体 struct HCode { char data;//存储节点的内存 string code;//存储结点对应的编码 };//记录每个节点的编码 class Huffman { private: HNode*HTree;//哈夫曼树节点 HCode*HCodeTable;//存储编码表 int N;//叶子节点数量 void code(int i, string newcode);//递归函数,对第i个节点编码 public: Huffman() { HTree = new HNode; HCodeTable = new HCode; N = 0; }; void CreateHTree(int a[], int n, char name[]);//构建哈夫曼树 void CreateCodeTable();//创建编码表 void Encode(string s, char *d,int &contro);//编码 void Decode(char *s, char *d);//解码 ~Huffman();//析构函数 void SelectMin(int &x, int &y, int a, int b);//辅助搜索最小值函数 void Printeach(int retime);//打印每一个字母对应的编码 };//类的定义 //辅助函数,搜索数列中最小的两个结点值 void Huffman::SelectMin(int &x, int &y, int a, int b) { //cout << a << " " << b << endl; //cout << HTree[b - 1].weight << endl; int m = manum, n = manum;//最小的两个数 for (int i = a; i < b; i++) { if (HTree[i].weight < m) { m = HTree[i].weight; x = i; } } for (int i = a; i < b; i++) { if (HTree[i].weight < n&&HTree[i].weight != HTree[x].weight) { n = HTree[i].weight; y = i; } } } //构造哈夫曼树 //a[]存储每种字符的权值,n为字符的种类,name为各个字符的内容 void Huffman::CreateHTree(int a[], int n, char name[]) { N = n; HCodeTable = new HCode[N]; HTree = new HNode[2 * N - 1];//2*n-1为总结点个数 for (int i = 0; i < N; i++) { HTree[i].weight = a[i]; HTree[i].LChild = HTree[i].RChild = HTree[i].parent = -1; HCodeTable[i].data = name[i]; } int x, y; for (int i = n; i < 2 * N - 1; i++)//开始构建哈夫曼树 { SelectMin(x, y, 0, i);//从1~i中选出两个权值最小的结点 //cout << "x=" << x <<" "<


