哈夫曼编译码系统实验报告.doc
《哈夫曼编译码系统实验报告.doc》由会员分享,可在线阅读,更多相关《哈夫曼编译码系统实验报告.doc(14页珍藏版)》请在三一文库上搜索。
1、数学与计算机学院 数据结构 实验报告年级 大二 学号* 姓名 * 成绩 专业 电气信息类(计算机) 实验地点 主楼402 指导教师 实验项目 实验日期 2010年11月20日 一、实验目的和要求通过对简单哈夫曼编/译码系统的设计与实现来熟练掌握树型结构在实际问题中的应用。此实验可以作为综合实验,阶段性实验时可以选择其中的几个功能来设计和实现。二、 问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码
2、系统。试为这样的信息收发编写一个哈夫曼码的编/译码系统。三、 数据结构设计1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1;描述结点的数据类型为:struct HNodeTypechar data; /结点字符int weight;/结点权值int parent;int lchild;int rchild;int level;2、求哈夫曼树编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。
3、求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下数据类型:struct HCodeTypeint bitMAXBIT;int start;3、文件hfmtree.txt、code、text。四、 功能设计 (1)接收原始数据:从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hf
4、mtree.dat中。(2)编码:利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.dat中读入),对文件中的正文进行编码,然后将结果存入文件code中。(3)译码:利用已建好的哈夫曼树将文件code中的代码进行译码,结果存入文件text中。(4)打印编码规则:即字符与编码的一一对应关系。(5)打印哈夫曼树:将已在内存中的哈夫曼树以直观的方式显示在终端上。五、 测试数据(1) 利用教科书中的数据调试程序。 令叶子结点个数n为4,权值集合为1 3 5 7,字符集合为A B C D,并有如下对应关系,A1,B3,C5,D7,调用初始化功能模块可以正确接收这些数据。调用建立哈夫曼树的功能模块
5、构造静态链表HuffNode的存储。调用建立哈夫曼编码规则的功能模块,在屏幕上显示如下对应关系:A1,B3,C5,D7。调用哈夫曼编码的功能模块,在屏幕上输入“ABCD”后,显示编码:调用译码的功能模块,输入代码串“111110100”后,屏幕上显示译码结果:100101110ABCD调用打印哈夫曼树的功能模块。在屏幕上显示哈夫曼树(用凹入法表示)。打印编码规则:(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。字符ABCDEFGHIJKLM频度18664132232103211547571532
6、20字符NOPQRSTUVWXYZ频度5763151485180238181161调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。调用建立哈夫曼编码规则的功能模块: 调用哈夫曼编码的功能模块:调用译码的功能模块:调用打印哈夫曼树的功能模块。在屏幕上显示哈夫曼树(用凹入法表示)。 打印编码规则:六、 程序代码/ HUFF.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#includeusing namespace std;const int MAXBIT=100;const int MAXVALUE=2000;cons
7、t int MAXNODE=100;struct HNodeTypechar data;int weight;int parent;int lchild;int rchild;int level;struct HCodeTypeint bitMAXBIT;int start;static int n;static HNodeType *HuffNode;static HCodeType *HuffCode;/字符和权值的输入及建立哈夫曼树模块*HNodeType *huffmanTree()cout请输入字符总数:n;HuffNode=new HNodeType2*n-1;int i,j;in
8、t m1,m2,x1,x2;/初始化for(i=0;i2*n-1;i+) HuffNodei.level=1;HuffNodei.data=0;HuffNodei.weight=0;HuffNodei.parent=-1;HuffNodei.lchild=-1;HuffNodei.rchild=-1;/输入字符及权值cout请输入字符(可以识别空格,两个非空格字符之间请不要再加空格):endl;cout形如:(a bc),( abb c)endl;char c;flushall();for(i=0;in;i+)cin.get(c);HuffNodei.data=c;cout字符对应的叶子结点的
9、权值:endl;for(i=0;iHuffNodei.weight;/建立哈夫曼树for(i=0;in-1;i+)m1=m2=MAXVALUE;x1=x2=0;for(j=0;jn+i;j+)if(HuffNodej.parent=-1&HuffNodej.weightm1)m2=m1;x2=x1;m1=HuffNodej.weight;x1=j;elseif(HuffNodej.parent=-1&HuffNodej.weightm2)m2=HuffNodej.weight; x2=j; HuffNodex1.level=n-i;HuffNodex2.level=n-i;/结点在哈夫曼树的层
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼编 译码 系统 实验 报告
