//输出序列使用的是字符串
//仅供参考
//LZ编码结点
class LZP;
//LZ编码器//对霍夫曼编码具有依赖性
class LZCODE;
//LZ译码器
class LZDECODE;
class LZP {//加一个前置索引则可以将译码器优化
public:
int num;//信源符号
int lastposit;//前一个位置
int posit;//当前位置
int pnum;//尾巴个数
LZP** p;//尾巴指针
LZP() :num(0), posit(0), pnum(0), p(NULL), lastposit(0) {};
~LZP() {
for (; pnum > 0; pnum--)
{
if (p[pnum - 1])
delete p[pnum - 1];
}
if(p)
free(p);
}
};
class LZCODE
{
LZP* root;//lz编码表表根
int* list;//符号编码表,坐标表示当前编号
int xnum;//信源符号个数
int** file;//被发送的信息,坐标表示当前段号,0表示前一段号,1表示末尾字符编号//处理后发送
int ynum;//段数
//查找是否有这样的信源符号串//信源符号数组,数组长度
LZP* findp1(int* numlist,int length) {
if (numlist == NULL)
return NULL;
if (length < 1 )
return NULL;
LZP* q = root;
for (int i = 0; i < length;i++)
{
q=findp2(q, numlist[i]);
if (q == NULL)
return NULL;
}
return q;
}
//查找某LZ结点后方是否存在某信源符号,并返回该符号所在指针//某节点地址,某信源符号
LZP* findp2(LZP* last,int num) {
int i = 0;
for (i = 0; i < last->pnum; i++)
{
if (last->p[i])
if (last->p[i]->num == num)
return last->p[i];
}
return NULL;
}
//在某节点后增加一个符号为num,上一位置为lastposit,当前位置为posit的节点
void newp(LZP *p,int num,int lastposit,int posit) {
p->pnum++;
p->p = (LZP**)realloc(p->p, p->pnum * sizeof(LZP*));
p->p[p->p