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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计 哈夫曼编译码3.docx

1、数据结构课程设计 哈夫曼编译码3数据结构课程设计专业 :计算机科学与技术姓名 : 陈振辉 学号 :12224506 班级 : 5班 课程设计 三哈夫曼编译码简要:利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站编写一个赫夫曼码的编/译码系统。2. 基本要求一个完整的系统应具有以下功能:(1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值

2、,建立赫夫曼树,并将它存于文件hfmTree中。(2) E:编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。以下为选做:(4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5) T:印赫夫曼树(Tree printing)。将已在内存中的赫夫曼

3、树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。3. 测试要求(1) 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。(2) 用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FAVORITE”。字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度57631514851802381811614. 实现提

4、示(1) 编码结果以文本方式存储在文件Codefile中。(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。(3) 在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfmTree可能早已建好1.哈夫曼树节点的数据类型定义为:typedef struct /赫夫曼树的结构体 char ch; int weight; /权值 int parent,lchild,rchild;htnode,*hf

5、mtree;2)所实现的功能函数如下1初始化(Initialization)。编码(Encoding)译码(Decoding)、void hfmcoding(hfmtree &HT,hfmcode &HC,int n)初始化哈夫曼树,处理InputHuffman(Huffman Hfm)函数得到的数据,按照哈夫曼规则建立2叉树。此函数块调用了Select()函数。void Select(hfmtree &HT,int a,int *p1,int *p2) /Select函数,选出HT树到a为止,权值最小且parent为0的2个节点其代码如下:#include#include#include#i

6、nclude#includetypedef struct /赫夫曼树的结构体 char ch; int weight; /权值 int parent,lchild,rchild;htnode,*hfmtree;typedef char *hfmcode;void Select(hfmtree &HT,int a,int *p1,int *p2) /Select函数,选出HT树到a为止,权值最小且parent为0的2个节点 int i,j,x,y; /x是记录权值最小的节点的下标,y是记录第二个最小权值节点的下标 for(j=1;j=a;+j) if(HTj.parent=0) x=j; bre

7、ak; for(i=j+1;i=a;+i) if(HTi.weight HTx.weight & HTi.parent=0) /两两比较选出权值最小的节点 x=i; for(j=1;j=a;+j) if(HTj.parent=0&x!=j) y=j; break; for(i=j+1;i=a;+i) if(HTi.weighty) /让p1指向下标最小的节点地址 *p1=y; *p2=x; else *p1=x; *p2=y; void hfmcoding(hfmtree &HT,hfmcode &HC,int n) /构建赫夫曼树HT,并求出n个字符的赫夫曼编码HC int i,start,

8、c,f,m,w; int p1,p2; char *cd,z; if(n=1) cout输入有错endl; return; m=2*n-1; HT=(hfmtree)malloc(m+1)*sizeof(htnode); /分配2n+1个空间存储树节点 for(i=1;i=n;+i) /初始化n个叶子结点 printf(请输入第%d字符和权值:,i); scanf(%c%d,&z,&w); while(getchar()!=n) continue; HTi.ch=z; HTi.weight=w; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; for(;i=

9、m;+i) /初始化其余的结点 HTi.ch=0; HTi.weight=0; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; for(i=n+1;i=m;+i) /建立赫夫曼树 Select(HT,i-1,&p1,&p2); HTp1.parent=i;HTp2.parent=i; /让最小p1,p2的双亲相同都为i HTi.lchild=p1;HTi.rchild=p2; /让p1,p2分别为i的左右孩子 HTi.weight=HTp1.weight+HTp2.weight; /把i的权值编为最小二权值相加 HC=(hfmcode)malloc(n+1)

10、*sizeof(char *); /分配n+1个空间存储编码 cd=(char *)malloc(n*sizeof(char); /分配n个空间分别存储左右孩子的0与1 cdn-1=0; for(i=1;i=n;+i) /给n个字符编码 start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) /不是根节点左右分支分别赋值0,1 if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char*)malloc(n-start)*sizeof(char); strcpy(HCi,&cdstart);

