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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

哈夫曼编码译码器.docx

1、哈夫曼编码译码器哈夫曼编码译码器哈夫曼编码译码器学院班级: 信息工程学院 软件1501 指导教师: 朱俊武 小组成员: 刘洋 蒋佳烨 冀若含 本人学号: 151303107 报告书写: 冀若含 学生成绩: 一、总体介绍03-04二、详细设计04-11三、运行测试11-12四、课设总结13-13五、附录代码13-19一、总体介绍1.1任务概述 我们小组做了两个版本,其中一个为文件操作版,另一个为键盘操作版。两个版本都实现了哈夫曼编码/译码操做。我主要负责的是构造哈夫曼树,给出各个字符的哈夫曼编码,加密操做,整个键盘操作版系统的代码重组、编辑。开发的过程中使用了Codelite、Dev、Vc等软件

2、。参考书籍为数据结构(c语言版)。其中文件操作版的具体实现为:能够实现对26个小写字母外加空格进行哈夫曼编码,并能够对一整篇文章(有小写字母和空格组成)进行加密,生成密码文件。最后根据生成的密码翻译出原文并存档。在使用程序时,使用者只需要对ToBetran文件进行原文的输入(使用小写字母或空格),加密和解密功能由程序自主来完成。程序运行的过程中会输出进行编码的26个小写字母和空格(字符型),并输出其对应的权值(整型)。还输出字符的编码及生成的密文。最后输出解密后的原文。键盘操作版为:要求从键盘输入字符集和字符的权值,大部分字符均可输入,需要各个字符的权值不能相同。利用输入的权值建立哈夫曼树,得

3、到每个字符的前缀编码。输入字符串,程序对其进行加密。输入密文(1010101.)对密文进行解密。 两个版本都利用了哈夫曼树解决问题,通过建立哈夫曼树,得出每个字符的独特前缀编码,也就是密文,然后利用密文对明文进行加密得到密文。密文转换为明文则是通过对哈夫曼树的遍历。(之前想过字符串的匹配得到明文但是算法太为复杂)。1.2系统功能框图本系统分为三个大的模块:构造哈夫曼树,编码,译码。1.3 功能难点 本系统的实现难点在于哈夫曼树的构造。编码、译码功能的实现都是基于哈夫曼树的。二、详细设计2.1哈夫曼树的构造 哈夫曼树,又称最优树,是一类带权路径长度最短的树,有着广泛的应用。哈夫曼树的构造过程如下

4、:1.初始化: 根据给定的n个权值w1,w2,wn构成n棵二叉树的集合F=T1,T2,.,Tn,其中每棵二叉树Ti中只有一个带权wi的根节点,左右子树均空。2. 找最小树:在F中选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且至新的二叉树的根结点的权值为其左右子树上根结点的权值之和。3. 删除与加入:在F中删除这两棵树,并将新的二叉树加入F中。4. 判断:重复前两步(2和3),直到F中只含有一棵树为止。该树即为哈夫曼树。2.2 代码实现哈夫曼树和哈夫曼编码的储存表示typedef struct int weight; int parent,lchild,rchild;HTNode,

5、*HuffmanTree;/动态分配数组储存哈夫曼树typedef char* *HuffmanCode;/动态分配数组储存哈夫曼编码表void Select(HuffmanTree HT,int p,int *s1,int *s2)该函数的功能为:找出HT1.i-1中parent为0且weight最小的两个结点,其序号为s1,s2。void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n,char *a)该函数的功能为构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC。以下为两个函数的流程图或详细设计。void HuffmanC

