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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计赫夫曼编码.docx

1、数据结构课程设计赫夫曼编码中南民族大学数据结构课程设计报告* * * 年 级: 2010 学 号: *4 专 业:计算机科学与技术 * * 2013年4月15日实习报告: 赫夫曼编/译码器题目:为信息收发站写一个赫夫曼码的编/译码系统班级:计科一班 姓名:康宇 学号:*4 完成日期:2013.4.5 一、需求分析1、问题描述:利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端讲传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。2、基本要求:(1)I:

2、初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。(2)E:编码(Encoding)。利用已建好的赫夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5)T:印赫夫曼树(Tree Printing)

3、。将已在内存中的赫夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint中。3、实现提示:(1)编码结果以文本方式存储在文件CodeFile中。(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。二、概要设计1.元素类型:typedef struct int weigt;/权值 int parent,lchild,rchild;/双亲,左孩子,右孩子HTNode,*HuffmanTree;typedef char* Huf

4、fmanCode;/存放各个字符的前缀编码2.本程序包括六个大板块:(1)主程序: int main() 输出菜单;选择功能选项并调用对应的函数; (2)初始化函数: void Initialization(HuffmanTree &ht,FILE *fp) 安全打开文件;输入字符数量以及各字符及其权值;对各节点进行初始化;创建赫夫曼列表;(需要调用Select()函数选择权职最小的两个节点) void Select(HuffmanTree &ht,int i,int &s_1,int &s_2)找出第一个非零结点;找出第二个非零结点;遍历比较找出权值最小的两个节点;(3)编码函数:void

5、Encoding(HuffmanTree &ht,HuffmanCode &hc,FILE *fp1,FILE *fp2)安全打开文件;for:1 n,双亲不为空If(为左孩子)str-start=0;elsestr-start=1;储存各字符的编码;从文件中读取正文;依次遍历正文各字符,显示其编码;(4)译码函数:void Decoding(HuffmanTree &ht,HuffmanCode &hc,FILE *fp1,FILE *fp2)安全打开文件;While(成功读取字符)遍历目前的编码中是否有对应的字符;if(有)输出该字符;else跳到循环体首;(再次读入一个字符再判断)(5)

6、印代码文件:void Print(FILE *fp1,FILE *fp2)安全打开文件;从文件中读取字符,50个一行输出;(6)印赫夫曼树:void Treeprinting(HuffmanTree ht)安全打开文件;调用print_tree(ht,root)函数;void print_tree(HuffmanTree ht, int r)if(存在节点)深度+1;递归调用print_tree(ht,htr.rchild);/先输出右子树用深度控制格式;输出对应的字符;递归调用print_tree(ht,htr.lchild);/再输出左子树深度-1三、详细设计#include #inclu

7、de #include typedef struct int weigt; int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char* HuffmanCode;/存放各个字符的前缀编码/此全局文件指针用于输出赫夫曼树到对应文件,便于调用递归FILE *TreePrint=NULL;char *s;/存放各字符int *w;/存放各字符的权值int n;int m;int dep=0;/存放各字符的深度void Select(HuffmanTree &ht,int i,int &s_1,int &s_2)/挑选出权值最小的两个结点 int

8、 j; for(j=1;j=i;j+)/找出第一个非零结点 if(htj.parent=0) s_1=j; break; for(j=s_1+1;j=i;j+)/找出第二个非零结点 if(htj.parent=0) s_2=j; break; for(j=1;j=i;j+)/遍历出权值最小的两个结点 if(htj.parent=0)/必须要判断双亲是否为空 if(htj.weigthts_1.weigt&htj.weigthts_2.weigt) s_2=j; void Initialization(HuffmanTree &ht,FILE *fp) int i,s1,s2; if(fp=fo

9、pen(hfmTree.txt,w)=NULL)/安全打开文件 printf(File hfmTree.txt cannot opened.n); exit(1); /输入各字符以及权值 printf(请输入字符集大小n :); scanf(%d,&n); s=(char *)malloc(n*sizeof(char); w=(int *)malloc(n*sizeof(int); printf(请输入各字符:n); getchar(); /getchar();/处理换行符 /scanf(%s,s); gets(s); printf(请输入各字符对应的权值:n); for(i=0;in;i+)

10、 scanf(%d,&wi); if(n=1) return; m=2*n-1;/节、结点的个数 ht=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(i=1;i=n;i+)/分别对各结点赋值 hti.weigt=wi-1; hti.parent=hti.lchild=hti.rchild=0; for(i=n+1;i=m;i+) hti.weigt=hti.parent=hti.lchild=hti.rchild=0; /构建赫夫曼树 for(i=n+1;i=m;i+) Select(ht,i-1,s1,s2);/选出权值最小的叶子节点 hts1.p

11、arent=hts2.parent=i; hti.lchild=s1; hti.rchild=s2; hti.weigt=hts1.weigt+hts2.weigt;/构建新结点的权值 /输出赫夫曼列表 printf(赫夫曼列表为:n); for(i=1;i=n;i+)/叶子节点 fprintf(fp,t%ct%dt%dt%dt%dn,si,hti.weigt,hti.parent,hti.lchild,hti.rchild); printf(t%ct%dt%dt%dt%dn,si-1,hti.weigt,hti.parent,hti.lchild,hti.rchild); for(i=n+1

12、;i=m;i+)/非叶子节点 fprintf(fp,t t%dt%dt%dt%dn,hti.weigt,hti.parent,hti.lchild,hti.rchild); printf(t t%dt%dt%dt%dn,hti.weigt,hti.parent,hti.lchild,hti.rchild); fclose(fp);void Encoding(HuffmanTree &ht,HuffmanCode &hc,FILE *fp1,FILE *fp2)/编码 int i,j,c,f,start; char *str;/用于存放编码 char data100;/用于存放文件正文字符 if

13、(fp1=fopen(ToBeTran.txt,r)=NULL) printf(File ToBeTran.txt cannot opened.n); exit(1); if(fp2=fopen(CodeFile.txt,w)=NULL) printf(File CodeFile.txt cannot opened.n); exit(1); /根据赫夫曼树得到各字符对应的编码 hc=(HuffmanCode)malloc(n+1)*sizeof(char *); str=(char *)malloc(n*sizeof(char);/n个字符中的最长的编码个数为n-1 strn-1=0;/编码从

14、后开始往前存放 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)/为左子树 str-start=0; else/为右子树 str-start=1; hci=(char *)malloc(n-start)*sizeof(char); strcpy(hci,&strstart);/赋值对应字符的编码 printf(各字符串的编码为:n); for(i=1;i=n;i+) printf(%sn,hci); /对文件正文进行编码 /fscanf(fp1

15、,%s,data); fgets(data,500,fp1);/读取正文 printf(文件正文为:); printf(%s,data); printf(n文件ToBeTran中的正文编码为:n); for(i=0;istrlen(data);i+) for(j=0;jn;j+) if(datai=sj)/依次遍历出正文各字符的编码,并存储到文件中 printf(%s,hcj+1); fprintf(fp2,%s,hcj+1); break; printf(n); free(str); fclose(fp1); fclose(fp2);void Decoding(HuffmanTree &ht

16、,HuffmanCode &hc,FILE *fp1,FILE *fp2) int i,j; bool flag; char ch; char *data=(char *)malloc(n*sizeof(char);/临时存放赫夫曼码 if(fp1=fopen(CodeFile.txt,r)=NULL) printf(File CodeFile.txt cannot opened.n); exit(1); if(fp2=fopen(TextFile.txt,w)=NULL) printf(File TextFile.txt cannot opened.n); exit(1); /进行译码 pr

17、intf(文件译码为:n); while(fscanf(fp1,%c,&ch)!=EOF)/有编码可读取 flag=true;/控制循环 i=0; while(flag) if(i!=0) fscanf(fp1,%c,&ch); datai+=ch; datai=0; for(j=1;j=n;j+) if(!strcmp(data,hcj)/如果找到匹配的字符编码 printf(%c,sj-1); fprintf(fp2,%c,sj-1); flag=false; break; fclose(fp1); fclose(fp2);void Print(FILE *fp1,FILE *fp2) c

18、har ch; int sum=0; if(fp1=fopen(CodeFile.txt,r)=NULL) printf(File CodeFile.txt cannot opened.n); exit(1); if(fp2=fopen(CodePrin.txt,w)=NULL) printf(File CodePrin.txt cannot opened.n); exit(1); /从CodeFile中读取出来输出到CodePrin中 printf(文件字符为:n); while(fscanf(fp1,%c,&ch)!=EOF) sum+; printf(%c,ch); fprintf(fp

19、2,%c,ch); if(sum%50=0)/50个字符一行 printf(n); fprintf(fp2,n); fclose(fp1); fclose(fp2);void print_tree(HuffmanTree ht, int r) /左倒置90度输出到文件和终端上 if(r) dep+;/控制叶子节点的深度 print_tree(ht,htr.rchild);/先输出右子树 for(int i=1;in) printf(On); fprintf(TreePrint,On); else printf(%cn,sr-1); fprintf(TreePrint,%cn,sr-1); pr

20、int_tree(ht,htr.lchild);/再输出左子树 dep-; void Treeprinting(HuffmanTree ht) int root;/根结点 if(TreePrint=fopen(TreePrint.txt,a)=NULL)/进行数据追加 printf(File TreePrint.txt cannot opened.n); exit(1); root=m; printf(赫夫曼树为:n); print_tree(ht,root); fclose(TreePrint);/及时关闭文件int main() int choose; FILE *hfmTree=NULL

21、,*ToBeTran=NULL,*CodeFile=NULL,*TextFile=NULL,*CodePrin=NULL; HuffmanTree huftree=NULL;/指针初始化 HuffmanCode hufcode=NULL; while(1) printf(n-赫夫曼编/译码器菜单-n); printf(1-Initialization(初始化)n); printf(2-Encoding(编码)n); printf(3-Decoding(译码)n); printf(4-Print(印代码文件)n); printf(5-Treeprinting(印赫夫曼树)n); printf(0

22、-Quit(退出)n); printf(-n); printf(请选择功能:); scanf(%d,&choose); switch(choose) case 1: Initialization(huftree,hfmTree); break; case 2: Encoding(huftree,hufcode,ToBeTran,CodeFile); break; case 3: Decoding(huftree,hufcode,CodeFile,TextFile); break; case 4: Print(CodeFile,CodePrin); break; case 5: Treeprin

23、ting(huftree); break; case 0: printf(退出!n); exit(1); default: printf(请重新输入!n); free(hfmTree); free(ToBeTran); free(CodeFile); free(TextFile); free(CodePrin); free(TreePrint); return 0;四、调试分析1.本次作业还是有一定的难度的,核心算法在于怎样建立赫夫曼树以及怎样由赫夫曼树得到前缀编码。如果这两个问题解决后,问正文进行编码或译码就很简单了,还有一个难点是:怎样把赫夫曼树以树状的形式输出。对文件的调用也要引起注意,小心调用。2.本程序模块简洁,在main()函数里得到充分体现,菜单显示各功能,各函数功能独立性强,便于修改。3.用户可任意输入字符个数以及各字符权值,便于用户体验系统的完整性。本程序具有一定的普遍性。五、用户手册1.本程序运行环境为Windows操作系统,执行文件为:赫夫曼编译码.exe2.进入演示程序后显示的界面:六、测试结果

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

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