ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:287.07KB ,
资源ID:5753397      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5753397.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈夫曼编译器.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈夫曼编译器.docx

1、哈夫曼编译器 沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:数据结构课程设计 课程设计题目:哈夫曼编码和译码器 院(系):计算机学院 专 业:计算机科学与技术 班 级:24010101 学 号:2012040101034 姓 名:赵文焕 指导教师:许 清1. 题目分析1.1. 需求概述本次课程设计的目标是实现一个哈夫曼编码和译码器。该哈夫曼编码和译码器需要根据用户输入的字符集及相应字符出现的频率,对字符集所包含的字符进行哈夫曼编码。同时,作为编码器需要其对用户提供的明文字符串进行编码,使明文字符串变为二进制密文;作为译码器需要对用户提供的二进制密文进行译码,使二进制密文变为字符明文。

2、1.2. 系统功能需求分析通过对课程设计的题目分析,可以得出哈夫曼编码和译码器的功能需求,需求如下:1) 读取用户输入的字符集和相应字符出现的频率;2) 根据用户输入构建哈夫曼树;3) 根据哈夫曼树构建字符-哈夫曼编码对照表;4) 根据字符-哈夫曼编码对照表对明文字符串进行编码;5) 根据哈夫曼树对二进制密文进行译码。1. 2. 程序设计2.1. 系统功能模块说明根据对系统的分析,哈夫曼编码与译码器系统共分为五个功能模块,分别为:用户输入获取模块、哈夫曼树构造模块、字符-哈夫曼编码对照表构造模块、编码模块、译码模块。2.1.1. 系统功能模块结构自底向上考虑各系统功能模块之间的依赖关系,译码模

3、块依赖于哈夫曼树构造模块,编码模块依赖于字符-哈夫曼编码对照表构造模块,字符-哈夫曼编码对照表构造模块依赖于哈夫曼编码构造模块,哈夫曼编码构造模块依赖于用户输入获取模块。系统功能结构框图如图2-1:图21 哈夫曼编码与译码器系统功能结构框图1. 2. 2.1. 2.1.1. 2.1.2. 系统模块功能说明1) 用户输入获取模块获取并保存用户从键盘上输入的字符集和相应字符出现的频率。2) 哈夫曼树构造模块根据用户输入获取模块保存的字符数据,构造哈夫曼树。3) 字符-哈夫曼编码对照表构造模块根据哈夫曼树构造模块构造的哈夫曼树,建立字符-哈夫曼编码对照表。4) 编码模块根据字符-哈夫曼编码对照表构造

4、模块构造的字符-哈夫曼编码对照表,对用户提供的明文进行编码。5) 译码模块根据哈夫曼树构造模块构造的哈夫曼树,对用户提供的密文字符进行译码。2.2. 数据结构说明在程序中主要用到了二叉树和链表等数据结构。2.2.1. 结构体定义说明1) struct _NODE结构结构体定义如下:typedef struct _NODE char word; int value; _NODE *left,*right;Node,*LPNode; 结构体用途:作为哈夫曼树的结点结构,构成哈夫曼树。2) struct _CONTAINER结构结构体定义如下:typedef struct _CONTAINER LP

5、Node v; struct _CONTAINER *last,*next;Container,*LPContainer; 结构体用途:用于在用户输入时保存字符信息,并构成双向链表。3) struct _ CODENODE结构结构体定义如下:typedef struct _CODENODE char word; char code100; struct _CODENODE *next;CodeNode,*LPCodeNode; 结构体用途:作为单链表的结点结构,构成字符-哈夫曼编码对照表。2.2.2. 哈夫曼树在本程序中,哈夫曼树是使用struct _NODE结构构建的二叉树,其满足树的叶子结

6、点的带全路径和在所有可能组成的二叉树中最小。2.2.3. 字符-哈夫曼编码对照表在本程序中,字符-哈夫曼编码对照表是一个单链表,用于保存字符与哈夫曼编码的对应关系。2.3. 函数说明1) GetInput函数函数声明:LPNode GetInput();参数声明:无参数。返回值说明:返回创建的哈夫曼树指针。函数功能:该函数的功能是读取用户输入的字符集数据,并构建相应的哈夫曼树。函数的返回值是哈夫曼树的指针。2) createHuffmanTree函数函数声明:LPNode createHuffmanTree(LPContainer list);参数说明:list:用来构建哈夫曼树的数据链表。返

