#include<stdio.h>
#define N 128
#define M 64
#define P 128
//记录初始字符个数
int init_num;
int codenumber;
int IsExist(char buf[M], char code[N][M] , bool end)
{
int i, j;
for(i = 0; i < init_num; i++)
{
for(j = 0; buf[j] == code[i][j]; j++)
{
if(buf[j] == '\0')
{
//表示存在
if(end == false)
{
return 0;
}
}
}
}
for(i = 0; i < init_num; i++)
{
for(j = 0; buf[j] == code[i][j]; j++)
{
if(buf[j+2] == '\0')
{
if(code[i][j+1] == '\0')
{
return i+1;
}
}
}
}
return -1;
}
//将新字符串加入字典
void AddToDic(char buf[M], char code[N][M])
{
int i;
for(i = 0; buf[i] != '\0'; i++)
{
code[init_num][i] = buf[i];
}
code[init_num][i] = '\0';
init_num++;
buf[0] = buf[i-1];
buf[1] = '\0';
}
//进行LZW编码
void LZW(char letters[P], char code[N][M], int number[N])
{
int i, j;
bool end =false;
int exist;
char buf[M];
buf[0] = letters[0];
buf[1] = '\0';
for(i = 1; letters[i-1] != '\0'; i++)
{
for(j = 0; buf[j] != '\0'; j++)
{
}
buf[j] = letters[i];
buf[j+1] = '\0';
if(letters[i] == '\0')
{
end = true;
}
//判断取出字符在字典中是否存在
exist = IsExist(buf, code, end);
printf("%d",exist);
if(exist > 0)
{
number[codenumber] = exist;
codenumber++;
AddToDic(buf, code);
}
else if(exist == -1)
{
printf("出错了");
}
}
}
void main()
{
char letters[P];
int i;
//用于记录编码结果
int number[N];
//用于记录编码字符串
char code[N][M];
printf("请输入字典初始字符个数:");
scanf("%d",&init_num);
for(i = 0; i < init_num; i++)
{
printf("请输入第%d个字符:", i);
scanf("%s", &code[i]);
}
printf("请输入待编码的字符串:\n");
scanf("%s", &letters);
codenumber = 0;
LZW(letters, code, number);
printf("\n");
for(i = 0; i < codenumber; i++)
{
printf("%d",number[i]);
}
/*
for(i = 0; i <init_num; i++)
{
printf("\n%s",code[i]);
}*/
}