1.
2.
1)
2)
3)
选做内容:修改程序,选择实现以下功能:
4)
5)
6)
3.
1)
2)
3)
4)
4.函数说明
(1)编写函数,实现建立哈夫曼树和显示哈夫曼树的功能 。
huffnode
(2).编写函数,实现生成哈夫曼编码的功能。
void
已知tree[i]节点的编码序列为s,求该节点下所有叶子节点的编码序列
(3)编写主函数,从终端输入一段英文文本;统计各个字符出现的频率,然后构建哈夫曼树并求出对应的哈夫曼编码;显示哈夫曼树和哈夫曼编。
(4)
void
(5)压缩比例的计算
float
(6)将采用哈夫曼编码压缩的文本还原为英文文本
*函数内容详见程序清单*
5.程序清单&代码说明
#include
#include
#include
#include
#define
typedef
{ char
int
int
int
}
struct
{ int
char
}
huffnode
{
int
int
huffnode
tree=(huffnode
for
tree[i].lchild=tree[i].rchild=-1;
if
tree[i].data=data[i];
tree[i].weight=weight[i];
}
else
}
for
{
min1=min2=INT_MAX; //INT_MAX为最大值
min_i1=min_i2=-1;
for
if
if
{
min2=min1;
min_i2=min_i1;
min1=tree[k].weight;
min_i1=k;
}
else
if
min2=tree[k].weight;
min_i2=k;
}
tree[i].weight=min1+min2;
tree[min_i1].weight
tree[min_i2].weight
tree[i].lchild=min_i1;
tree[i].rchild=min_i2;
}
return
}
void
//已知tree[i]节点的编码序列为s,求该节点下所有叶子节点的编码序列。
{ char
if(i!=-1)
if
c=tree[i].data;
strcpy(codeset[c-32].code,
}
else
strcpy(s1,
CreateHuffcode(tree,
strcpy(s1,
CreateHuffcode(tree,
}
return;
}
void
{
}
void
{
//根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中
int
hfmstr[0]='\0';
i=0;
while(str[i]!='\0')
j=str[i]-32;
strcat(hfmstr,
i++;
}
}
void
//根据tree数组中的huffman树,逐个对hfmstr字符串中的字符进行译码,结果放在decodestr字符串中
{
int
huffnode
p=tree[2*n-2];
while(hfmstr[i]!='\0')
{while(p.lchild!=-1&&p.rchild!=-1)
{
if(hfmstr[i]=='0')
{
p=tree[p.lchild];
}
else
{
p=tree[p.rchild];
}
i++;
}
decodestr[j]=p.data;j++;
p=tree[2*n-2];
}
}
float
{
float
int
for(i=0;str[i]!='\n';i++)
a++;
a=a*8;
for(i=0;hfmstr[i]!='\n';i++)
b++;
w=a/b;
return
}
void
{
int
float
huffnode
char
int
int
char
char
char
printf("输入要转换的字符串\n");
gets(str);
for(i=0;i<N;i++)
codeset[i].count=0;
codeset[i].code[0]='\0';
}
i=0;
while(str[i]!='\0')
j=str[i]-32;
codeset[j].count++; //codeset[0]~[95]对应ascii码32~127的字符
i++;
}
for(i=0;i<N;i++) //统计原始字符串中出现的字符个数
if(codeset[i].count!=0)
printf("字符频率统计:\n"); //显示统计结果
for(i=0;i<N;i++)
if(codeset[i].count!=0)
printf("\n");
j=0;
for(i=0;i<N;i++) //生成要编码的字符集合,以及权重
if
data[j]=i+32;
weight[j]=codeset[i].count;
}
ht=CreateHufftree(data,weight,n);
CreateHuffcode(ht,
//显示codeset中的Huffman编码,参见"显示频率统计结果"的代码.
if(codeset[i].count!=0)
}
EnCoding(str,
printf("编码序列:
ratio=CompressRatio(str,
printf("压缩比:
DeCoding(ht,
printf("解码后的字符串:
free(ht);
}
6、实验截图
7、实验体会:、
实验前有老师给的已经编好的一部分程序,大大减少了工作来量。通过上机实验,我进一步掌握指针变量和动态变量的含义你,掌握二叉树的结构特性,以及各种存储结构的特点及适用范围,掌握用指针类型描述、访问和处理二叉树的运算。二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有多种形态。为了扩展知识,我从网上查阅了一些关于树的知识。尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。树是由一个或多个结点组成的有限集合,其中:
⒈必有一个特定的称为根(ROOT)的结点;
⒉剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且,
树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。二叉树很象一株倒悬着的树,从树根到大分枝、小分枝、直到叶子把数据联系起来,这种数据结构就叫做树结构,简称树。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶
希望自己在这门课中可以学到更多的知识,多点知识总是好的。1.
2.
1)
2)
3)
选做内容:修改程序,选择实现以下功能:
4)
5)
6)
3.
1)
2)
3)
4)
4.函数说明
(1)编写函数,实现建立哈夫曼树和显示哈夫曼树的功能 。
huffnode
(2).编写函数,实现生成哈夫曼编码的功能。
void
已知tree[i]节点的编码序列为s,求该节点下所有叶子节点的编码序列
(3)编写主函数,从终端输入一段英文文本;统计各个字符出现的频率,然后构建哈夫曼树并求出对应的哈夫曼编码;显示哈夫曼树和哈夫曼编。
(4)
void
(5)压缩比例的计算
float
(6)将采用哈夫曼编码压缩的文本还原为英文文本
*函数内容详见程序清单*
5.程序清单&代码说明
#include
#include
#include
#include
#define
typedef
{ char
int
int
int
}
struct
{ int
char
}
huffnode
{
int
int
huffnode
tree=(huffnode
for
tree[i].lchild=tree[i].rchild=-1;
if
tree[i].data=data[i];
tree[i].weight=weight[i];
}
else
}
for
{
min1=min2=INT_MAX; //INT_MAX为最大值
min_i1=min_i2=-1;
for
if
if
{
min2=min1;
min_i2=min_i1;
min1=tree[k].weight;
min_i1=k;
}
else
if
min2=tree[k].weight;
min_i2=k;
}
tree[i].weight=min1+min2;
tree[min_i1].weight
tree[min_i2].weight
tree[i].lchild=min_i1;
tree[i].rchild=min_i2;
}
return
}
void
//已知tree[i]节点的编码序列为s,求该节点下所有叶子节点的编码序列。
{ char
if(i!=-1)
if
c=tree[i].data;
strcpy(codeset[c-32].code,
}
else
strcpy(s1,
CreateHuffcode(tree,
strcpy(s1,
CreateHuffcode(tree,
}
return;
}
void
{
}
void
{
//根据codeset编码表,逐个将str字符串中的字符转化为它的huffman编码,结果编码串放在hfmstr字符串中
int
hfmstr[0]='\0';
i=0;
while(str[i]!='\0')
j=str[i]-32;
strcat(hfmstr,
i++;
}
}
void
//根据tree数组中的huffman树,逐个对hfmstr字符串中的字符进行译码,结果放在decodestr字符串中
{
int
huffnode
p=tree[2*n-2];
while(hfmstr[i]!='\0')
{while(p.lchild!=-1&&p.rchild!=-1)
{
if(hfmstr[i]=='0')
{
p=tree[p.lchild];
}
else
{
p=tree[p.rchild];
}
i++;
}
decodestr[j]=p.data;j++;
p=tree[2*n-2];
}
}
float
{
float
int
for(i=0;str[i]!='\n';i++)
a++;
a=a*8;
for(i=0;hfmstr[i]!='\n';i++)
b++;
w=a/b;
return
}
void
{
int
float
huffnode
char
int
int
char
char
char
printf("输入要转换的字符串\n");
gets(str);
for(i=0;i<N;i++)
codeset[i].count=0;
codeset[i].code[0]='\0';
}
i=0;
while(str[i]!='\0')
j=str[i]-32;
codeset[j].count++; //codeset[0]~[95]对应ascii码32~127的字符
i++;
}
for(i=0;i<N;i++) //统计原始字符串中出现的字符个数
if(codeset[i].count!=0)
printf("字符频率统计:\n"); //显示统计结果
for(i=0;i<N;i++)
if(codeset[i].count!=0)
printf("\n");
j=0;
for(i=0;i<N;i++) //生成要编码的字符集合,以及权重
if
data[j]=i+32;
weight[j]=codeset[i].count;
}
ht=CreateHufftree(data,weight,n);
CreateHuffcode(ht,
//显示codeset中的Huffman编码,参见"显示频率统计结果"的代码.
if(codeset[i].count!=0)
}
EnCoding(str,
printf("编码序列:
ratio=CompressRatio(str,
printf("压缩比:
DeCoding(ht,
printf("解码后的字符串:
free(ht);
}
7、实验体会:、
实验前有老师给的已经编好的一部分程序,大大减少了工作来量。通过上机实验,我进一步掌握指针变量和动态变量的含义你,掌握二叉树的结构特性,以及各种存储结构的特点及适用范围,掌握用指针类型描述、访问和处理二叉树的运算。二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有多种形态。为了扩展知识,我从网上查阅了一些关于树的知识。尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。树是由一个或多个结点组成的有限集合,其中:
⒈必有一个特定的称为根(ROOT)的结点;
⒉剩下的结点被分成n>=0个互不相交的集合T1、T2、......Tn,而且,
树结构的特点是:它的每一个结点都可以有不止一个直接后继,除根结点外的所有结点都有且只有一个直接前驱。二叉树很象一株倒悬着的树,从树根到大分枝、小分枝、直到叶子把数据联系起来,这种数据结构就叫做树结构,简称树。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶
希望自己在这门课中可以学到更多的知识,多点知识总是好的。
原文地址:点击打开链接