7、回值说明:返回构建的哈夫曼树。函数功能:该函数的功能是根据用户输入构建哈夫曼树。3) createCodeList函数函数声明:LPCodeNode createCodeList(LPNode tree);参数说明:tree:哈夫曼树。返回值说明:返回字符-哈夫曼编码对照表。函数功能:该函数的功能是根据哈夫曼树构建与之对应的字符-哈夫曼编码对照表。4) code函数函数声明:void code(LPCodeNode list);参数说明:list:字符-哈夫曼编码对照表。返回值说明:无返回值。函数功能:该函数用于实现编码功能。5) uncode函数函数声明:void uncode(LPNode

8、 tree);参数声明:tree:哈夫曼树。返回值说明:无返回值。函数功能:该函数用于实现译码功能。3. 算法描述3.1. 哈夫曼树的构建在本程序中,GetInput函数首先将用户输入的每个字符信息储存到struct _NODE结构中看做是哈夫曼树的叶子结点,并将struct _NODE结构的地址储存到struct _CONTAINER结构中,按字符出现频率升序插入到双向链表中,然后调用createHuffmanTree函数构造哈夫曼树。在构造哈夫曼树的过程中,首先从双向链表中选取字符出现频率最小和第二小的结点,从中提取哈夫曼树的子树,将两个子树合并成一个子树,再将父节点的地址存入struct

9、 _CONTAINER结构中,并插入到双向链表中。重复此步骤直到链表中只剩下一个结点。这样该struct _CONTAINER结构中存储的struct _NODE类型的指针就指向要得到哈夫曼树的根节点了。3.2. 字符-哈夫曼编码对照表用深度优先搜索的方法递归的遍历哈夫曼树,展开的过程中向调用的递归函数传递要访问的结点的哈夫曼编码。当访问叶子结点时,从结点中提取字符信息,并和其哈夫曼编码一同储存到struct _ CODENODE结构中,然后将struct _ CODENODE结构插入到单链表中。如此,当遍历完成时,字符-哈夫曼编码对照表便构造完成了。3.3. 编码从源文件中读取一个字符,在字

10、符-哈夫曼编码对照表中查找该字符,将查找到的结点中储存的哈夫曼编码写入到目标文件中。 图 31 构建哈夫曼树流程图 图 32 编码流程图3.4. 译码从源文件中读取字符,按照字符的指示访问哈夫曼树的子树,即从根节点出发,若读取到0则访问左子树,若读取到1则访问右子树,知道子树为哈夫曼树的叶子结点为止,此时向目标文件中输出结点中的字符。图 33 译码流程图4. 程序测试4.1. 字符集输入输入的字符集及字符出现频率如表4-1所示:表 41 字符集输入用例字符abc出现频率123程序运行效果如图4-1所示:图41 程序运行效果图4.2. 编码测试运行程序编码模块,如图4-2所示:图 42 程序运行

11、编码模块效果图程序编码输入文件如图4-3所示:图 43 程序编码输入文件截图输出分析如表4-3所示:表 43 编码输出分析abcbcaacb100010001110100程序编码输出文件如图4-4所示:图 44 程序编码输出文件截图4.3. 译码测试将编码后的文件逆向输入进行译码。运行程序译码模块,如图4-5所示:图 45 程序运行译码模块效果图程序译码输入文件如图4-6所示:图 46 程序译码输入文件截图程序译码输出文件如图4-7所示:图 47 程序译码输出文件截图4.4. 图形演示界面图形演示界面如图4-8所示: 图4-8 图形演示界面截图参考文献1 严蔚敏,吴伟民.数据结构(C语言版)M

12、.北京:清华大学出版社,20062 吕国英.算法设计与分析M.北京:清华大学出版社,20063 徐宝文,李志.C程序设计语言M.北京:机械工业出版社,20044 Erich Gamma,Richaed Helm.设计模式(英文版)M.北京:机械工业出版社,2004附 录(程序清单)#include #include #include #include /图形文件#define R 15typedef struct _NODE char word; int value; _NODE *left,*right;Node,*LPNode; typedef struct point int x,y;

13、/树节点坐标point; typedef struct _CONTAINER LPNode v; struct _CONTAINER *last,*next;Container,*LPContainer;typedef struct _CODENODE char word; char code100; struct _CODENODE *next;CodeNode,*LPCodeNode;void insert(LPContainer list,LPContainer node) LPContainer p; p=list-last; while(node-v-valuev-value) p=

14、p-last; node-last=p; node-next=p-next; p-next-last=node; p-next=node;LPNode createHuffmanTree(LPContainer list) LPContainer p; LPNode left,right,t; while(list-next!=list-last) p=list-next; list-next=p-next; left=p-v; free(p); p=list-next; list-next=p-next; list-next-last=list; right=p-v; t=(LPNode)m

