unsigned int c; char *cd;
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));// 分配n个字符编码的头指针 cd=(char*)malloc(n*sizeof(char)); // 分配求编码的字符数组 cd[n-1]='\\0';
for(i=1;i<=n;i++) // 逐个字符求哈夫曼编码 {
start=n-1; // 编码结束符位置
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) // 从叶子到根逆向求编码 if(HT[f].lchild==c) // c是其双亲的左孩子 cd[--start]='0'; // 由叶子向根赋值'0' else // c是其双亲的右孩子
cd[--start]='1'; // 由叶子向根赋值'1'
HC[i]=(char*)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间 stringcopy(HC[i],&cd[start]); // 从cd复制编码串到HC矩阵 }
free(cd); // 释放工作空间 }
//---------------------译码----------------------------------------------------- void encode() {
FILE *fp1=NULL,*fp2=NULL;
char input[20]=\
printf(\请输入输入文件名(input.txt):\scanf(\
if ((fp1=fopen(input,\{ }
printf(\请输入输出文件名(output.txt):\scanf(\
printf(\无此文件!\getchar(); getchar(); return ;
if((fp2=fopen(output,\{ } int i,k;
unsigned int *w,p,m=0,j; {
if(fgetc(fp1)==' ') for(k=0;!feof(fp1);k++) printf(\不能创建文件!\getchar(); getchar(); return ;
m++; }
printf(\哈夫曼编码为:\
fp1=fopen(input,\
w=(unsigned int*)malloc(m*sizeof(unsigned int)); // 动态生成存放m个权值的空间 for(j=0;j<=m-1;j++) {
fscanf(fp1,\依次输入原码
}
for(p=0;p for(i=0;i fclose(fp1); if(*(w+p)==HT[i+1].weight) { fprintf(fp2,\ printf(\ } fclose(fp2); } printf(\输出完成.按任意键继续....\getchar(); getchar(); //-------------------------解码------------------------------------------------- void decode() { FILE *fp1=NULL,*fp2=NULL; char input[20],output[20]; char *code; code=(char*)malloc(n*sizeof(char)); printf(\请输入输入文件名(input.txt):\scanf(\ if ((fp1=fopen(input,\{ } printf(\请输入输出文件名(output.txt):\scanf(\ if((fp2=fopen(output,\{ printf(\不能创建文件!\getchar(); getchar(); return ; printf(\无此文件!\getchar(); getchar(); return ; } int i,j; printf(\哈夫曼译码为:\for(i=0;!feof(fp1);i++) { *(code+i)=fgetc(fp1); *(code+i+1)='\\0'; for(j=0;j if(strcmp(code,HC[j+1])==0) { } fprintf(fp2,\printf(\i=-1; break; } fclose(fp1); fclose(fp2); printf(\输出完成.按任意键继续....\getchar(); getchar(); } //---------------------初始化哈夫曼树------------------------------------------