数据结构课程教学设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告题目:哈夫曼树和编码应用
学生姓名:
学号:
班级:
指导教师:
2011年 6 月3日
目录
●课程设计目的------------------------3 ●课程设计题目------------------------3 ●需求分析----------------------------4 ●设计原理----------------------------4 ●系统功能框架图----------------------5
●流程图------------------------------6
●设计思路----------------------------7
1.主函数
2.创建哈夫曼树
3.输出哈夫曼树
4.对哈夫曼树进行编码
5.译码
●程序源代码--------------------------8 ●运行结果----------------------------13 ●实验心得----------------------------21
一、课程设计目的
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
二、课程设计题目--哈夫曼树和编码应用
(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树的存储结构;
(2)利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对给定的n个字符正文进行编码,并输出每个字符的编码。
(3)利用已建好的哈夫曼树,对给定的一个哈夫曼编码进行译码,判断此编码对应的字符序列,并输出结果。
三、需求分析
1、利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。本次设计就是为这样的信息收发站写的一个哈夫曼的编/译码器。
本实验要求:
2、本演示程序中,用户可以输入键盘中的任意字符,长度为任意长,字符输入顺序不限,且允许出现重码
3、演示程序以用户与计算机的对话方式执行,即在计算机终端上显示“提示信息”
之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据(可虑去输入中的非法字符)和运算结果显示在其后。
4、在本系统中,用户可以对任意字符串进行编码/译码。
5、程序执行的命令包括:
1) 创建哈弗曼树
2) 输出哈夫曼树
3) 对哈夫曼树进行编码
4) 输出哈弗曼编码
5) 译码
6) 退出(Q)
6、测试数据:
(1)利用教科书例6-31中的数据调试程序。
(2)权值:1、3、5、7
四、设计原理
将建立哈夫曼树、实现哈弗曼编码、哈弗曼译码都定义成类成员函数,然后在主函数中调用它们。
建立哈夫曼树时,将哈夫曼树的结构定义为一个类的一维数组,类成员为权值、双亲、左孩子、右孩子、字符、编码、编码开始的位置,还有各项功能函数。用一个数组类hftree[ ]存储。
要实现哈夫曼编码,只要在所创建的哈夫曼树上进行二进制编码:往左走,编码为0,往右走编码为1,然后将从根结点到树叶的所有0、1排列起来,则得到该树叶的哈弗曼编码。用一个数组类code[ ]存储
哈夫曼译码,就是将输入的编码还原成对应的字符。
五、系统功能框架图
程序流程图:
六、设计思路:
根据题目的要求,在这个程序的设计中,我们要创建哈夫曼树,还要对哈夫曼树进行编码和译码,所以我运用了类,类的成员函数有结点的双亲结点,左、右孩子结点,权值,数据,编码和各种功能函数。然后运用所学的数据结构中的有关哈夫曼树的知识完成该程序的设计。
●主函数
用while函数实现窗口选择界面的循环。再构建一个switch的选择,根据用户对功能的需要,进入具有不同功能的函数,每一个case选择后都以break跳出。
最后当输入字符为6时结束,while的界面循环。结束程序。
●创建哈夫曼树
输入权值、字符之后,因为分左右孩子,所以定义整型变量p1,p2分别指向两个权值最小位置,定义整型变量s1,s2分别代表两个最小权值。利用for循环选择没有双亲结点的权值与最小权值s1进行比较,如果小于s1,则将其权值赋予s1,位置为p1;如果大于s1,小于s2,则将其权值赋予s2,位置为p2;如果大于s2,则重新选择。
当所有的位置确定之后,将左右孩子依次进行合并。哈夫曼树创建成功。
●输出哈夫曼树
利用一个for循环,将所创建的哈夫曼树的所有权值、双亲、左孩子、右孩子全部输出就输出了一个哈夫曼树。
●对哈夫曼树进行编码
在所创建的哈夫曼树上进行二进制编码:是其双亲的左孩子,编码为0;是其双亲的右孩子,编码为1;然后将从根结点到树叶的所有0、1排列起来,则得到该树叶的哈弗曼编码。
●输出哈弗曼编码
利用一个for循环,将所创建的哈夫曼树的字符、权值所对应的哈弗曼二进制编码输出。
●译码
用while循环输入二进制编码,以3结束。找到二进制编码所对应的结点在哈夫曼树中对应的位置,输出该位置的字符。这就是二进制编码的译码。
七、程序源代码
#include
#include
#include
#include
#include
#include
class tree
{public:
float weight; //权值
int parent,lchild,rchild; //双亲结点,左、右孩子结点
int bit[99]; //编码的存放位置
int start; //编码开始的位置
char data; //字符内容