1 / 13
文档名称:

数据结构实验报告 实验五.docx

格式:docx   大小:17KB   页数:13页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据结构实验报告 实验五.docx

上传人:glfsnxh 2018/5/10 文件大小:17 KB

下载得到文件列表

数据结构实验报告 实验五.docx

文档介绍

文档介绍:数据结构实验报告实验五
:
实现哈夫曼编码的生成算法。
:
1、使学生熟练掌握哈夫曼树的生成算法。
2、熟练掌握哈夫曼编码的方法。
:
已知n个字符在原文中出现的频率,求它们的哈夫曼编码。
1、读入n个字符,以及字符的权值,试建立一棵Huffman树。
2、根据生成的Huffman树,求每个字符的Huffman编码。并对给定的待编码字符序列进行编码,并输出。

(1)郝夫曼树的存储表示
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储郝夫曼树
郝夫曼编码的存储表示
typedef char* *HuffmanCode;//动态分配数组存储郝夫曼编码
(2)主要的实现思路:
,这里使用了数组
()遍历n个字符,找出权值最小的两个
,并求出n个字符的郝夫曼编码HC
总结
,在调用select()这个函数时,想把权值最小的两个结点的序号带回HuffmanCoding(),所以把那2个序号设置成了引用。
,在什么时候分配内存,什么时候初始化花的时间比较长
,发现结果仍然存在问题,经过分步调试,发现了特别低级的输入错误。=+;中的s2写成了i
附:
//动态分配数组存储郝夫曼树
typedef struct{
int weight; //字符的权值
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
//动态分配数组存储郝夫曼编码
typedef char* *HuffmanCode;
//选择n个(这里是k=n)节点中权值最小的两个结点
void Select(HuffmanTree &HT,int k,int &s1,int &s2)
{ int i;
i=1;
while(i //下面选出权值最小的结点,用s1指向其序号
s1=i;
for(i=1;i {
if(==0&&
}
//下面选出权值次小的结点,用s2指向其序号
for(i=1;i {
if(==0&&i!=s1)break;
}
s2=i;
for(i=1;i {
if(==0&&i!=s1&&
}
}
//构造Huffman树,求出n个字符的编码
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
int m,c,f,s1,s2,i,start;
char *cd;
if(n m=2*n-1; //n个叶子n-1个结点
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用,预分配m+1个单元
HuffmanTree p=HT+1;
w++; //w的号单元也没有值,所以从号单元开始
for(i=1;i {
p->weight=*w;
p->parent=p->rchild=p->lchild=0;
}
for(;i {
p->weight=p->parent=p->rchild=p->lchild=0;
}
for(i=n+1;i {
Select(HT,i-1,s1,s2); //选出当前权值最小的
=i;
=i;
=s1;
=s2;
=+;
}
//从叶子到根逆向求每个字符的郝夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配n个字符编码的头指针变量
cd=(char*)malloc(n*sizeof(char)); //分配求编码的工作空间
cd='';//编码结束符
for(i=1;i {
start=n-1