《哈夫曼编码》实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《哈夫曼编码》实验报告
《哈夫曼编码》实验报告
一、实验目的
1、掌握哈夫曼编码原理;
2、熟练掌握哈夫曼树的生成方法;
3、理解数据编码压缩和译码输出编码的实现。

二、实验要求
实现哈夫曼编码和译码的生成算法。

三、实验步骤
编写代码如下:
#include
#include
#include
#define MAXLEN 100
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
int n;
void inithfmt(hfmt t)

int i;
printf("\n");
printf("--------------------------------------------------------
\n"); printf("**********************输入区**********************\n");
printf("\n请输入n=");
scanf("%d",&n);
getchar();
for(i=0;i<2*n-1;i++)

t[i].weight=0;
t[i].lchild=-1;
t[i].rchild=-1;
t[i].parent=-1;
}
printf("\n");
}
void inputweight(hfmt t)
{
int w;
int i;
char k;
for(i=0;i<n;i++)< bdsfid="112" p=""></n;i++)<>
{
printf("请输入第%d个字符:",i+1);
scanf("%c",&k);
getchar();
t[i].key=k;
printf("请输入第%d个字符的权值:",i+1);
scanf("%d",&w);
getchar();
t[i].weight=w;
printf("\n");
}
}
void selectmin(hfmt t,int i,int *p1,int *p2)
{
long min1=999999;
long min2=999999;
int j;
for(j=0;j<=i;j++)
if(t[j].parent==-1)
if(min1>t[j].weight)
{
min1=t[j].weight;
*p1=j;
}
for(j=0;j<=i;j++)
if(t[j].parent==-1)
if(min2>t[j].weight && j!=(*p1))//注意 j!=(*p1)) { min2=t[j].weight;
*p2=j;
}

void creathfmt(hfmt t)
{
int i,p1,p2;
inithfmt(t);
inputweight(t);
for(i=n;i<2*n-1;i++)
{
selectmin(t,i-1,&p1,&p2);
t[p1].parent=i;
t[p2].parent=i;
t[i].lchild=p1;
t[i].rchild=p2;
t[i].weight=t[p1].weight+t[p2].weight;
}
}
void printhfmt(hfmt t)
{
int i;
printf("------------------------------------------------------------------\n");
printf("**************哈夫曼编数结构:*********************\n"); printf("\t\t权重\t父母\t左孩子\t右孩子\t字符\t");
for(i=0;i<2*n-1;i++)
{
printf("\n");
printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lc hild,t [i].rchild,t[i].key);
}
printf("\n------------------------------------------------------------------\n");
printf("\n\n");
}
void hfmtpath(hfmt t,int i,int j)
{
int a,b;
a=i;
b=j=t[i].parent;
if(t[j].parent!=-1)
{
i=j;
hfmtpath(t,i,j);
}
if(t[b].lchild==a)
printf("0");
else
printf("1");
}
void phfmnode(hfmt t){
int i,j,a;
printf("\n---------------------------------------------\n"); printf("******************哈夫曼编码**********************"); for(i=0;i<n;i++)< bdsfid="190" p=""></n;i++)<>
{
j=0;
printf("\n");
printf("\t\t%c\t",t[i].key,t[i].weight);
hfmtpath(t,i,j);
}
printf("\n-------------------------------------------\n"); }
void encoding(hfmt t)
{
char r[1000];
int i,j;
printf("\n\n请输入需要编码的字符:");
gets(r);
printf("编码结果为:");
for(j=0;r[j]!='\0';j++)
for(i=0;i<n;i++)< bdsfid="207" p=""></n;i++)<>
if(r[j]==t[i].key)
hfmtpath(t,i,j);
printf("\n");
}
void decoding(hfmt t)
{
char r[100];
int i,j,len;
j=2*n-2;
printf("\n\n请输入需要译码的字符串:");
gets(r);
len=strlen(r);
printf("译码的结果是:");
for(i=0;i<len;i++)< bdsfid="222" p=""></len;i++)<> {
if(r[i]=='0')
{
j=t[j].lchild;
if(t[j].lchild==-1)
{
printf("%c",t[j].key);
j=2*n-2;
}
}
else if(r[i]=='1')
{
j=t[j].rchild;
if(t[j].rchild==-1)
{
printf("%c",t[j].key);
j=2*n-2;
}
}
printf("\n\n");
}
int main()
{
int i,j;
hfmt ht;
char flag;
printf("\n----------------------------------------------\n");
printf("*******************编码&&译码&&退出***************");
printf("\n【1】编码\t【2】\t译码\t【0】退出");
printf("\n您的选择:");
flag=getchar();
getchar();
while(flag!='0')
{
if(flag=='1')
encoding(ht);
else if(flag=='2')
decoding(ht);
else
printf("您的输入有误,请重新输入。

\n");
printf("\n***************************编码&&译码&&退出
***********************");
printf("\n【1】编码\t【2】\t译码\t【0】退出");
printf("\n您的选择:");
flag=getchar();
getchar();
system("pause");
}
四、实验总结
通过这次实验,我对二叉树、哈夫曼树有了更好的认识。

在实验过程中,我掌握了哈夫曼树的结构,学会了将理论知识转换成实际应用。

同时,在解决对编写的程序进行找错的时候,我也对调试技巧有了更好的掌握,分析问题更加全面。

在实验中,我遇到了许多难点,比如,统计字符的权值,这就需要我们要有扎实的基础,不断的练习,虚心请教,才能解决。

在以后的学习中,我要不断的努力。

相关文档
最新文档