elseif(c
}//if
}//for
HT[s1].code=HT[s2].code=1;
}//select
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,hfmlistHL,unsignedintn){
//w存放n个权值(均>0),构造Huffman树HT,并求出n个字符的Huffman编码HC.
unsignedinti,f,start,c,m;
char*cd;
if(n<=1)return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=m;++i){HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=HT[i].code=0;}
for(i=1;i<=n;++i)HT[i].weight=HL[i].wt;
for(i=n+1;i<=m;++i){
select(HT,i-1);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
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)cd[--start]='0';
elsecd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],cd+start);
}
free(cd);
}
//*************************文件操作*****************************
voidsave(char*p){
FILE*fp;
inti;
printf("inputthename:
");
if((fp=fopen(gets(a),"w+"))==NULL){
printf("cannotopenthefile!
\n");
exit(0);}//if
for(i=0;p[i]!
='\0';i++){
if(fwrite(p+i,sizeof(char),1,fp)!
=1){//fwrite函数写数据块
printf("Filewriteerror!
\n");exit(0);}//if
}//for
fclose(fp);
}//save
//************************编码与译码操作**********************************
voidDecoding(HuffmanTreeHT,hfmlistHL,char*size,intn)//这个函数是用来译码的
{inti,j,k;
charp[130];
printf("请输入需要译码的代码:
");gets(p);//接受需要译码的字符串
i=2*n-1;
k=0;
for(j=0;p[j]!
='\0';j++){
if(p[j]=='0'){if(HT[i].lchild!
=0)i=HT[i].lchild;
else{size[k++]=HL[i].letter;
i=2*n-1;
j--;}
}
else{if(HT[i].rchild!
=0)i=HT[i].rchild;
else{size[k++]=HL[i].letter;
i=2*n-1;
j--;}
}
}//for
if(p[j-1]=='0')size[k++]=HL[i].letter;
elsesize[k++]=HL[i].letter;
size[k]='\0';
}//decoding
voidEncoding(HuffmanCodeHC,hfmlistHL,char*coding,intn){
inti,j,t,k=0;
charp[100];
printf("请再次输入需要编码的文本:
");
gets(p);
for(i=0;p[i]!
='\0';i++){
if((p[i]>='A'&&p[i]<='Z')||p[i]=='')
for(j=1;j<=n;j++)
if(p[i]==HL[j].letter)
for(t=0;HC[j][t]!
='\0';t++)
coding[k++]=HC[j][t];
}//for
coding[k]='\0';
}//encoding
//************************打印操作****************************
voidPrint(FILE*fp1,FILE*fp2){
//将文件fp1中的代码以紧凑格式显示在终端上,每行50个代码
//同时将此字符形式的编码文件写入文件fp2中
charc[200];
inti;
fgets(c,200,fp1);
for(i=0;c[i]=='0'||c[i]=='1';i++){
printf("%c",c[i]);
fprintf(fp2,"%c",c[i]);
if((i+1)/50*50==(i+1)){
printf("\n");
fprintf(fp2,"\n");
}
}//for
printf("\n");
}//Print
voidPreOrderTraverse(HuffmanTreeHT,intk,FILE*fp){
//先序遍历并打印树,结果存放于fp中,k为根结点的下标
inti;
for(i=1;i<=DEPTH-1;i++)fprintf(fp,"");
for(;i<=DEPTH;i++)fprintf(fp,"|------");
fprintf(fp,"%d\n",HT[k].weight);
if(HT[k].lchild!
=0){
DEPTH++;
PreOrderTraverse(HT,HT[k].lchild,fp);
DEPTH--;
}
if(HT[k].rchild!
=0){
DEPTH++;
PreOrderTraverse(HT,HT[k].rchild,fp);
DEPTH--;
}
if(HT[k].lchild==0&&HT[k].rchild==0)return;
return;
}//PreOrderTraverse
voidTreePrinting(HuffmanTreeHT,intn,FILE*fp){
//打印树HT,结果存于文件fp中,n为树的叶子结点数
inti,k;
for(i=1;i<=2*n;i++)if(HT[i].parent==0){k=i;bre