}codetype;
codetype code[n];
codetype cd;
2. 图例描述:假设a出现32次,b出现12次
s[0] bits start 0 weight[0] 32 s[1] weight[1] 12 code[0] \\ \\ 0 ... code[1] \\ \\ s[65] ch l r p ............ 32 s[66] tree[0] 65 ......... 12 s[67] tree[1] 66 ........ code[65] 0 0 ... code[66] 1 .........
(5)主要算法描述:while(文件没有处理完) /*******zip the code*****/ {for(t=code[ch].start;t ch=fgetc(fp); } while(Weight)(当文件没有处理完)/****unzip the code******/ {if(k==0) ch1=ch&128; if(k==1) ch1=ch&64; if(k==2) ch1=ch&32; if(k==3) ch1=ch&16; if(k==4) ch1=ch&8; if(k==5) ch1=ch&4; if(k==6) ch1=ch&2; if(k==7) ch1=ch&1; if(ch1==0) /***********decode********/ i=tree[i].lchild-1; else i=tree[i].rchild-1; if(tree[i].lchild==0) {fputc(tree[i].ch,fp1); i=2*NUM-2; Weight--; } k++; if(k==8&&Weight) {k=0; ch=fgetc(fp); } } (6)测试数据及结果: 运行程序,首先出现菜单。 若输入E,进入压缩界面。按要求输入需要压缩 的文件名,(包括扩展名)。倘若输入错误,提示出错并退出主菜单。压缩的目标文件为:原文件名.cod。 若输入D,进入解压界面。按要求输入压缩了的文件名(扩 展名必须为cod,否则报错并退出主菜单)。再按要求输入解压的目标文件名,若出错,可以报错。 若输入L,按需要,输入要显示的文件名。若出错,报错。 即可把文件显示出来。 若输入Q,退出程序。 若输入其他字符,提示输入错误,要求重新输入。 (7)程序特点:1.有较好的容错能力,无论怎样输入,基本上能安全退出。 2.写入压缩文件的树,只包含出现过的字符.使得树的大小大大减 少. 3.把weight独立出另外一个数组处理,不写入tree中,有助于减 少压缩目标文件的大小. 4.用与或运算把编码转化成位的形式. (8)小结:本程序能够压缩ASCII码在128以内的字符组成的程序.压缩效率 较高,解压正确,而且容错能力较好。需要改进的地方是:可以把压缩范围增大,使之更具有使用价值。

