应用数据结构课程设计(哈夫曼树).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《应用数据结构课程设计(哈夫曼树).doc》由会员分享,可在线阅读,更多相关《应用数据结构课程设计(哈夫曼树).doc(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 学 号: 17课 程 设 计题 目Huffman编译码器学 院管理学院专 业信息管理与信息系统班 级0801姓 名王涛指导教师燕翔2010年07月09日课程设计任务书学生姓名: 王涛 专业班级: 信管0801 指导教师: 燕翔 工作单位: 管理学院 题 目: Huffman编译码器初始条件:利用Huffman编码进行通信可以大大提高信道利用率缩短信息传输时间,降低传输成本,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编译码系统。试为这样的信息收发站写一个Huffman码的编译码系统。要求
2、完成的主要任务: (包括课程设计工作量及其技术要求、说明书撰写等具体要求)一个完整的系统应具有以下功能:(l)I:初始化。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。(2)E:编码。利用已建好的Huffman树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)D:译码。利用已建好的Huffman树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。(4)P:印代码文件。将文件CodeFile以紧凑格式显示在终端上,每行50 个代码。(5)T:印哈
3、夫曼树。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。时间安排:序号设计内容所用时间1问题分析和任务定义0.5天2数据类型和系统设计0.5天3编码实现和静态检查3天4上机准备和上机调试2天5总结和整理设计报告1天合 计7天指导教师签名: 2010年 07月02日系主任(或责任教师)签名: 2010年 07月02日1. 需求分析1.1 程序的任务:利用Huffman编码进行通信可以大大提高信道利用率缩短信息传输时间,降低传输成本,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于
4、双工信道(即可以双向传输信息的信道),每端都需要一个完整的编译码系统。此程序就是为这样的信息收发站写一个Huffman码的编译码系统。1.2 程序的输入和输出:从终端读入字符集大小n,以及n个字符及各个字符的权值,建立赫夫曼树,并将它存储到文件hfmTree中;利用已建好的赫夫曼树将文件中的字符编码,如果赫夫曼树不在内存中,则从文件hfmTree中读取到内存;将译得的代码存到文件CodeFile中;利用已建好的赫夫曼树对CodeFile中的代码进行译码,将结果存入文件TextFile中;最后将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件Tr
5、eePrint中。1.3 程序要达到的功能:用户可以利用菜单根据自己的需要来选择要进行编码或是译码,并将转换好的字符或编码以文件的形式存到相应的文件里面。1.4 测试数据如下表:(l)利用教材中的数据调试程序。(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:THIS PROGRAM IS MY FAVORITE。字符 ABCDEFGHIJKLMNOPQRSTUVWXYZ频度18664132232103211547571532205763151485180238181161 选择E,输入THIS PROGRAM IS MY FAVORITE,屏幕上显示同时文
6、件codefile里面也出现相应的代码选择D,从codefile中调入代码,终端显示THIS PROGRAM IS MY FAVORITE,并且文件textfile中也相应的存入了这段话。选择P,文件CodeFile以紧凑格式显示在终端上。选择T,将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。选择其他的字母,将出现出错提示,并重新回到选择菜单。2. 概要设计ADT BinaryTree数据对象D:D是具有相同特性的数据元素集合。数据关系R:若D为空,则R为空,称Huffmantree为空霍夫曼树; 若D不为空,则R=H
7、,H是如下的二元关系:1、 H满足二叉树的所有要求;2、 H中所有数乘以该数所在节点的深度值之后和最小。基本操作P: InputHuffman(Huffman Hfm) 操作结果:输入并存储字符和相应权值。Select(HuffmanTree HT,int end,int *s1,int *s2)初始条件:频率数组已经建立。操作结果:选择HT1.i-1中无双亲且权值最小的两个节点,其序号为s1,s2。HuffmanCoding(Huffman Hfm)初始条件:频率数组已经建立。操作结果:w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的构造赫夫曼编码HC。 InitHuffma
8、n(Huffman Hfm) 初始条件:频率数组已经建立。 操作结果:要求用户输入字符和相应权值,初始化赫夫曼数 Encoding(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作结果:利用已建好的Huffman树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 Decoding(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作结果:利用已建好的Huffman树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 Print(Huf
9、fman Hfm) 初始条件:霍夫曼树HoffmanTree已经存在。 操作结果:将文件CodeFile以紧凑格式显示在终端上,每行50 个代码。 Treeprint(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作结果:将已在内存中的哈夫曼树以凹入表的形式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。ADT HuffmanTree2. 2 主程序流程Void main() 显示菜单; Switch(k) I:初始化E:编码D:译码P:印代码文件T:印哈夫曼树Q:退出运行 2.3 程序调用模块 Main函数 InitHuffmanEnc
10、odingDecodingPrintTreeprintQuit3. 详细设计3.1数据类型: typedef char *HuffmanCode;/动态分配数组存储霍夫曼表码表typedef struct unsigned int weight; unsigned int parent,lchild,rchild;HTNode,*HuffmanTree;/动态分配数组存储霍夫曼树typedef struct HuffmanTree HT; char *c; int length; HuffmanCode HC;Huffman;/分配数组存储字符串及其对应的霍夫曼树Huffman Hfm;cha
11、r k; /*控制循环的标志*/3.2 伪码算法:主程序main()InitHuffman(Huffman Hfm);Encoding(Huffman Hfm);Decoding(Huffman Hfm);Print(Huffman Hfm);Treeprint(Huffman Hfm);其他模块:void Select(HuffmanTree HT,int end,int *s1,int *s2)/选择HT1.i-1中无双亲且权值最小的两个节点,其序号为s1,s2 FOR (i=1;i*s1 IF(HTi.parent是次最小的) THEN HTi.parent*s2 Huffman Huf
12、fmanCoding(Huffman Hfm) /w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的构造赫夫曼编码HC FOR(i=n+1;i=2*n-1;+i) /选择HT1.i-1中无双亲且权值最小的两个节点,其序号为s1,s2 Select(Hfm.HT,i-1,&s1,&s2); 修改父亲位置; 修改孩子位置; 父亲结点权值为左右孩子权值之和; /从叶子结点到根逆向求每个字符的赫夫曼编码 FOR(i=1;i=n;+i)/逐个字符求赫夫曼编码 start=n-1;/编码结束符位置for(c=i,f=Hfm.HTi.parent;f!=0;c=f,f=Hfm.HTf.pare
13、nt)/从叶子到根逆向求编码 IF(c=Hfm.HTf.lchild) cd-start=0; ELSE cd-start=1; 再从cd复制编码到Hfm.HC RETURN Hfm;Huffman InitHuffman(Huffman Hfm)/初始化赫夫曼数,要求用户输入字符和相应权值 对文件hfmTree以读文本的形式打开 IF(fp=NULL) 调用InputHuffman函数,用户输入字符和相应权值存入赫夫曼数中 ELSE输出The Huffmantree has already existed!nPlease choose again!nn);读入hfmTree中文本 FOR(i
14、=1;i=n;i+) 作为独立结点对结点的parent,lchild,rchild分别赋值0FOR(;i=2*n-1;+i) 作为独立结点对结点的weight,parent,lchild,rchild分别赋值0 Hfm=HuffmanCoding(Hfm); RETURN Hfm;void Encoding(Huffman Hfm)/利用已建好的Huffman树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 输出nn*Encoding*nn IF(ffp=fopen(ToBeTran,rt)=NULL) 提示输入Pl
15、ease input the sentence: scanf(%s,ch); printf(n); 以写文本的形式打开CodeFile ELSE 读入ToBeTran文件中的字符; WHILE(chj) FOR(i=1;i0,rchild1来输出 入到文件TextFile中 关闭文件void Print(Huffman Hfm)/将文件CodeFile以紧凑格式,示在终端上,每行50 个代码。 FOR(i=1;i=n;i+) 输出Hfm.ci 输出Hfm.HTi.weight 以只读二进制的方式打开CodeFile文件 while ( feof(fprint)=0 ) 逐个输出 IF (m%5
16、0=0) 输出n 关闭文件void Treeprint(Huffman Hfm)/将已在内存中的哈夫曼树以凹入表的形式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。打开hfmTree文件 将字符及其对应的代码赋给变量Hfm.ci和Hfm.cij 输出Hfm.ci,对Hfm.cij进行判断,不是n则输出*,否则停止输出 3.3函数调用关系图InputHuffman(Huffman Hfm)接收数据Select()供HuffmanCoding()调用调用HuffmanCoding()构造哈夫曼树编码调用Encoding()译码调用Decoding()打印编码Print()打
17、印哈夫曼树Treeprint()InitHuffman(Huffman Hfm)初始化4. 调试分析4.1 调试过程中遇到的问题: 第一个问题是一直比较棘手的问题就是文件的调用与写入,因为文件方面的知识一直就掌握的不是很好,在写代码时产生很大困难,所以在解决这个问题的时候我把文件部分系统的看了一下,这才从自身角度解决了这个问题。而实际中遇到的问题就是如何判断已经有了hfmtree这个文件,并且怎么调用到内存中来。解决方案:设置一个全局结构体变量来存放已经在文件中存放的霍夫曼树。第二个问题是关于界面的美观设计方面,因为很多代码在文本中编辑时是比较整齐美观的,但是在程序运行中却出现很多问题,不对齐
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 数据结构 课程设计 哈夫曼树
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内