1、第 - 1 - 页 共 7 页实验三 树的应用一.实验题目:树的应用哈夫曼编码二.实验内容:利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。根据哈夫曼 编码的原理,编写一个程序,在用 户输入结点权值的基础上求哈夫曼编码。要求:从键盘输入若干字符及每个字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树 ,然后 对各个字符进行哈夫曼编码,最后打印 输出字符及对应的哈夫曼编码。三、程序源代码:#include #include #include #include typedef structchar data;int weight;int parent,l
2、child,rchild;HTNode,*HuffmanTree;typedef char * * HuffmanCode;void Select(HuffmanTree int tmp;for(int j=n+1;js2) /将 选出的两个节点中的序号较小的始终赋给s1 tmp=s1; s1=s2; s2=tmp;ps1.parent=j;ps2.parent=j;pj.lchild=s1;pj.rchild=s2;pj.weight=ps1.weight+ps2.weight;void HuffmanCoding(HuffmanTree if(nch;return ch;void main
3、() int n;int Array100;char cArray100;HuffmanTree HT;coutArrayi;int tag;char x=menu();while(1) switch (x) 第 - 6 - 页 共 7 页case I:HuffmanCoding(HT,n,cArray,Array);break;case E:Encoding(HT,n);break;case D:Decoding(HT,n);break;case P:Print();break;case Q:tag=0;coutch;if (ch=y) coutc;x=c;else exit(1); 测试数
4、据:用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的译码和编码:“THIS PROGRAM IS MY FAVORITE“. 字符 空格 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1 四.测试结果:如图一所示五.实验体会通过本次实验,尤其在自己对程序的调试过程中,感觉对树的存储结构, 终结状态,还有编码,译码的过程都有了比较清晰的认识。在做本次 实验时,其他的都没什么问题,以前很少进行文件操作, 刚开始有点手生,但是在实验作完后,文件操作已经用的比较熟练了。最近几次实验,感到自己对本题实验的运行机理和过程掌握的最为透彻。收获不小。在 实验过程中,遇到的一个主要问题是在第 - 7 - 页 共 7 页C+里面输入单个空格字符的问题。最终通过用 cin.getline()来解决,但是还不是很理想。为了察看方便,把有些文件的内容直接显示在终端上了,没有列出生成的文件里的结果。第 - 8 - 页 共 7 页图一第 - 9 - 页 共 7 页