哈夫曼树和哈夫曼编码(数据结构程序设计)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
(数据结构)
哈夫曼树和哈夫曼编码
二○○九年六月二十六日课程设计任务书及成绩评定
课题名称表达式求值哈夫曼树和哈夫曼编码
Ⅰ、题目的目的和要求:
巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
Ⅱ、设计进度及完成情况
Ⅲ、主要参考文献及资料
[1] 严蔚敏数据结构(C语言版)清华大学出版社 1999
[2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999
[3] 谭浩强 C语言程序设计清华大学出版社
[4] 与所用编程环境相配套的C语言或C++相关的资料
Ⅳ、成绩评定:
设计成绩:(教师填写)
指导老师:(签字)
二○○九年六月二十六日
目录
第一章概述 (1)
第二章系统分析 (2)
第三章概要设计 (3)
第四章详细设计及实现代码 (8)
第五章调试过程中的问题及系统测试情况 (12)
第六章结束语 (13)
参考文献 (13)
第一章概述
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是表达式求值和哈夫曼树及哈夫曼编码。这里我们介绍一种简单直观、广为使用的算法,通常称为“算符优先法”。哈夫曼树又称最优树,是一类带权路径长度最短的树,有着广泛的应用。
功能:表达式求值以栈为存储结构,实现输入的表达式的求值;
哈夫曼树和哈夫曼编码是实现最优二叉树的构造,并能通过最优二叉树进行编码,应用到电文中,并以此来译码。
利用键盘,输入相应的数值,通过程序实现表达式的求值;再利用键盘,输入各个顶点,通过程序构造最优二叉树以及为此编码。
第二章系统分析
一、表达式求值
根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式所有指数不相同的项,则分别复抄到“和多项式”中去。
在此,安装上述抽象数据类型Polynomial中基本操作的定义,“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:假设指着qa和qb分别指向多项式A和多项式B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:①指针qa所指结点的指数值<指针qb所指结点的指数值,则应摘取qa指针所指结点插入到“和多项式”链表中去;②指针qa所指结点的指数值>指针qb所指结点的指数值,则应摘取指针qb所指结点插入到“和多项式”链表中去;③指针qa所指结点的指数值=指针qb所指结点的指数值,则将两个结点中的系数相加,若和数不为零,则修改qa所指结点的系数值,同时释放qb 所指结点;反之,从多项式A的链表中删除相应结点,并释放指针qa和qb所指结点。
二、哈夫曼树和哈夫曼编码
建立哈夫曼树的算法思想是:
1)根据给定的几个权值{w1,w2,……,w n}构成n颗二叉树的集合F={T1,T2,……,
T n},其中每颗二叉树T i中只有一个带权为w i的根结点,其左右子树均空。
2)在F中选取两棵根结点的权值最小作为左右子树构造一棵新的二叉树,且置新的二
叉树的根结点的权值为其左、右子树上根结点的权值之和。
3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
4)重复(2)和(3),直到F只含一棵树为止。这棵树便是哈夫曼树。
第三章概要设计
Ⅰ.以下算法描述了这个求值过程:
int cmp(term a, term b);
//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0、+1
void CreatPolyn(polynomail&p,int m){
//输入m项的系数和指数,建立表示一元多项式的有序链表p
InitList(p); h =GetHead(p);
e.coef =0.0; e.expn = -1; SetCurElem(h,e); //设置头结点的数据元素
for (i=1; i<=m ; ++i){ //依次输入m个非零项
scanf (e.coef, e.expn);
if (!LocateElem(P,e,q(*cmp)())){ //当前链表中不存在该指数项
if(MakeNode(s,e)) InsFirst(q,s); //生成结点并插入链表
}
} } //CreatPolyn
void AddPolyn(polynomai &Pa, polynomai &Pb){
//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”。
ha =GetHead(Pa); hb =GetHead(Pb);//ha 和hb分别指向Pa和Pb中当前结点while(qa&&qb){//qa和qb均非空
a=GetCurElem(qa); b=GetCurElem(qb);//a和b为两表中当前比较元素switch(*cmp(a,b)) {
case -1://多项式PA中当前结点的指数值小
ha=qa; qa=NextPos(pa,qa);break;
case 0: //两者的指数值相等
sum=a.coef+b.coef;
if(sum!=0.0){//修改多项式PA中当前结点的系数值
SetCurElem(qa,sum);ha=qa;}
else{// 删除多项式PA中当前结点
DelFirst(ha,qa); FreeNode(qa);}
DelFirst(hb,qb); FreeNode(qb); qb=NextPos(Pb,hb);
qa=NextPos(Pa,ha);break;
case 1: //多项式PB中当前结点的指数值小
DelFirst(hb,qb); InsFirst(ha,qb);
qb=Nextpos(Pb,hb); ha=NextPos(Pa,ha);break;
}//switch
}//while
if(!ListEmpty(Pb)) Append(Pa,qb); //链接pb中剩余结点
FreeNode(Pb): //释放Pb的头结点
}//AddPolyn
Ⅱ.哈夫曼树及哈夫曼编码
ADT BinaryTree{
数据对象:D是具有相同特性的数据元素的集合。
数据关系:R:
若D=Φ,则R=Φ,称BinaryTree为空二叉树;