- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构 实验报告四 赫夫曼编码的应用
实验课程名称 数据结构课程设计
专 业 班 级
学 生 姓 名
学 号
指 导 教 师
2012 至 2013 学年第 一 学期第 1 至 18 周
目录
一、 概 述 2
1.1课程设计的背景 2
1.2 赫夫曼树 2
1.3 课程设计目的 2
二、系统分析 3
2.1 课程设计的主要内容 3
2.2功能设计 3
三、概要设计 4
3.1 设计思想 4
3.2 函数间的关系 4
四、详细设计 5
五、运行于测试 8
六、总结与心得 11
附录:程序代码 12
试验题目:赫夫曼编码的应用
一、 概 述
1.1课程设计的背景
当下,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络传送时间已越来越引起人们的重视,赫夫曼编码正是一种运用广泛且非常有效的数据压缩技术。
1.2 赫夫曼树
赫夫曼编码就是利用赫夫曼树求得用于通信的二进制编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示为“0码”,指向右子树的分支表示为“1”码,取每条路径上的“0”和“1”的序列作为和各个叶子对应的字符的编码,这就是所谓的赫夫曼编码。
1.3 课程设计目的
本试验就是通过先建立赫夫曼树,然后利用建好的赫夫曼树生成赫夫曼编码后进行译码。
二、系统分析
2.1 课程设计的主要内容
本实验要求完成发送端对等待传送数据的编码和接收端对传送来的数据的译码。要实现五个功能:接受原始数据、编码、译码、输出编码、译码存档。通过系统的提示要建立赫夫曼树并对载入的原文件进行编码,并保存到txtfile.tet文件中,同时输出到屏幕。最后将建立的赫夫曼树用某种的存储方式存储后输出。
2.2功能设计
(1)初始化(initialization) 从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树。并将它存放于文件htmtree.tx中。
(2)编 码(encoding) 利用已经建立好的赫夫曼树(如不在内存,则从文件hfmtree.txe中读入,对文件tobetree.txt中的正文进行编码。然后将结果存在文件codefile.txt中。
(3)译 码(decoding) 利用已经建立好的赫夫曼树将文件codefile.txt中的代码进行译码,将结果存入文件textfile.txt中。
(4)输出译码(print) 将文件codefile.txt以紧凑格式显示在终端上。同时将字符型式写入到文件codeprint.txt中。
(5)显示赫夫曼树(treeprint) 将已经在内存中的赫夫曼树以直观的方式显示在屏幕上,同时将此字符型的赫夫曼树写入文件treeprint.txt中。
三、概要设计
3.1 设计思想
赫夫曼树用邻接矩阵来作为存储结构,借助静态链表来实现遍历。
3.2 函数间的关系
四、详细设计
1.赫夫曼树的抽象数据类型定义
ADT HuffmanCoding{
数据对象 T:具有相同特征的数据元素的集合
数据关系 R:满足最优二叉树的关系
基本操作 P:
Init (t)
操作结果:构造一个空赫夫曼树t。
Encode()
操作结果:利用赫夫曼树进行编码
Decode()
操作结果:利用赫夫曼进行译码
}
2.主函数
void mian()
{打印表头:
while(选择选项不为0)
{输入选项:
switch(选择项)
{
case 1:初始化;break;
case 2:输入编码字符;break;
case 3:编码字符;break;
case 4:译码操作;break;
case 5:输出译码;break;
case 6:显示赫夫曼树;break;
default :输入错误,重新选择;
}
3.求赫夫曼编码
if(t[j].weightkt[j].parent==0)
k=t[j].weight,flag=j; //flag为标志符,为不小于可能的值
t[flag].parent=1;
4.新建赫夫曼树
HT[s1].parent=HT[s2].parent=i;//将选好的两个结点设置成有同一个双亲结点 HT[i].lchild=s1;//左孩子的权值
HT[i].rc
文档评论(0)