哈夫曼编译码器课程设计报告(共12页).doc

上传人:飞****2 文档编号:5260580 上传时间:2021-12-16 格式:DOC 页数:13 大小:248KB
返回 下载 相关 举报
哈夫曼编译码器课程设计报告(共12页).doc_第1页
第1页 / 共13页
哈夫曼编译码器课程设计报告(共12页).doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《哈夫曼编译码器课程设计报告(共12页).doc》由会员分享,可在线阅读,更多相关《哈夫曼编译码器课程设计报告(共12页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上学号2015-2016学年 第1学期1508数据结构课程设计报告题目:哈夫曼编/译码器专业:计算机科学与技术(对口)班级:13(3)姓名:陈霞指导教师:彭飞成绩:计算机学院2015年11月12日目录1 设计内容及要求1.1 内容利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。1.2 要求一个完整的系统应具有以下功能:

2、60; (1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和 n个权值,建立哈夫曼树,并将它存于文件hfmTree中。  (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件 htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。  (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。  (4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代

3、码。同时将此字符形式的编码写入文件CodePrint中。  (5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。 测试数据    (1)数据一:已知某系统在通信联络中只可能出现8种字符,其概率分别为 0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,以此设计哈夫曼编码。利用此数据对程序 进行调试。  (2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编

4、码和译码:“ THIS PROGRAM IS MY FAVORITE”。字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度57631514851802381811612 概要设计2.1 抽象数据类型定义ADT Stack  数据对象:D=ai|aiElemSet,i=1,2,.,n, n0 数据关系:若D为空集,则称为空树。           

5、;若D仅为一个数据元素,则R为空集,否则R=H,H是如下的二元关 系:  (1)再D中存在唯一的称为根的数据元素root,它在关系H下无前驱。 (2)若D-root<>空集,则存在一个划分D1,D2,···,Dm(m>0)。 (3)对应于D-root的划分,H-<root,X1,···,<root,Xm>有唯一的一个划分H1,H2,···,Hm(m>0)。  基本操作:  InitTree(&T) 

6、; 操作结果:构造空树T。DestroyTree(&T)  初始条件:树T已存在。 操作结果:树T被销毁。 ClearTree(&T)  初始条件:树T已存在。 操作结果:将树T清为空栈。  TreeEmpty(T)  初始条件:树T已存在。  操作结果:若树T为空,则返回TRUE,否则FALSE。  TreeDepth(T)  初始条件:树T已存在。 操作结果:返回T的深度。  Root(T)  初始条件:树T已存在。 操作结果:返回树T的根。2.

7、2 模块划分本程序包括三个模块: (1)主程序模块  void main()  初始化; 构造哈夫曼树; 求哈夫曼编码;  哈夫曼编码输出;    (2)哈夫曼模块实现哈夫曼树的抽象数据类型  (3)求哈夫曼编码模块实现求哈夫曼编码算法的数据类型3 设计过程及代码3.1 设计过程1、 数据类型的定义 (1) 哈夫曼树类型  typedef struct/构造树      char  data;/结

8、点权值      int weight;/权重      int parent;/双亲结点      int lchild;/左孩子      int rchild;/右孩子   HTNode;   HTNode ht30;  (2) 求哈

9、夫曼编码类型  typedef struct       char cd30;/存放当前结点的哈弗曼编码     int start;/cdstartcdn存放哈弗曼码 HCode; HCode hcd30;2、主要模块的算法描述开始Int I;i<nScanf(“%d”,&htt.wei+结束Int I,f,c;I=0I<nHc.start=n;c=iF!=-1multiplexHc.start

10、+;I+主函数流程图图3.1.1哈弗曼编码算法流程图图3.1.23.2 代码#include<stdio.h>  #define n 27  /叶子数目  #define m (2*n-1)    /结点总数#define maxval 10000.0  #define maxsize 100   /哈夫曼编码的最大位数 typedef struct &#

11、160;   char ch;  float weight;    int lchild,rchild,parent; hufmtree; typedef struct    char bitsn;   /位串   int start;      /编码在位串中的起始位置  char ch;

12、0;       /字符 codetype;void huffman(hufmtree tree);/建立哈夫曼树  void huffmancode(codetype code,hufmtree tree);/根据哈夫曼树求出哈夫曼编码 void decode(hufmtree tree);/依次读入字符,根据哈夫曼树译码   int  main()     pri

13、ntf("  哈夫曼编码n");  printf("总共有%d个字符n",n);  hufmtree treem;   codetype coden;   int i,j;/循环变量   huffman(tree);/建立哈夫曼树   huffmancode(code,tree);/根据哈夫曼树求出哈夫曼编码  printf("【输出每个字符的哈夫曼编码】n"

14、;);   for(i=0;i<n;i+)       printf("%c: ",codei.ch);   for(j=codei.start;j<n;j+)     printf("%c ",codei.bitsj);   printf("n");     printf("【读入字符

15、,并进行译码】n");   decode(tree);/依次读入电文,根据哈夫曼树译码    void huffman(hufmtree tree)/建立哈夫曼树 int i,j,p1,p2;/p1,p2分别记住每次合并时权值最小和次小的两个根结点的下标   float small1,small2,f;  char c;   for(i=0;i<m;i+)    /初始化

16、       treei.parent=0;    treei.lchild=-1;   treei.rchild=-1;   treei.weight=0.0;     printf("【依次读入前%d个结点的字符及权值(中间用空格隔开)】n",n);   for(i=0;i<n;i+)  /读入前n个结点的字符及权值  

17、0;    printf("输入第%d个字符为和权值",i+1);    scanf("%c %f",&c,&f);    getchar();    treei.ch=c;    treei.weight=f;     for(i=n;i<m;i+)      /进行n-1次合并,产生

18、n-1个新结点       p1=0;p2=0;small1=maxval;small2=maxval;   /maxval是float类型的最大值   for(j=0;j<i;j+)    /选出两个权值最小的根结点    if(treej.parent=0)      if(treej.weight<small1)  &#

19、160;          small2=small1;  /改变最小权、次小权及对应的位置       small1=treej.weight;      p2=p1;      p1=j;          else

20、       if(treej.weight<small2)              small2=treej.weight;  /改变次小权及位置        p2=j;          treep1.parent=

21、i;   treep2.parent=i;    treei.lchild=p1;  /最小权根结点是新结点的左孩子   treei.rchild=p2;  /次小权根结点是新结点的右孩子   treei.weight=treep1.weight+treep2.weight;    /huffman   void huffmancode(codetype code,h

22、ufmtree tree)/根据哈夫曼树求出哈夫曼编码 /codetype code为求出的哈夫曼编码 /hufmtree tree为已知的哈夫曼树 int i,c,p;    codetype cd;   /缓冲变量  for(i=0;i<n;i+)       cd.start=n;     cd.ch=treei.ch;    

23、0;c=i;       /从叶结点出发向上回溯     p=treei.parent;   /treep是treei的双亲   while(p!=0)         cd.start-;     if(treep.lchild=c)       cd.bitscd.start

24、='0'   /treei是左子树,生成代码'0'    else       cd.bitscd.start='1'   /treei是右子树,生成代码'1'     c=p;      p=treep.parent;       codei=

25、cd;    /第i+1个字符的编码存入codei    /huffmancode   void decode(hufmtree tree)/依次读入字符,根据哈夫曼树译码    int i,j=0;  char bmaxsize;   char endflag='2'    /电文结束标志取2   i=m-1; 

26、;            /从根结点开始往下搜索  printf("输入发送的编码(以'2'为结束标志):");  gets(b);  printf("译码后的字符为");  while(bj!='2')       if(bj='0')   

27、0;  i=treei.lchild;   /走向左孩子   else      i=treei.rchild;   /走向右孩子    if(treei.lchild=-1)     /treei是叶结点         printf("%c",treei.ch);  

28、0;   i=m-1;      /回到根结点      j+;     printf("n");   if(treei.lchild!=-1&&bj!='2')   /电文读完,但尚未到叶子结点    printf("nERRORn");  /输入电文有错 /decode4 设计结果与分析图4.1图4.2图4.3图4.4图4.55 参考文献1 黄同成,黄俊民,董建寅数据结构M北京:中国电力出版社,2008  2 董建寅,黄俊民,黄同成数据结构实验指导与题解M北京:中国电力出版社,2008专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