6、oding(HuffmanTree HT,HuffmanCode HC,int *w,int n,char *a) 指针a指向输入的字符集,指针w指向字符集的度,n为字符集的大小。注:具体程序中加入了输出各个字符的哈夫曼编码的功能,在流程图没有显示。没画完下面还有哟!详细代码:void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n,char *a) int m=0;int c;int f; int start; char *cd; int *s1; int *s2; int i; s1=(int*)malloc(sizeof(

7、int); s2=(int*)malloc(sizeof(int); m=2*n-1; if(n=1) printf(字符的个数过少n); return; HuffmanTree p; p=HT; p+; for(i=1;iweight=*w; p-parent=0; p-lchild=0; p-rchild=0; for(;iweight=0; p-parent=0; p-lchild=0; p-rchild=0; for(i=n+1;i=m;+i) Select(HT,i-1,s1,s2); HT*s1.parent=i;HT*s2.parent=i; HTi.lchild=*s1;HTi

8、.rchild=*s2; HTi.weight=HT*s1.weight+HT*s2.weight; cd=(char *)malloc(n*sizeof(char); cdn-1=0; for(i=1;i=n;+i) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char *)malloc(n-start)*sizeof(char); strcpy(HCi,&cdstart); printf(%c ,*a); a+; print

9、f(%sn,HCi); free(cd);void Select(HuffmanTree HT,int p,int *s1,int *s2)详细设计:首先通过一个循环找出当前数组中weight最小的一个。记录下它的序号。也是一和一样的循环和算法。加上一个if语句,如果循环到与第一次序号一样的那次,就continue跳过这次比较。将得到的权值最小的两个传到s1和是s2指向的地址。这就是哈夫曼树的构造和生成哈夫曼编码的过程。详细代码:void Select(HuffmanTree HT,int p,int *s1,int *s2)/i为遍历长度 int i=1; int x=0; int y=0;

10、 int min=1000; int min1=1000; int v=1; *s1=1;*s2=1; for(i=1;iy) min=HTi.weight; *s1=i;v=i; for(i=1;i=y) min1=HTi.weight; *s2=i; 2.3 编码(加密)void HuffmanEncryption(HuffmanCode HC,char *a,int n)此函数为加密函数。该加密函数的流程图如下:该功能的实现就是通过一个简单的查找,通过字符与字符的哈夫曼编码在不同数组的对应关系,进行加密。Input储存输入的字符串。Lo为输入的字符串长度,n为原字符集的字符个数。详细代码

11、如下:void HuffmanEncryption(HuffmanCode HC,char *a,int n) char input100; int i=0,j=0; char lu= ; int lo=0;/要加密的字符串的长度 char c; printf(请输入你要加密的字符串n); while(lu=getchar()!=n&lu!=EOF) ; c=getchar(); while(c!=n) inputi=c; i+; c=getchar(); lo=i; for(i=0;ilo;i+) for(j=0;jn;j+) if(inputi=aj) printf(%s,HCj+1);

12、printf(n);三、运行测试菜单界面:构造哈夫曼树:编码:译码:密钥:译码测试:四、总结 经过几天的设计与编码我们小组终于完成了两个不同的版本的哈夫曼编码译码器。虽然两个系统大部分的算法相同,但是也算我们的尝试。美中不足的是我们没能把两个版本的系统融合起来。开发过程中遇到的最大的问题就是输入输出流的问题。因为是从键盘输入数据的所以难免会遇到这种问题。我通过输入流的过滤解决了此问题。通过这几天的实验,加深了我对哈夫曼树的理解,也加强了自己的动手能力。数据结构这门课程还有很多很多的东西,我们仍应该继续努力。附录全部代码:#include #include #include #include t

13、ypedef struct int weight; int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char* *HuffmanCode;void Select(HuffmanTree HT,int p,int *s1,int *s2)/i为遍历长度,big int i=1; int x=0; int y=0; int min=1000; int min1=1000; int v=1; *s1=1;*s2=1; for(i=1;iy) min=HTi.weight; *s1=i;v=i; for(i=1;i=y) min1=HTi.we

14、ight; *s2=i; void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n,char *a) int m=0;int c;int f; int start; char *cd; int *s1; int *s2; int i; s1=(int*)malloc(sizeof(int); s2=(int*)malloc(sizeof(int); m=2*n-1; if(n=1) printf(字符的个数过少n); return; HuffmanTree p; p=HT; p+; for(i=1;iweight=*w; p-p

15、arent=0; p-lchild=0; p-rchild=0; for(;iweight=0; p-parent=0; p-lchild=0; p-rchild=0; for(i=n+1;i=m;+i) Select(HT,i-1,s1,s2); HT*s1.parent=i;HT*s2.parent=i; HTi.lchild=*s1;HTi.rchild=*s2; HTi.weight=HT*s1.weight+HT*s2.weight; cd=(char *)malloc(n*sizeof(char); cdn-1=0; for(i=1;i=n;+i) start=n-1; for(c

16、=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char *)malloc(n-start)*sizeof(char); strcpy(HCi,&cdstart); printf(%c ,*a); a+; printf(%sn,HCi); free(cd);void HuffmanEncryption(HuffmanCode HC,char *a,int n) char input100; int i=0,j=0; char lu= ; int lo=0;/要加密

17、的字符串的长度 char c; printf(请输入你要加密的字符串n); while(lu=getchar()!=n&lu!=EOF) ; c=getchar(); while(c!=n) inputi=c; i+; c=getchar(); lo=i; for(i=0;ilo;i+) for(j=0;jn;j+) if(inputi=aj) printf(%s,HCj+1); printf(n);void Huffmandeciphering(HuffmanCode HC,char *a,int n,HuffmanTree HT)/解密 int input100=0; char c= ;

18、int num=0; int m=1; int t=0; printf(请输入你要解密的字符串n); int i=0; getchar(); while(c!=n) c=getchar(); inputi=(int)c-48; i+; num=i; for(i=1;t=0;i+) if(HTi.parent =0) t=i;/根结点的位置 m=t; for(i=0;i: ); scanf(%c,&choice); switch(choice) case a:case A: system(cls); view(); getchar(); break; case b:case B: printf(

19、请输入字符集大小n); scanf(%d,&n); printf(请输入字符名和度数中间以空格隔开n); for(i=0;in;i+) while(lu=getchar()!=n&lu!=EOF) ; scanf(%c %d,&inp,&inpt); *(a+i)=inp; *(w+i)=inpt; HuffmanCoding(HT,HC,w,n,a);/构建哈夫曼树 getchar(); break; case c:case C: HuffmanEncryption(HC,a,n);/加密 break; case D:case d: Huffmandeciphering(HC,a,n,HT)

20、;/解密 break; case F:case f: printf(你确定要初始化吗Y or Nn); char yn; getchar(); scanf(%c,&yn); if(yn=Y) free(a);free(w);free(HT);free(HC); lu= ;inp= ;inpt=0; a=(char*)malloc(n+2)*sizeof(char); w=(int*)malloc(n*sizeof(int); HT=(HuffmanTree)malloc(2*n)*sizeof(HTNode); HC=(HuffmanCode)malloc(n+1)*sizeof(char*); printf(初始化完成n); getchar(); break; else getchar(); break; case E:case e: goto LAST; default:printf(没有这个选型哟n); system(pause); LAST:return 0;

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

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