哈夫曼编码解码实验报告.docx
文本预览下载声明
哈夫曼编码解码实验
实验要求
掌握二叉树的相关概念
掌握构造哈夫曼树,进行哈夫曼编码。
对编码内容通过哈夫曼树进行解码。
实验内容
通过二叉树构造哈夫曼树,并用哈夫曼树对读取的txt文件进行哈夫曼编码。编码完成后通过哈夫曼树进行解码。
#includestdio.h
#includestring.h
#define MAX 100
//定义哈夫曼树的存储结构
typedef struct
{
char data;
int weight;
int parent;
int lch;
int rch;
}HuffNode;
//定义哈夫曼编码的存储结构
typedef struct
{
char bit[MAX];
int start;
}HuffCode;
HuffNode ht[2*MAX];
HuffCode hcd[MAX];
int Coun[127]={0};
int n;
char s1[200000];
char text[5000];
//构造哈夫曼树
void HuffmanTree()
{
int i,j,k,left,right,min1,min2;
//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(;j127;j++)
{
if(Coun[j]!=0)
{
ht[i].data=j;
//printf(%c,ht[i].data);
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)//若是根结点
//令min1和min2为最小的两个权值,left和right为权值最小的两个结点位置
if(ht[k].weightmin1)
{
min2=min1;
right=left;
min1=ht[k].weight;
left=k;
}
else if (ht[k].weightmin2)
{
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;
}
}
//构造哈夫曼编码
void HuffmanCode()
{
int i,c,k,f;
HuffCode cd;
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;
}
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].bi
显示全部