哈夫曼编码解码的实验报告.docx
- 文档编号:6761429
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:8
- 大小:15.95KB
哈夫曼编码解码的实验报告.docx
《哈夫曼编码解码的实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码解码的实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
哈夫曼编码解码的实验报告
哈夫曼编码解码实验报告
1.实验要求
掌握二叉树的相关概念掌握构造哈夫曼树,进行哈夫曼编码。
对编码内容通过哈夫曼树进行解码。
2.实验内容通过二叉树构造哈夫曼树,并用哈夫曼树对读取的txt文件进行哈夫曼编码。
编码完成后通过哈夫曼树进行解码。
#include
#include
#defineMAX100
//定义哈夫曼树的存储结构
typedefstruct
{
chardata;
intweight;
intparent;
intlch;
intrch;
}HuffNode;
Word文档
//定义哈夫曼编码的存储结构
typedefstruct
{
charbit[MAX];
intstart;
}HuffCode;
HuffNodeht[2*MAX];HuffCodehcd[MAX];intCoun[127]={0};intn;
chars1[200000];chartext[5000];
//构造哈夫曼树
voidHuffmanTree()
{
inti,j,k,left,right,min1,min2;
Word文档
//printf("输入叶子的节点数:
");
//scanf("%d",&n);
printf("字符数量=%d\n",n);for(i=1;i<=2*n-1;i++)
{
ht[i].parent=ht[i].lch=ht[i].rch=0;
}
j=0;
for(i=1;i<=n;i++)
{
/*getchar();
printf("输入第%d个叶子节点的值:
",i);scanf("%c",&ht[i].data);
printf("输入该节点的权值:
");
scanf("%d",&ht[i].weight);
*/
for(;j<127;j++)
{
if(Coun[j]!
=0)
{
ht[i].data=j;
//printf("%c",ht[i].data);
Word文档ht[i].weight=Coun[j];
//printf("%d",ht[i].weight);
break;
}
}
j++;
}
printf("\n");
for(i=1;i<=n;i++)
{
printf("%c",ht[i].data);
}
printf("\n");
for(i=n+1;i<=2*n-1;i++)
{//在前n个结点中选取权值最小的两个结点构成一颗
二叉树
min1=min2=10000;//为min1和min2设置一个比所有权值都大的值
left=right=0;
for(k=1;k<=i-1;k++)
{
if(ht[k].parent==0)//若是根结点
Word文档
//令min1和min2为最小的两个权值,left和right为权值最小的两个结点位置if(ht[k].weight { min2=min1;right=left;min1=ht[k].weight;left=k; } elseif(ht[k].weight { min2=ht[k].weight;right=k; } } ht[left].parent=i;ht[right].parent=i;ht[i].weight=ht[left].weight+ht[right].weight;ht[i].lch=left; ht[i].rch=right; Word文档 //构造哈夫曼编码 voidHuffmanCode() { inti,c,k,f; HuffCodecd; for(i=1;i<=n;i++) { cd.start=n; c=i; f=ht[i].parent; while(f! =0) {if(ht[f].lch==c) cd.bit[cd.start]='0';else cd.bit[cd.start]='1';cd.start--;c=f; f=ht[f].parent; Word文档 }hcd[i]=cd; } printf("输出哈夫曼编码: \n"); for(i=1;i<=n;i++) { printf("%c: ",ht[i].data); for(k=hcd[i].start+1;k<=n;k++) printf("%c",hcd[i].bit[k]);printf("\n"); } } //对字母进行编码 voidCode()//将字符与相应的哈夫曼编码进行匹配,输出编码结果 { inti=0,j,k,h=0; while(text[i]! ='\0') { Word文档 for(j=1;j<=n;j++) { if(text[i]==ht[j].data) { for(k=hcd[j].start+1;k<=n;k++) { s1[h]=hcd[j].bit[k]; h++; } break; } } i++; } //printf("编码\n"); //puts(s1); //printf("\n"); } Word文档 //解码 voidHuffmanDecode() { printf("解码\n"); intlen,i,f; charC; //charS[MAXCODE]; //scanf("%s",S);//使用gets()直接跳过len=strlen(s1); printf("s1: %d\n",len); f=2*n-1; for(i=0;i { if(s1[i]=='0') { f=ht[f].lch; if(ht[f].lch==0&&ht[f].rch==0) { C=ht[f].data;printf("%c",C); Word文档 f=2*n-1; } } elseif(s1[i]=='1') { f=ht[f].rch; if(ht[f].lch==0&&ht[f].rch==0) { C=ht[f].data;printf("%c",C);f=2*n-1; } } } printf("\n"); } //统计字母个数及其权值 voidCount() { inti,j,m; Word文档n=0; i=0; //printf("请仅输入小写字母\n");//例程本省存在一个BUG,只输入一个字母不能进行编码(并未解决) //scanf("%s",s); while(text[i]! ='\0')//使用ASCII码表进行统计 { m=text[i]; //printf("%d\n",m); Coun[m]++; i++; } for(j=0;j<127;j++) { if(Coun[j]! =0) n++; } } //markCode Word文档 voidmain() { intl=0; FILE*fp; fp=fopen("text.txt","r");if(fp==NULL) { printf("文件打开失败\n");while (1); } while(! feof(fp)) { text[l]=fgetc(fp);l++; } printf("输入文本\n");printf("%s\n",text);fclose(fp); Count(); HuffmanTree(); Word文档 } HuffmanCode(); Code(); HuffmanDecode(); 文本文件 文本输入 Word文档 进行哈夫曼编码 对文本进行编码 Word文档 输出解码结果 Word文档 3.实验总结 通过本次实验,对二叉树的应用有了相应的了解,掌握了如何构造哈夫曼编码,如何对编码结果进行解码。 最重要的是学会了如何思考着去解决问题,以及代码的调试。 Word文档
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 解码 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)