11、 /把数组cd中的内容0,1赋值给HC,HC为编码 free(cd);void Initiation(hfmtree &HT,hfmcode &HC,int &n) ofstream output_file; coutn; hfmcoding(HT,HC,n); coutendl初始化完成,分别为endl; for(int i=1;i=n;+i) coutHTi.ch:HCiendl;/字符与编码 output_file.open(hfmTree.txt); /新建一个文件 if(!output_file) coutcant oen file!endl; for(i=1;i=n;i+) out

12、put_file(HTi.chHCi); /把编码与字符存储进文件 output_file.close(); coutendl;/ cout哈夫曼树建完且放入hfmTree.txt文件中!endl;void Encoding(hfmtree &HT,hfmcode &HC,int n) char code100,str100; ofstream output_file; ifstream input_file; printf(请输入字符:); gets(str); output_file.open(ToBeTran.txt); if(!output_file) coutcant oen fil

13、e!endl; output_filestrendl; /把文件存储进文件 output_file.close(); output_file.open(CodeFile.txt); if(!output_file) coutcant oen file!endl; for(int i=0;istrlen(str);i+) for(int j=0;j=n;+j) if(HTj.ch=stri) /判断输入的字符是否与编码的字符相同 output_fileHCj; /假如相同,这把该字符编码存进文件 break; output_file.close(); coutn; cout编码完毕,并且已经存入

14、CodeFile.txt文件!n; input_file.open(CodeFile.txt); /从CodeFile.txt中读入编码,输出在终端,打开文件 if(!input_file) coutcant oen file!code;/从CodeFile.txt中读入编码,并存进code数组中 cout 编码码值为: codeendl; /在终端输出,打印在屏幕上 input_file.close(); void Decodeing(hfmtree &HT,hfmcode &HC, char *h ,int n) char hl100; int k; ifstream input_file

15、; /文件输入输出流 ofstream output_file; input_file.open(CodeFile.txt); /打开文件 if(!input_file) coutcant oen file!h; /将文件里面的编码存进数组h input_file.close(); output_file.open(Textfile.txt); if(!output_file) coutcant oen file!endl; k=0; while(hk!=0) /先用编码中的前几个和字符的编码相比较,然后往后移 for(int i=1;i=n;i+) int l=k; for(int j=0;

16、jstrlen(HCi);j+,l+) hlj=hl; /把h中的编码按字符编码分别一个个存进数组h1中 hlj=0; if(strcmp(HCi,hl)=0) /比较HC与h1中编码字符串的大小,假如相等 output_fileHTi.ch; /把该对应的字符存进文件 k=k+strlen(HCi); /移到下一个字符 break; output_file.close(); input_file.open(Textfile.txt); if(!input_file) coutcant oen file!h; couthendl; /打开文件。输出编码 input_file.close();

17、cout译码完成,信息存入Textfile.txt文件中!endl; void main() char h100,choice; int n; hfmtree HT; /里面存储字符与权值 hfmcode HC; /里面存储编码,0与1 coutendl 哈夫曼编码/译码n; coutI.初始化 E.编码 D.译码 Q.停止endl; while(true) /当choice的值不为q且不为Q时循环 coutchoice; switch(choice) case I : Initiation(HT,HC,n); break; case E : Encoding(HT,HC, n); break; case D : Decodeing(HT,HC, h,n); break; case Q : exit(0); default : cout您没有输入正确的步骤,请重新输入!endl; break; coutendlendl; 总结:经过这次课程设计,我重新又再学了一遍,让我更了解哈夫曼树的构建,其中在老师的验收中,老师又给我一些数据,让我重新构建一个权重和最小的哈夫曼树,在这次课程设计中,我学到了很多,懂得虚心请教同学,虚心接受他人意见,这样,使同学间友谊更深,同样,学习问题也解决了,知识也巩固了。

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

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