数据结构课程设计 哈夫曼编码Word下载.docx
《数据结构课程设计 哈夫曼编码Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 哈夫曼编码Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
设计报告
创新
总分
一、引言
课程意义:
《数据结构》是一门实践性很强的软件基础课程,为了学好这门课,每个学生必须在学习结束时完成一个较综合的实验。
通过本次哈夫曼编码的课程设计,可以加深在数据结构的选择和应用、算法的设计及实现等方面加深对课程基础内容的理解,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
项目意义:
利用哈夫曼树编制哈夫曼编码在数据通讯中有广泛的应用。
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
二、设计过程
1.设计思想:
实现哈夫曼编码的算法可分为两大部分:
1.构造哈夫曼树。
2.在哈夫曼树上求叶子结点的编码。
(在算法中设置一个结构数组HuffmanCode来存放各字符的哈夫曼编码信息。
)
2.功能实现:
实现哈夫曼编码,实质上就是在已建立的哈夫曼树中从叶子节点开始,沿结点的双亲链域回退到根节点,得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根节点到相应叶子结点所经过的路径上各分支所组成的0,1序列,而在建立的哈夫曼树中先得到的分支代码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所求得的0,1序列是所需编码的倒序,之后再将其倒置即可。
3.流程图:
开始
↓
给定字符个数n
输入字符权值
建立哈夫曼树
哈夫曼树求编码
输出哈夫曼树及编码
三、测试及运行结果
⑴.编译中常见错误:
1.字符丢失
①.我们在程序的编译过程中最有可能犯的错误就是字符丢失,比如图中所示:
missing‘;
’before‘}’;
②.这时我们用鼠标双击上述错误,编程界面就会出现一个如上图所示的小光标,意思就是在这个‘}’前面丢失了一个‘;
’,我们根据这个提示来检查很快会发现在‘}’上一行的if语句的句尾丢失了‘;
’,然后我们将错误改正。
③.改正完成后我们就会看到如上图所示的界面,这就表示错误已改正,程序可运行。
2.字母大小写
→
1.有时我们在程序编译过程中并未发现错误,但是一点运行按钮,就会显示有一个错误,这很有可能是字母的大小写问题。
如上图;
2.我们找到错误提示,根据提示我们知道错误出在“CrtHuffmantree”。
然后我们回到源程序检查;
3.通过仔细的检查,我们会发现如上图所示的语句,在这个语句中,“CrtHuffmantree”让我们错打成“crtHuffmantree”,改正后方可运行。
⑵.运行结果演示
1.编译完成后来到运行界面,首先我们先确定字符n的个数,例如:
6个,这时,输入“6”,按回车键;
2.然后我们依次输入这6个字符的权值。
例如我们给定的这六个权值依次为2,4,6,8,10,12.那么就先输入2,按回车;
然后输入4,按回车;
接着输入6,按回车,依此类推,直到输入12,按回车;
3.这样运行的结果就出来了。
四、总结
时光荏苒,转瞬间这个学期数据结构的课程结束了,虽然我对上学期的C语言和本学期的数据结构学习的都不是很透彻,但是通过一个学期的学习仍然让我感到受益匪浅。
数据结构是一门研究非数值计算程序设计问题中计算机的操作对象,以及他们之间的关系和操作的学科。
数据结构是计算机程序设计的重要理论技术基础,是计算机专业的核心课程。
它作为一门难学难懂的学科,一门计算机等级考试必考的学科,学好它是至关重要的。
为了更加透彻的学习好数据结构的有关知识,并将已掌握的知识学以致用,在本学期末,我们进行了为期一周的数据结构课程设计,通过此次课程设计,让我更加扎实的掌握了有关数据结构方面的知识。
在设计过程中虽然我遇到了很多的问题与困难,但是通过老师的指导,向同学们请教,以及自己的思考,最后终于找到了原因的所在,并得到了顺利的解决。
也暴露了前期我在这方面知识的欠缺以及经验的不足。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
这是日后最实用的,以后我们还要面对许多社会的挑战,只有不断的学习、实践,再学习、再实践。
才能得到最后的胜利。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,学会面对需要面对的事情。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
五、参考文献
书籍:
《数据结构(C语言描述)》;
出版社:
中国水利水电出版社;
主编:
马秋菊;
出版日期:
2006年9月。
《大话数据结构》;
清华大学出版社;
程杰;
2011年6月。
《大话设计模式》;
2007年12月。
网站:
;
XX文库
;
XX知道
;
XX百科
搜搜问问
六、附录
#include<
stdio.h>
stdlib.h>
string.h>
typedefchar*HuffmanCode;
//动态分配数组,存储哈夫曼编码
typedefstruct
{
unsignedintweight;
//用来存放各个结点的权值
unsignedintparent,LChild,RChild;
//指向双亲、孩子结点的指针
}HTNode,*HuffmanTree;
//动态分配数组,存储哈夫曼树
//选择两个parent为0,且weight最小的结点s1和s2
voidSelect(HuffmanTree*ht,intn,int*s1,int*s2){
inti,min;
for(i=1;
i<
=n;
i++){
if((*ht)[i].parent==0){
min=i;
break;
}
if((*ht)[i].parent==0){
if((*ht)[i].weight<
(*ht)[min].weight)
*s1=min;
if((*ht)[i].parent==0&
&
i!
=(*s1)){
(*ht)[min].weight)min=i;
*s2=min;
}
//构造哈夫曼树ht。
w存放已知的n个权值
voidCrtHuffmanTree(HuffmanTree*ht,int*w,intn){
intm,i,s1,s2;
m=2*n-1;
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
i++)//1--n号存放叶子结点,初始化
{
(*ht)[i].weight=w[i];
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
for(i=n+1;
=m;
i++){
(*ht)[i].weight=0;
}//非叶子结点初始化
printf("
\n哈夫曼树如下:
\n"
);
i++)//创建非叶子结点,建哈夫曼树
{//在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0
//且weight最小的结点,其序号分别赋值给s1、s2
Select(ht,i-1,&
s1,&
s2);
(*ht)[s1].parent=i;
(*ht)[s2].parent=i;
(*ht)[i].LChild=s1;
(*ht)[i].RChild=s2;
(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
\n%d(%d,%d)\n"
(*ht)[i].weight,(*ht)[s1].weight,(*ht)[s2].weight);
\n"
}//哈夫曼树建立完毕
//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码
voidCrtHuffmanCode(HuffmanTree*ht,HuffmanCode*hc,intn){
char*cd;
inti,start,p;
unsignedintc;
hc=(HuffmanCode*)malloc((n+1)*sizeof(char*));
//分配n个编码的头指针
cd=(char*)malloc(n*sizeof(char));
//分配求当前编码的工作空间
cd[n-1]='
\0'
;
//从右向左逐位存放编码,首先存放编码结束符
i++)//求n个叶子结点对应的哈夫曼编码
start=n-1;
//初始化编码起始指针
for(c=i,p=(*ht)[i].parent;
p!
=0;
c=p,p=(*ht)[p].parent)//从叶子到根结点求编码
if((*ht)[p].LChild==c)cd[--start]='
0'
//左分支标0
elsecd[--start]='
1'
//右分支标1
hc[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个编码分配空间
strcpy(hc[i],&
cd[start]);
free(cd);
i++)
\n第%d个权值为%d的字符是%s\n"
i,(*ht)[i].weight,hc[i]);
voidmain(){
HuffmanTreeHT;
HuffmanCodeHC;
int*w,i,n,wei,m;
\n*#*#*#*#*#*##*#*#*#*#*#*\n"
\n*#*#*#*#*#*#*#*#欢迎来到课程设计之--哈夫曼编码#*#*#*#*#*#*#*#*\n"
\n\n*#*#*#*Areyouready?
?
\n\n*#*#*#*OK,Let'
sGO!
!
\n\n*#*#*#*请您先输入字符个数n:
"
);
scanf("
%d"
&
n);
w=(int*)malloc((n+1)*sizeof(int));
\n*#*#*#*然后分别输入这%d个字符的权值:
n);
i++){
\n*#*#*#*第%d个字符的权值:
i);
fflush(stdin);
wei);
w[i]=wei;
CrtHuffmanTree(&
HT,w,n);
CrtHuffmanCode(&
HT,&
HC,n);