懂LZW算法的大神进来帮忙调试下吧。。小弟快崩溃了。。。
先不说程序的效率问题,我觉得我的算法还是有问题,还有就是对图片无法压缩解压。求各位大神了。。。
#define DIC_SIZE 65536 //2的16次方 #define TRUE 1#define FALSE 0#define END NULL#define HEAD_END NULL#include <stdio.h>#include <string.h>#include <stdlib.h>typedef unsigned short int UNIT;typedef struct dictionary{ char *character; UNIT code;}DIC;DIC de_dic[DIC_SIZE]; DIC en_dic[DIC_SIZE];int count=0;//int codeNum=0;//int findDicFrom=0;DIC *isFindDic(char *buffer);DIC *findInDic(char *prefix);char *toString(char c);char *en_isFindDic(UNIT preCode);void initDic(char *inFileName){ FILE *inFile; char *buffer=(char *)malloc(sizeof(char)*2); int i=0; if(!(inFile=fopen(inFileName,"r"))){ printf("源文件打开失败!\n"); return; } en_dic[0].character=END; while(fgets(buffer,2,inFile)){ if(!isFindDic(buffer)){ en_dic[i].character=(char *)malloc(sizeof(char)*2);//如何释放 strcpy(en_dic[i].character,buffer); en_dic[i].code=i; i++; count++; } } en_dic[i+1].character=END;}/*头字节写入函数*/void headBytes(FILE *outFile){ int i; DIC headEnd; FILE *fp; for(i=0;i<count;i++) fwrite(&en_dic[i],sizeof(DIC),1,outFile); //en_dic[i+1].character=END; headEnd.character=HEAD_END; //count++; fwrite(&headEnd,sizeof(DIC),1,outFile); }//压缩函数void compression(char inFileName[20],char outFileName[20]){ //char *prefix,*suffix; FILE *inFile,*outFile,*fp; char *buffer; //用realloc来分配空间 int i; char *prefix,*suffix; //int cIsInDic=TRUE; DIC *curBuffer; int buffSize,charSize; int s; char code[10]; if(!(inFile=fopen(inFileName,"rb"))){ printf("源文件打开失败!\n"); return ; } if(!(outFile=fopen(outFileName,"wb"))){ printf("目标文件建立失败!\n"); return ; } headBytes(outFile); //首先写入头字节 buffer=(char *)malloc(1000); prefix=(char *)malloc(1000); suffix=(char *)malloc(1000); fgets(prefix,2,inFile); fgets(suffix,2,inFile); while(!feof(inFile)) { strcpy(buffer,prefix); strcat(buffer,suffix); if(curBuffer=isFindDic(buffer)){ //itoa(curBuffer->code,code,10); //fputs(code,outFile); //printf("%s",code); //验证 strcpy(prefix,buffer); if(fgets(suffix,2,inFile)==NULL){ curBuffer=findInDic(prefix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); break; } } else{ buffSize=(strlen(buffer)+1)*4; en_dic[count].character=(char *)malloc(charSize=sizeof(char)*1000); //realloc s=sizeof(en_dic[count].character); //if(buffSize>charSize) //en_dic[count].character=realloc(en_dic[count].character,buffSize+1); strcpy(en_dic[count].character,buffer); en_dic[count].code=count; en_dic[++count].character=END; //将P+s添加到词典中 curBuffer=findInDic(prefix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); //验证 strcpy(prefix,suffix); if(fgets(suffix,2,inFile)==NULL){ curBuffer=findInDic(suffix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); break; } } } free(prefix); free(suffix); free(buffer); fclose(inFile); fclose(outFile); }/*解压缩函数*/void deCompression(char inFileName[20],char outFileName[20]){ UNIT currCode,preCode; char *currStr,*preStr; int dateFrom=1,dicNum=0; FILE *inFile,*outFile; int i; char *p=(char *)malloc(sizeof(char)*100),c; char *buffer=(char *)malloc(sizeof(char)*100); if(!(inFile=fopen(inFileName,"rb"))){ printf("源文件打开失败!\n"); return ; } if(!(outFile=fopen(outFileName,"wb"))){ printf("目标文件建立失败!\n"); return ; } for(i=0;;i++){ de_dic[i].character=(char *)malloc(sizeof(char)*2);//重复分配问题 fread(&de_dic[i],sizeof(DIC),1,inFile); dicNum++; if(de_dic[i].character==HEAD_END){ break; } dateFrom++; } dicNum--; fseek(inFile,sizeof(DIC)*dateFrom,SEEK_SET); fread(&preCode,sizeof(UNIT),1,inFile); fread(&currCode,sizeof(UNIT),1,inFile); while(!feof(inFile)){ if((currStr=en_isFindDic(currCode))!=NULL) { preStr=en_isFindDic(preCode); fputs(preStr,outFile); strcpy(p,preStr); c=*currStr; sprintf(buffer,"%s%c",p,c); de_dic[dicNum].character=(char *)malloc(sizeof(char)*100); //realloc strcpy(de_dic[dicNum].character,buffer); //添加到字典 de_dic[dicNum].code=dicNum; de_dic[++dicNum].character=END; } else { preStr=en_isFindDic(preCode); strcpy(p,preStr); c=*preStr; sprintf(buffer,"%s%c",p,c); fputs(buffer,outFile); de_dic[dicNum].character=(char *)malloc(sizeof(char)*1000); //realloc strcpy(de_dic[dicNum].character,buffer); //添加到字典 de_dic[dicNum].code=dicNum; de_dic[++dicNum].character=END; } preCode=currCode; fread(&currCode,sizeof(UNIT),1,inFile); } printf("解压缩成功!\n"); fclose(inFile); fclose(outFile); }char *en_isFindDic(UNIT preCode){ int i=0; char *preStr; while(END!=de_dic[i].character){ if(preCode==de_dic[i].code){ preStr=de_dic[i].character; return preStr; } i++; } return FALSE;}/*查找函数1 *判断当前字串是否存在于字典当中 *若存在返回结构体指针,若不存在返回FALSE */DIC *isFindDic(char *buffer){ int i=0; DIC *curBuffer; while(END!=en_dic[i].character){ if(!strcmp(en_dic[i].character,buffer)){ curBuffer=&en_dic[i]; return curBuffer; } i++; } return FALSE;}/*查找函数2*/DIC *findInDic(char *prefix){ int i=0; DIC *curBuffer; while(END!=en_dic[i].character){ if(!strcmp(en_dic[i].character,prefix)){ curBuffer=&en_dic[i]; return curBuffer; } i++; } }int main(int argc, char *argv[]){ char en_inFileName[20],en_outFileName[20]; char de_inFileName[20],de_outFileName[20]; int key; while(1){ printf("1-压缩,2-解压\n"); scanf("%d",&key); switch(key){ case 1: fflush(stdin); gets(en_inFileName); fflush(stdin); gets(en_outFileName); initDic(en_inFileName); compression(en_inFileName,en_outFileName); break; case 2: fflush(stdin); gets(de_inFileName); fflush(stdin); gets(de_outFileName); deCompression(de_inFileName,de_outFileName); break; }} //initDic(en_inFileName); //compression(en_inFileName,en_outFileName); //free(character) printf("压缩成功!\n"); return 0;}