15、alloc(sizeof(Node); t-word=-1; t-value=left-value+right-value; t-left=left; t-right=right; p-v=t; insert(list,p); p=list-next; list-next=p-next; list-next-last=list; left=p-v; free(p); return left;LPNode GetInput() Container list; LPContainer p; LPNode head; int i,num; printf(输入字符集规模:); scanf(%d,&nu

16、m); list.v=(LPNode)malloc(sizeof(Node); list.v-word=-1; list.v-value=0; list.v-left=list.v-right=NULL; list.next=&list; list.last=&list; for(i=0;iv=(LPNode)malloc(sizeof(Node); p-v-left=p-v-right=NULL; getchar(); printf(输入字符:); scanf(%c,&p-v-word); printf(输入该字符的权值:); scanf(%d,&p-v-value); insert(&li

17、st,p); printf(正在构造哈夫曼树n); head=createHuffmanTree(&list); printf(哈夫曼树创建成功!n); free(list.v); return head;void dfs(LPNode t,char *code,LPCodeNode list) LPCodeNode p; char l100,r100; if(t-word!=-1) p=(LPCodeNode)malloc(sizeof(CodeNode); p-word=t-word; strcpy(p-code,code); p-next=list-next; list-next=p;

18、return; strcpy(l,code); strcat(l,0); dfs(t-left,l,list); strcpy(r,code); strcat(r,1); dfs(t-right,r,list);LPCodeNode createCodeList(LPNode tree) CodeNode head; head.next=NULL; dfs(tree,&head); return head.next;void code(LPCodeNode list) FILE *sfp,*dfp; char path256,c; LPCodeNode p; printf(请输入源文件路径:)

19、; scanf(%s,path); sfp=fopen(path,rt); printf(请输入目标文件路径:); scanf(%s,path); dfp=fopen(path,wt); while(c=fgetc(sfp)!=EOF) p=list; while(p-word!=c) p=p-next; fputs(p-code,dfp); fclose(sfp); fclose(dfp);void uncode(LPNode tree) FILE *sfp,*dfp; char path256,c; LPNode p; printf(请输入源文件路径:); scanf(%s,path);

20、sfp=fopen(path,rt); printf(请输入目标文件路径:); scanf(%s,path); dfp=fopen(path,wt); p=tree; while(c=fgetc(sfp)!=EOF) if(c=0) p=p-left; else p=p-right; if(p-word!=-1) fputc(p-word,dfp); p=tree; fclose(sfp); fclose(dfp);void print(LPCodeNode list) printf(n字符-哈夫曼编码对照表n); while(list!=NULL) printf(%c - %sn,list-

21、word,list-code); list=list-next; printf(n);void window() /初始化图形眶 initgraph(480, 320,SHOWCONSOLE); setcolor(YELLOW); point dian6; dian0.x=192; dian0.y=96; dian1.x=128; dian1.y=144; dian2.x=256; dian2.y=144; dian3.x=220; dian3.y=192; dian4.x=320; dian4.y=192; for(int i=0;i5;i+) circle(diani.x,diani.y

22、, R); floodfill(diani.x,diani.y ,YELLOW); /填充颜色 Sleep(1000); line(dian2.x,dian2.y ,dian3.x,dian3.y ); line(dian2.x,dian2.y ,dian4.x,dian4.y ); Sleep(1000); line(dian0.x,dian0.y ,dian1.x,dian1.y ); line(dian0.x,dian0.y ,dian2.x,dian2.y );void main() LPNode tree=NULL; LPCodeNode list=NULL; int t; whil

23、e(1) printf(*); printf(n* 哈夫曼编/译器 *n); printf(n* 1.输入字符集 *n* 2.编码 *n* 3.解码 *n* 4.演示 *n* 5.退出 *n); printf(* *); printf(n*n); printf(n请输入操作码:); scanf(%d,&t); switch(t) case 1: tree=GetInput(); list=createCodeList(tree); print(list); break; case 2: code(list); break; case 3: uncode(tree); break; case 4

24、: window(); break; case 5: exit(0); 课程设计总结:通过此次课程设计,是我在数据结构的设计和算法设计等方面有了进一步的提高。关于数据结构方面,我对于链表和树结构的理解更加深刻,链表的建立、遍历、插入等操作;树的建立、遍历等操作更加熟练,已可以运用自如。关于算法方面,我对于插入排序,深度优先搜索等算法,已理解其原理,并能熟练编写。同时,我还深刻认识到,就我们计算机专业的学生来说,只是掌握经典的算法和数据结构是远远不够的。我们要深刻发掘创新能力,培养创新思维,只有这样我们才能在编程解决实际问题的道路上走的更远。指导教师评语:指导教师(签字): 年 月 日课程设计成绩

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1