课程设计哈夫曼树.docx
- 文档编号:8703453
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:98.79KB
课程设计哈夫曼树.docx
《课程设计哈夫曼树.docx》由会员分享,可在线阅读,更多相关《课程设计哈夫曼树.docx(18页珍藏版)》请在冰豆网上搜索。
课程设计哈夫曼树
计算机学院信息管理与信息系统专业
数据结构课程设计
题目:
哈夫曼树的应用
班级:
姓名:
学号:
同组人姓名:
起迄日期:
课程设计地点:
指导教师:
评阅意见:
成绩评定:
评阅人:
日期:
完成日期:
目录
1、设计目的3
2、需求分析3
2.1选题的意义及背景3
2.2输入/输出形式和输出值的范围4
3、概要设计4
3.1设计思想4
3.2函数间的关系4
4、详细设计4
4.1哈夫曼的主要结构4
4.1.1结构定义4
4.1.2主要函数声明及功能描述5
4.2源程序6
4.2.1头文件6
4.2.2源文件7
5、程序测试结果15
6、总结16
7、参考文献16
1.设计目的
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:
数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
1、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2、需求分析
2.1选题的意义及背景
锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。
在信息传递时,希望长度能尽可能短,即采用最短码。
赫夫曼编码的应用,就是采用这种有效的数据压缩技术可以节省数据文件的存储空间和计算机网络的传送时间。
2.2输入/输出形式和输出值的范围
输入信息以加载存档的reading.txt文件为方式,加载不成功,提示出错信息,加载成功后,系统对其编码,并按照选择对各种相关信息存档
3.概要设计
3.1设计思想
哈夫曼树用邻接矩阵作为存储结构,借助静态链表来实现遍历。
3.2函数间的关系
哈夫曼系统,函数间的关系如图所示:
3-1哈夫曼编码问题中函数间的关系
4、详细设计
4.1哈夫曼的主要结构
4.1.1结构定义:
#defineMAXVALUE1000//定义最大权值
#defineMAXBIT100//定义哈夫曼树中叶子结点个数
typedefstruct
{chardata;//字符值
intnum;//某个值的字符出现的次数
}TotalNode;//统计结点,包括字符种类和出现次数
typedefstruct
{
TotalNodetot[300];//统计结点数组
intnum;//统计数组中含有的字符个数
}Total;//统计结构体,包括统计数组和字符种类数
typedefstruct
{charmes[300];//字符数组
intnum;//总字符数
}Message;//信息结构体,包括字符数组和总字符数
typedefstruct
{intlocked[500];//密码数组
intnum;//密码总数
}Locking;//哈夫曼编码后的密文信息
typedefstruct
{chardata;//字符
intweight;//权值
intparent;//双亲结点在数组HuffNode[]中的序号
intlchild;//左孩子结点在数组HuffNode[]中的序号
intrchild;//右孩子结点在数组HuffNode[]中的序号
}HNodetype;//哈夫曼树结点类型,包括左右孩子,权值和信息
typedefstruct
{intbit[MAXBIT];
intstart;
}HCodetype;//哈夫曼编码结构体,包括编码数组和起始位
4.1.2主要函数声明及功能描述如下:
voidreading_file(Message*message);从文件中读取信息
voidwriting_file(Message*message);将信息写进文件
voidtotal_message(Message*message,Total*total);
统计信息中各字符的出现次数
voidHaffmanTree(Total*total,HNodetypeHuffNode[]);
voidHaffmanCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);
voidwriting_HCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);
voidlock(Message*message,HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total,Locking*locking);
voidwriting_lock(Locking*locking);
voidwriting_translate(Locking*locking,HCodetypeHuffCode[],HNodetypeHuffNode[],Total*total);
4.2源程序
4.2.1头文件head.h
#defineMAXVALUE1000//定义最大权值
#defineMAXBIT100//定义哈夫曼树中叶子结点个数
typedefstruct
{chardata;//字符值
intnum;//某个值的字符出现的次数
}TotalNode;//统计结点,包括字符种类和出现次数
typedefstruct
{TotalNodetot[300];//统计结点数组
intnum;//统计数组中含有的字符个数
}Total;//统计结构体,包括统计数组和字符种类数
typedefstruct
{charmes[300];//字符数组
intnum;//总字符数
}Message;//信息结构体,包括字符数组和总字符数
typedefstruct
{intlocked[500];//密码数组
intnum;//密码总数
}Locking;//哈夫曼编码后的密文信息
typedefstruct
{chardata;//字符
intweight;//权值
intparent;//双亲结点在数组HuffNode[]中的序号
intlchild;//左孩子结点在数组HuffNode[]中的序号
intrchild;//右孩子结点在数组HuffNode[]中的序号
}HNodetype;
//哈夫曼树结点类型,包括左右孩子,权值和信息
typedefstruct
{intbit[MAXBIT];
intstart;
}HCodetype;//哈夫曼编码结构体,包括编码数组和起始位
/*将运用到的函数一一列出,以便在编写程序时进行查找*/
voidreading_file(Message*message);
//从文件中读取信息
voidwriting_file(Message*message);
//将信息写进文件
voidtotal_message(Message*message,Total*total);
//统计信息中各字符的次数
voidHaffmanTree(Total*total,HNodetypeHuffNode[]);
voidHaffmanCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);
voidwriting_HCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);
voidlock(Message*message,HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total,Locking*locking);
voidwriting_lock(Locking*locking);
voidwriting_translate(Locking*locking,HCodetypeHuffCode[],HNodetypeHuffNode[],Total*total);
4.2.2源文件source.cpp
#include"head.h"
#include
#include
usingnamespacestd;
intmain()
{inti,j,choice,mark=0;//mark标记文件信息是否读入到内存中
HNodetypeHuffNode[500];//保存哈夫曼树中各结点信息
HCodetypeHuffCode[300];
Locking*locking;
Total*total;
Message*message;
locking=newLocking;
locking->num=0;
total=newTotal;
total->num=0;
message=newMessage;
message->num=0;//初始化变量
while
(1){cout<<"********************************************************************************";
cout<<"*1:
从文件读取信息2:
显示编码规则3:
将原文件信息写进文件*";
cout<<"*4:
将编码规则写进文件5:
将编码后的信息写进文件6:
将译码后的信息写进文件7:
退出*";cout<<"********************************************************************************"< cout<<"请输入操作代码: "; cin>>choice; switch(choice) { case1: reading_file(message);//从文件中读取信息 mark=1; break; case2: //显示编码规则 if(mark==0)cout<<"请先从文件中读取信息! "< else { total_message(message,total);//统计信息中各字符的出现次数 HaffmanTree(total,HuffNode); HaffmanCode(HuffNode,HuffCode,total); for(i=0;i {cout< cout< cout< } } break; case3: //将原文件信息写进文件 if(mark==0)cout<<"请先从文件中读取信息! "< else writing_file(message);//将信息写进文件 break; case4: //将编码规则写进文件 if(mark==0)cout<<"请先从文件中读取信息! "< else {total_message(message,total);//统计信息中各字符的出现次数 HaffmanTree(total,HuffNode);HaffmanCode(HuffNode,HuffCode,total);writing_HCode(HuffNode,HuffCode,total);} break; case5: //将编码后的信息写进文件 if(mark==0)cout<<"请先从文件中读取信息! "< else {total_message(message,total);//统计信息中各字符的出现次数 HaffmanTree(total,HuffNode);HaffmanCode(HuffNode,HuffCode,total);lock(message,HuffNode,HuffCode,total,locking); writing_lock(locking); } break; case6: //将译码后的信息写进文件 if(mark==0)cout<<"请先从文件中读取信息! "< else {total_message(message,total);//统计信息中各字符的出现次数 HaffmanTree(total,HuffNode);//构建哈夫曼树 HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼编码 writing_translate(locking,HuffCode,HuffNode,total);//将已编码信息翻译过来并写进文件 } break; case7: exit (1); default: cout<<"输入错误,请重新选择"< } } for(i=0;i if(locking->locked[i]==-1)cout<<""; else cout< cout< for(i=0;i cout< for(i=0;i<2*(total->num)-1;i++) cout< cout< return0; } /*注意在输入文件信息时要保证格式正确,否则将导致在统计信息时出错,从而影响后续工作的进行*/ voidreading_file(Message*message) {/*打开reading文件,失败则结束。 不断读取字符并保存进message数组中, 直到遇到#结束,记录字符总数*/ inti=0; charch; ifstreaminfile("c: \\reading.txt",ios: : in|ios: : out); if(! infile)//打开失败则结束 {cout<<"打开c: \\reading.txt文件失败"< exit (1); } elsecout<<"读取文件成功"< while(infile.get(ch)&&ch! ='#')//读取字符直到遇到# {message->mes[i]=ch; i++; } message->num=i;//记录总字符数 infile.close();//关闭文件 }//从文件中读取信息 /*运行到此步骤时,系统会自动生成一个文本文档以储存信息*/ voidwriting_file(Message*message)//将信息写进文件 {/*打开writing文件,失败则结束。 将信息写进文件*/ inti; ofstreamoutfile("c: \\writing.txt",ios: : in|ios: : out);//打开文件 if(! outfile)//打开失败则结束 {cout<<"打开c: \\writing.txt文件失败"< exit (1); } for(i=0;i outfile.put(message->mes[i]); cout<<"信息写进文件成功"< outfile.close();//关闭文件 }//将原信息写入文件 voidtotal_message(Message*message,Total*total) {/*将message中的字符种类及出现次数统计保存到total数组中,重复字符用mark标记, 否则新建字符种类。 记录下字符种类的个数*/ inti,j,mark; for(i=0;i { if(message->mes[i]! ='')//字符不为空格时 {mark=0; for(j=0;j //搜索到,则此字符次数加1,mark标志为1 {total->tot[j].num++; mark=1; break; } if(mark==0) //未搜索到,新建字符种类,保存进total中,字符类加1 {total->tot[total->num].data=message->mes[i]; total->tot[total->num].num=1; total->num++; } } } }//统计信息中各字符的出现次数 voidHaffmanTree(Total*total,HNodetypeHuffNode[]) {/*通过每次选取最小和次小两权值建立二叉树,最终构建成哈夫曼树, 且左孩子权值比右孩子小*/ inti,j,min1,min2,x1,x2; for(i=0;i<2*(total->num)-1;i++) //初始化哈夫曼树并存入叶子结点权值和信息 {if(i<=total->num-1)HuffNode[i].data=total->tot[i].data; HuffNode[i].weight=total->tot[i].num; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; } for(i=0;i {min1=min2=MAXVALUE; x1=x2=0; for(j=0;j {if(HuffNode[j].parent==-1&&HuffNode[j].weight {min2=min1; x2=x1; min1=HuffNode[j].weight; x1=j; } else if(HuffNode[j].parent==-1&&HuffNode[j].weight {x2=j; } } HuffNode[x1].parent=total->num+i;//修改亲人结点位置 HuffNode[x2].parent=total->num+i;HuffNode[total->num+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[total->num+i].lchild=x1;//左孩子比右孩子权值小 HuffNode[total->num+i].rchild=x2; } }//构建哈夫曼树 voidHaffmanCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total) {/*在建立的哈夫曼树基础上,左分支为0,右分支为1, 从叶结点向上直到根结点建立哈夫曼编码,并保存每个叶结点起始位*/ inti,j,c,p; HCodetypecd; for(i=0;i {cd.start=total->num-1;//起始位初始化 p=HuffNode[i].parent; c=i; while(p! =-1)//从叶结点向上爬直到到达根结点 {if(HuffNode[p].lchild==c)//左分支则为0 cd.bit[cd.start]=0; else cd.bit[cd.start]=1;//右分支则为1 cd.start--;//起始位向前移动 c=p; p=HuffNode[p].parent; } for(j=cd.start+1;j //保存求出的每个叶结点编码和起始位 HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } }//建立哈夫曼编码 voidwriting_HCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total) {/*打开HCode文件,失败则结束。 将信息写进文件*/ inti,j; ofstreamoutfile("c: \\HCode.txt",ios: : in|ios: : out); if(! outfile)//打开失败则结束 {cout<<"打开c: \\HCode.txt文件失败"< exit (1); } for(i=0;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 哈夫曼树
