哈弗曼的编码与译码 试验报告
数据结构
实验三:哈弗曼的编码与译码
姓名:汪思雨 学号:201006030102问题[1]:实现哈弗曼的编码与译码
问题求解
A.源代码
#include
#include
#include
typedef struct
{
char info;
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
int
n,m,w[27]={184,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,
1,16,1};
int flag[54];
char *info=" ABCDEFGHIJKLMNOPQRSTUVWXYZ"; HuffmanTree HT;
HuffmanCode HC;
void Select(HuffmanTree HT, int j,int &s1,int &s2) { //1到j~~ 选择双亲节点为0,并且最小的两个子叶节点
int b,finds=0;
// s1=1;s2=1;
for(b=1;b<=j;b++){
if(flag[b]==2&&finds==0) {s1=b;finds=1;}
else if(HT[b].weight表:\n");
//getchar();
//--- 从叶子到根逆向求每个字符的哈夫曼编码 ---
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';
else cd[--start] = '1';
HC[i] = (char *)malloc((n-start)*sizeof(char));
strcpy(HC[i], &cd[start]);
}
// display HC
/*for (i=1;i<=n;i++)
{
printf(" ");
puts(HC[i]);
} */
free(cd); } // HuffmanCoding
void CheckCoding()
{// 将ToBeTra中的正文进行译码并存入CodeFile
FILE *fp1,*fp2;
int ab;
char c;
char str[100];
fp1=fopen("ToBeTra.txt","r") ;
fp2=fopen("CodeFile.txt","w+");
if(fp1==NULL||fp2==NULL)
{
printf("cannot open or create these files!\n");
}
else {
c=fgetc(fp1);//按字符位置来一个个编码
while(c!=EOF)
{
if(c==' ') ab=1;
else ab=c-63;
strcpy(str,HC[ab]);
fputs(str,fp2);
c=fgetc(fp1);
}
printf("CodeFile has been saved in the file CodeFile.txt\n");
}
fclose(fp1);fclose(fp2);
}
void HuffmanTranslate()
{ //将CodeFile中的代码进行译码并存入Textfile
FILE *fp1,*fp2;
int key;
char c,cc;
char str[1000];
fp1=fopen("CodeFile.txt","r");
fp2=fopen("TextFile.txt","w+");
if(fp1==NULL||fp2==NULL)
printf("no file to translate!");
else
{
c=fgetc(fp1);
while(c!=EOF)
{
//遍历树
key=m;
while(HT[key].lchild!=0&&HT[key].rchild!=0)
{
if(c=='0')
key=HT[key].lchild;
else key=HT[key].rchild;
c=fgetc(fp1);
}//最后为所指向的位置.
cc=info[key-1];
fprintf(fp2,"%c",cc);
}
}
fclose(fp1);fclose(fp2);
}
int txt()
{
FILE *fp;
char s[100];
if((fp=fopen("ToBeTra.txt","w+"))==NULL)
printf("ToBeTra.txt cant be created! \n");///
else
{
printf("please in put a txt,it will be save in the file ToBeTra.txt:\n");
gets(s);
if(fputs(s,fp)!=NULL)
printf("\nOK\n");
}
fclose(fp);
return 0;
}//text function is ended;
main()
{
int op,a;
char *str=" ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while(1)
{printf("---------------------------------------------\n");
printf(" 赫夫曼编码和译码 \n");
printf(" 1.初始化 \n");
printf(" 2.输入对应的正文内容 \n") ;
printf(" 3.进行赫夫曼编码 \n");
printf(" 4.进行赫夫曼译码 \n") ;
printf(" 5.退出赫夫曼操作 \n");
printf(" 请输入1.2.3.4.5 \n");
printf(" ---------------------------------------------\n");
//---
scanf("%d",&op);
getchar();
switch(op)
{
case 1 :
HuffmanCoding(HT,w,27,str);
break;
case 2 :
if(txt()==0) printf("OK\n");
break;
case 3 :
CheckCoding();
printf("OK\n");
break;
case 4 :
HuffmanTranslate();
break;
case 5 :
exit(0);break;
}
}
}
B.程序运行截图
B.分析说明
通过哈弗曼算法,调用
。
采用一个集合的形式来实现哈弗曼的编码和解码。