哈夫曼编译码器课程设计报告.doc_第1页
哈夫曼编译码器课程设计报告.doc_第2页
哈夫曼编译码器课程设计报告.doc_第3页
哈夫曼编译码器课程设计报告.doc_第4页
哈夫曼编译码器课程设计报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机学院 数据结构课程设计报告学号2015-2016学年 第1学期1508数据结构课程设计报告题目:哈夫曼编/译码器专业:计算机科学与技术(对口)班级:13(3)姓名:陈霞指导教师:彭飞成绩:计算机学院2015年11月12日目录1设计内容及要求31.1 内容31.2 要求32概要设计42.1抽象数据类型定义42.2模块划分43设计过程及代码53.1设计过程53.2代码74设计结果与分析105参考文献121 设计内容及要求1.1 内容利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。1.2 要求一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和 n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件 htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 (4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 (5)T:印哈夫曼树(TreePrinting)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。测试数据 (1)数据一:已知某系统在通信联络中只可能出现8种字符,其概率分别为 0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,以此设计哈夫曼编码。利用此数据对程序 进行调试。 (2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“ THISPROGRAMISMYFAVORITE”。字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度57631514851802381811612 概要设计2.1 抽象数据类型定义ADTStack 数据对象:D=ai|aiElemSet,i=1,2,.,n,n0数据关系:若D为空集,则称为空树。 若D仅为一个数据元素,则R为空集,否则R=H,H是如下的二元关 系: (1)再D中存在唯一的称为根的数据元素root,它在关系H下无前驱。(2)若D-root空集,则存在一个划分D1,D2,Dm(m0)。(3)对应于D-root的划分,H-root,X1,有唯一的一个划分H1,H2,Hm(m0)。 基本操作: InitTree(&T) 操作结果:构造空树T。DestroyTree(&T) 初始条件:树T已存在。操作结果:树T被销毁。ClearTree(&T) 初始条件:树T已存在。操作结果:将树T清为空栈。 TreeEmpty(T) 初始条件:树T已存在。 操作结果:若树T为空,则返回TRUE,否则FALSE。 TreeDepth(T) 初始条件:树T已存在。操作结果:返回T的深度。 Root(T) 初始条件:树T已存在。 操作结果:返回树T的根。2.2 模块划分本程序包括三个模块:(1)主程序模块 voidmain() 初始化;构造哈夫曼树;求哈夫曼编码; 哈夫曼编码输出; (2)哈夫曼模块实现哈夫曼树的抽象数据类型 (3)求哈夫曼编码模块实现求哈夫曼编码算法的数据类型3 设计过程及代码3.1 设计过程1、 数据类型的定义 (1) 哈夫曼树类型 typedefstruct/构造树chardata;/结点权值intweight;/权重intparent;/双亲结点intlchild;/左孩子intrchild;/右孩子HTNode;HTNodeht30; (2) 求哈夫曼编码类型 typedefstruct charcd30;/存放当前结点的哈弗曼编码intstart;/cdstartcdn存放哈弗曼码HCode;HCodehcd30;2、主要模块的算法描述开始Int I;inScanf(“%d”,&htt.wei+结束Int I,f,c;I=0InHc.start=n;c=iF!=-1multiplexHc.start+;I+主函数流程图图3.1.1哈弗曼编码算法流程图图3.1.23.2 代码#include #definen27/叶子数目 #definem(2*n-1)/结点总数#definemaxval10000.0 #definemaxsize100/哈夫曼编码的最大位数typedefstruct charch;floatweight; intlchild,rchild,parent;hufmtree;typedefstruct charbitsn;/位串 intstart;/编码在位串中的起始位置charch;/字符codetype;voidhuffman(hufmtreetree);/建立哈夫曼树 voidhuffmancode(codetypecode,hufmtreetree);/根据哈夫曼树求出哈夫曼编码voiddecode(hufmtreetree);/依次读入字符,根据哈夫曼树译码 int main() printf( 哈夫曼编码n);printf(总共有%d个字符n,n);hufmtreetreem; codetypecoden; inti,j;/循环变量 huffman(tree);/建立哈夫曼树 huffmancode(code,tree);/根据哈夫曼树求出哈夫曼编码printf(【输出每个字符的哈夫曼编码】n); for(i=0;in;i+) printf(%c:,codei.ch);for(j=codei.start;jn;j+) printf(%c,codei.bitsj);printf(n); printf(【读入字符,并进行译码】n); decode(tree);/依次读入电文,根据哈夫曼树译码 voidhuffman(hufmtreetree)/建立哈夫曼树inti,j,p1,p2;/p1,p2分别记住每次合并时权值最小和次小的两个根结点的下标 floatsmall1,small2,f;charc; for(i=0;im;i+)/初始化 treei.parent=0; treei.lchild=-1;treei.rchild=-1;treei.weight=0.0; printf(【依次读入前%d个结点的字符及权值(中间用空格隔开)】n,n); for(i=0;in;i+)/读入前n个结点的字符及权值 printf(输入第%d个字符为和权值,i+1); scanf(%c%f,&c,&f); getchar(); treei.ch=c; treei.weight=f; for(i=n;im;i+)/进行n-1次合并,产生n-1个新结点 p1=0;p2=0;small1=maxval;small2=maxval;/maxval是float类型的最大值for(j=0;ji;j+)/选出两个权值最小的根结点if(treej.parent=0) if(treej.weightsmall1) small2=small1;/改变最小权、次小权及对应的位置 small1=treej.weight;p2=p1;p1=j;else if(treej.weightsmall2) small2=treej.weight;/改变次小权及位置 p2=j; treep1.parent=i;treep2.parent=i; treei.lchild=p1;/最小权根结点是新结点的左孩子treei.rchild=p2;/次小权根结点是新结点的右孩子treei.weight=treep1.weight+treep2.weight; /huffman voidhuffmancode(codetypecode,hufmtreetree)/根据哈夫曼树求出哈夫曼编码/codetypecode为求出的哈夫曼编码/hufmtreetree为已知的哈夫曼树inti,c,p; codetypecd;/缓冲变量for(i=0;in;i+) cd.start=n; cd.ch=treei.ch; c=i;/从叶结点出发向上回溯 p=treei.parent;/treep是treei的双亲while(p!=0) cd.start-; if(treep.lchild=c) cd.bitscd.start=0;/treei是左子树,生成代码0else cd.bitscd.start=1;/treei是右子树,生成代码1 c=p; p=treep.parent; codei=cd;/第i+1个字符的编码存入codei /huffmancode voiddecode(hufmtreetree)/依次读入字符,根据哈夫曼树译码 inti,j=0; charbmaxsize; charendflag=2;/电文结束标志取2 i=m-1;/从根结点开始往下搜索printf(输入发送的编码(以2为结束标志):);gets(b); printf(译码后的字符为);while(bj!=2) if(bj=0) i=treei.lchild;/走向左孩子else i=treei.rchild;/走向右孩子 if(treei.lchild=-1)/treei是叶结点 printf(%c,tr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论