数据结构实验Word文档格式.docx
《数据结构实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
四、详细设计
1、建立哈夫曼的结构体数据类型:
typedefstruct
{
intweight;
intparent;
intlchild;
intrchild;
}HNode;
HNodeHuffNode[MAXNODE+1];
/*定义哈夫曼结构数组*/
typedefstruct
intbit[MAXBIT];
intstart;
}HCode;
HCodeHuffCode[MAXLEAF];
/*定义编码结构*/
2、构造哈夫曼树的算法:
voidHuffman()/*哈夫曼树的构造及编码函数*/
inti,j,m1,m2,x1,x2,n,c,p;
HCodecd;
cout<
<
"
请输入叶结点的个数:
;
cin>
>
n;
Count=n;
for(i=0;
i<
2*n-1;
i++)/*数组HuffNode[]初始化*/
{
HuffNode[i].weight=0;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
}
请输入叶结点的权值:
endl;
i++)/*输入n个叶结点的权值*/
cout<
请输入第"
i+1<
个叶结点的权值:
w["
]="
cin>
HuffNode[i].weight;
n-1;
i++)/*哈夫曼树的构造*/
m1=MAXVALUE;
m2=MAXVALUE;
x1=x2=0;
for(j=0;
j<
n+i;
j++)/*找出两棵权值最小的子树*/
{
if(HuffNode[j].weight<
m1&
&
HuffNode[j].parent==-1)
{
m2=m1;
x2=x1;
m1=HuffNode[j].weight;
x1=j;
}
elseif(HuffNode[j].weight<
m2&
m2=HuffNode[j].weight;
x2=j;
}
/*将找出的两棵子树合并为一棵子树*/
HuffNode[x1].parent=n+i;
HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[n+i].lchild=x1;
HuffNode[n+i].rchild=x2;
3、哈夫曼编码的算法:
Count;
i++)/*求每个叶结点的哈夫曼编码*/
cd.start=Count-1;
c=i;
p=HuffNode[c].parent;
while(p!
=-1)/*由叶结点向上直到树根*/
if(HuffNode[p].lchild==c)
cd.bit[cd.start]=0;
else
cd.bit[cd.start]=1;
cd.start--;
c=p;
p=HuffNode[c].parent;
for(j=cd.start+1;
j++)/*保存求出的每个叶子结点的哈夫曼编码和编码的起始位*/
HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start;
}
3、源程序代码:
#include<
iostream.h>
iomanip.h>
#defineMAXVALUE1000;
/*定义最大权值*/
#defineMAXLEAF30/*定义哈夫曼树中叶结点个数*/
#defineMAXNODEMAXLEAF*2-1/*结点总数*/
#defineMAXBIT10/*定义哈夫曼编码的最大长度*/
intCount;
for(i=0;
哈夫曼编码为:
i++)/*输出每个叶结点的哈夫曼编码*/
for(j=HuffCode[i].start+1;
j++)
cout<
HuffCode[i].bit[j];
}
voidHuffmanTreeshow()/*显示哈夫曼树*/
inti;
cout<
num"
setw(10)<
weight"
parent"
lchild"
rchild"
2*Count-1;
i++)
HuffNode[i].weight<
HuffNode[i].parent<
HuffNode[i].lchild<
HuffNode[i].rchild<
voidmain()
Huffman();
哈夫曼树双亲孩子表示:
\n"
HuffmanTreeshow();
5、测试运行
(1).测试数据如下:
7,12,23,3,19,31
(2).输出结果应为:
哈夫曼编码:
01010111001000011
哈夫曼树的表示:
numweightparentlchildrchild
076-1-1
1127-1-1
2239-1-1
336-1-1
4198-1-1
5319-1-1
610730
722861
8411047
9541025
1095-189
(3).程序运行结果如下:
6、心得总结
通过本次实验,让我对一个程序的数据结构有了更全面更进一步的认识。
在编写这个程序的过程中,我复习了之前学的一些基本语法,进一步学习了构造哈夫曼树的算法以及实现哈夫曼树编码的算法。
体会了学以致用、突出自己劳动成果的喜悦心情,也从中发现自己平时学习的不足和薄弱环节,从而加以弥补。