dic[j++]=PC; P=C; i++; } }
cout< cout<<\生成的词典为:【初始化的字典不输出】\ for(i=0;i cout< cout< int main() //主程序 { cout<<\输入待编码的字符串为:\ str=\例句1 //str=\例句2 //str=\例句3 cout< 2:解码程序 //程序包含的头文件以及头文件说明 #include #include Codenum[]={20,34,31,57,12,31,39,42,31,38,57,26,35,48,57,27,38,33,41,44,35,46,34,39,57,29,27,40,82,41,64,44,31,45,45,57,79,60,31,40,33,38,35,45,34,93,31,50,46,57,28,51,72,28,41,47,106,32,35,32,46,109,115,48,60,65,44,29,96,46,54,0};//例句1编码结果,人为在后面加了一个结束标记0 int Codeum[]={20,34,31,57,29,27,46,61,27,40,40,41,64,45,35,64,41,40,57,46,59,65,68,42,51,57,41,32,76,78,62,44,54,0};//例句2编码结果 int Cnum[]={27,28,58,60,59,28,0}; //例句3编码结果 string dic[200]; //这是定义字典存放空间,其容量大小可以自己更改 /********************************************************** 函数名称:void Dic_init(),字典初始化 函数功能:用a~z,A~Z以及一些标点符号,初始化字典 输入参数:void 返 回 值:void ***********************************************************/ void Dic_init() { int i,j; for(j=0,i=0;i<26;i++) { dic[j]='A'+i; j++; } for(j=26,i=0;i<26;i++) { dic[j]='a'+i; j++; } dic[52]=\ dic[53]=\ dic[54]=\ dic[55]=\ dic[56]=\} /********************************************************* 函数名称:De_code(int *code) 函数功能:对输入的编码数据进行LZW字典解码 输入参数:code待解码的数据 返 回 值:用Result输出译码出来的字符流 ********************************************************/ void De_code(int *code) { string Curr; char Cu[2]; Cu[1]='\\0'; string Pre; Dic_init(); //字典初始化 string Result; int i=1; int j=57; int k; cout<<\解码为:\ string Precode; while(1) { int flag=0; if(*code==0)break; //无码字要译,退出循环,结束 if(*code>0) //有码字要解,就先解码出来放在Result中,然后对进行判断: { if(*code>j)dic[j++]=Precode+Precode[0]; //这里提前构造发送端刚新建就发送过来的字典元素,针对例句3来做的。 Result=Result+dic[*code-1]; Curr=dic[*code-1]; Precode=dic[*code-1]; Cu[0]=Curr[0]; //取出当前接收到字符串的首字母给Cu来构造 code++; //指针后移 } else cout<<\解码出错\ for(k=0;k if(dic[k]==(Pre+Cu))flag=1;//如果在字典里面,就将标志位置1 } if(flag==0) { dic[j++]=Pre+Cu; Pre=Curr; } else Pre=Curr; } cout< cout<<\生成的词典为:【初始化的字典不输出】\ for(i=57;i cout< int main() //主程序 { } cout<<\输入待解码的编码为:\for(int i=0;Codenum[i]!=0;i++) cout< 方法二程序: (1)子函数: #ifndef DICTIONARY_H_INCLUDED #define DICTIONARY_H_INCLUDED void dictionary(SLNode *head,int x1,char c1[],int num) { char c3[5]; DataType C2; int i; int flag=1,flag1=0,flag2=0,k=1; SLNode *p; printf(\ printf(\ for(i=0;i c3[0]=c1[i]; c3[1]='\\0'; p=head; while(p->next!=NULL) { if(strcmp(c3,p->data.lable)) //c3与链表中的值不相等 { p=p->next; flag1=0; } else //c3与链表中的值相等 { c3[flag++]=c1[i+k]; k++; c3[flag]='\\0'; flag2=flag-1; flag1=1; printf(\ \ if(i+k>=x1) break; continue; } } if(flag1==0) //插入新元素 { strcpy(C2.lable,c3); C2.code=num++; ListInsert(head,ListLength(head),C2); flag=1; flag1=1; k=1; memset(c3,0,5); } } printf(\ p=head; printf(\ while(p->next!=NULL) { printf(\ %d -- 【%s】\\n\ p=p->next; } } #endif // DICTIONARY_H_INCLUDED (2)主函数: #include char lable[5]; int code; }DataType; #include \ #include \ int main() { SLNode *head,*head1; DataType C2; int x1,x2,num=0; char c1[]=\Lempel Ziv algorithm can compress the English text by about fifty five percent.\ char c2[]=\ char s1[]=\ ListInitiate(&head); x1=strlen(c1);