//可以使用向量优化代码中的realloc语句和malloc语句
//曾用于课程设计,略显稚气
//霍夫曼树结点
class HFMP;
//霍夫曼编码器
class HFMCODE;
//霍夫曼译码器
class HFMDECODE;
class HFMP {
public:
int num;//信源符号(数字)
int count;//出现次数
double p;//概率
bool tag;//标签,默认为true,用于霍夫曼树中辨别是否为原概率
string s;//霍夫曼码
HFMP* b[2];
HFMP():num(0),count(0),p(0.0),tag(true){
s = "";
b[0] = NULL;
b[1] = NULL;
}
~HFMP() {
if (b[0])
delete b[0];
if (b[1])
delete b[1];
if (this == NULL)
return;
}
};
class HFMCODE {
friend LZCODE;
HFMP *root;//概率分布
HFMP *code;//霍夫曼树
HFMP* temp;//临时存储点
int count;//符号出现总次数
int pnum;//符号个数
int codelength;//输出序列长度
void init() {///初始化
delete code;
delete root;
delete temp;
temp = NULL;
code = NULL;
root = new HFMP;//
root->num = 0;
pnum = 1;
count = 0;
}
//计数
void fcount(int* data)
{
cout << "正在统计数据" << endl;
cout <<"共计信源符号个数:"<< count << endl;
int i = 0;
for (i = 0; i < count; i++)
{
HFMP* q = findp(data[i], root);
if (q)
q->count++;
else
{
newp(data[i], root);
pnum++;
}
}
}
HFMP* findp(int data,HFMP *p) {
if (p->num == data&&p->tag)
return p;
if (p->b[0] != NULL)
{
HFMP* q = findp(data, p->b[0]);
if (q != NULL)
return q;
}
if (p->b[1] != NULL)
return findp(data, p->b[1]);
return NULL;
}
void newp(int data, HFMP* p)
{
if (data < p->num && p->b[0])
newp(data, p->b[0]);
if (data > p->num && p->b[1])
newp(data, p->b[1]);
if (data < p->num && p->b[0] == NULL)
{
p->b[0] = new HFMP;
p->b[0]->num = data;
p->b[0]->count++;
}
if (data > p->num && p->b[1]==NULL)
{
p->b[1] = new HFMP;
p->b[1]->num = data;
p->b[1]->count++;
}
if (p->num == data)
cout << "霍夫曼概率计数发生错误!" << endl;
}
//概率分布排序
void sort2(HFMP *p)//不能优化为双链表,与析构函数冲突//整理到temp