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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

哈弗曼编码编译器.docx

1、哈弗曼编码编译器哈尔滨理工大学课程设计(数据结构)题目: 哈弗曼编码编译器 班级: 姓名:指导教师:系主任: 2013年03月08日目 录1(自己的课程设计题目)问题课程设计 11.1 题目分析 11.2 数据结构 11.3 流程图 11.4 实现技术 21.5 设计结论和心得 22 (使用的程序语言,例如C或C+)代码分析 32.1 功能说明 32.2 局部数据结构 32.3 流程图 32.4 以实例说明运行过程 41 哈弗曼编码编译器设计报告1.1 题目分析 设计一个哈弗曼编码译码器,实现哈夫曼树的建立,树形输出,编码和解码。1.2 数据结构 #include #include #incl

2、ude typedef struct / 结点的结构 unsigned int weight; / 结点的权值 unsigned int parent,lchild,rchild; HTNode,*HuffmanTree; / 动态分配数组存储哈夫曼树 typedef char *HuffmanCode; / 动态分配数组存储哈夫曼编码 HuffmanTree HT; HuffmanCode HC; int n=8; const char menu= |1 建立哈夫曼树 |n |2 查看哈夫曼编码 |n |3 树形输出哈夫曼树 |n |4 哈夫曼文件编码 |n |5 哈夫曼文件解码 |n |6

3、 帮助 |n |7 退出系统 |n; const char helpsabout= |主要功能: |n | 利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息的传输时间,降低 |n |传输成本。但是,这要求在发送端通过一个编码系统对待传输的数据预先编码,在接收 |n |端将传来的数据进行译码(复原)。对于双工信道,每端都要有一个完整的编/译码系 |n |统。本系统即是为这样的信息收发站写一个哈夫曼码的编/译系统。 |n | |n | |n; void Huffmantree(); void Huffmancode(); void preorder(); void stringcopy()

4、; int min(); void select(); void decode(); void encode(); void int_huffmantree(); void print_end(); void print_title(); void print_menu(); void print_helpabout(); void print_huffmancode(); void print_tree();/-先序遍历-void preorder(int root,int depth) int i; for(i=1;i=depth;i+) printf( ); if(depth!=0) p

5、rintf(); else printf( ); printf(%d,HTroot.weight,depth); if(root=n) printf( : %sn,HCroot); / 依次输出哈夫曼编码 else printf(n); if(HTroot.lchild!=0) depth+;preorder(HTroot.lchild,depth); if(HTroot.rchild!=0) preorder(HTroot.rchild,depth);/-字符串拷贝函数-void stringcopy(char *strDest,char *strSrc) char *strDestCopy

6、=strDest; if (!(strDest&strSrc) printf(ERROR!); while (*strDest+=*strSrc+)!=0); /-返回哈夫曼树t的前i个结点中权值最小的树的根结点序号,函数select()调用- int min(HuffmanTree t,int i) int j,m; unsigned int k=0xffffffff; / k存最小权值,初值取为不小于可能的值 for(j=1;j=i;j+) / 对于前i个结点 if(tj.weights2) / s1的序号大于s2的 / 交换 j=s1; s1=s2; / s1是权值最小的2个中序号较小的

7、 s2=j; / s2是权值最小的2个中序号较小的 /-w存放n个字符的权值(均0),构造哈夫曼树HT- void Huffmantree(int *w) int m,i,s1,s2; HuffmanTree p; if(n=1) / 叶子结点数不大于n return ; m=2*n-1; / n个叶子结点的哈夫曼树共有m个结点 HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); / 0号单元未用 for(p=HT+1,i=1;i=n;+i,+p,+w) / 从1号单元开始到n号单元,给叶子结点赋值 / p的初值指向1号单元 (*p).weight=*w;

8、/ 赋权值 (*p).parent=0; / 双亲域为空(是根结点) (*p).lchild=0; / 左右孩子为空(是叶子结点,即单结点树) (*p).rchild=0; for(;i=m;+i,+p) / i从n+1到m (*p).parent=0; / 其余结点的双亲域初值为0 for(i=n+1;i=m;+i) / 建哈夫曼树 / 在HT1i-1中选择parent为0且weight最小的两个结点,其序号分别为s1和s2 select(HT,i-1,s1,s2); HTs1.parent=HTs2.parent=i; / i号单元是s1和s2的双亲 HTi.lchild=s1; / i号

9、单元的左右孩子分别是s1和s2 HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; / i号单元的权值是s1和s2的权值之和 /-并求出n个字符的哈夫曼编码HC-void Huffmancode() int start; unsigned int f; int i; unsigned int c; char *cd; HC=(HuffmanCode)malloc(n+1)*sizeof(char*);/ 分配n个字符编码的头指针 cd=(char*)malloc(n*sizeof(char); / 分配求编码的字符数组 cdn-1=0; for

10、(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) / c是其双亲的左孩子 cd-start=0; / 由叶子向根赋值0 else / c是其双亲的右孩子 cd-start=1; / 由叶子向根赋值1 HCi=(char*)malloc(n-start)*sizeof(char); / 为第i个字符编码分配空间 stringcopy(HCi,&cdstart); / 从cd复制编码串到HC矩阵 free(c

11、d); / 释放工作空间/-译码- void encode() FILE *fp1=NULL,*fp2=NULL; char input20=input.txt,output20=output.txt; printf(请输入输入文件名(input.txt):); scanf(%s,input); if (fp1=fopen(input,r)=NULL) printf(无此文件!); getchar(); getchar(); return ; printf(请输入输出文件名(output.txt):); scanf(%s,output); if(fp2=fopen(output,w)=NULL

12、) printf(不能创建文件!); getchar(); getchar(); return ; int i,k; unsigned int *w,p,m=0,j; for(k=0;!feof(fp1);k+) if(fgetc(fp1)= ) m+; printf(哈夫曼编码为:); fp1=fopen(input,r); w=(unsigned int*)malloc(m*sizeof(unsigned int); / 动态生成存放m个权值的空间 for(j=0;j=m-1;j+) fscanf(fp1,%d,w+j); / 依次输入原码 for(p=0;pm;p+) for(i=0;i

13、n;i+) if(*(w+p)=HTi+1.weight) fprintf(fp2,%s,HCi+1); printf(%s,HCi+1); fclose(fp1); fclose(fp2); printf(n输出完成.按任意键继续.); getchar(); getchar(); /-解码- void decode() FILE *fp1=NULL,*fp2=NULL; char input20,output20; char *code; code=(char*)malloc(n*sizeof(char); printf(请输入输入文件名(input.txt):); scanf(%s,inp

14、ut); if (fp1=fopen(input,r)=NULL) printf(无此文件!); getchar(); getchar(); return ; printf(请输入输出文件名(output.txt):); scanf(%s,output); if(fp2=fopen(output,w)=NULL) printf(不能创建文件!); getchar(); getchar(); return ; int i,j; printf(哈夫曼译码为:); for(i=0;!feof(fp1);i+) *(code+i)=fgetc(fp1); *(code+i+1)=0; for(j=0;

15、j1):); scanf(%d,&n); w=(int*)malloc(n*sizeof(int); / 动态生成存放n个权值的空间 printf(请依次输入%d个权值(整型):n,n); for(i=0;in;i+) scanf(%d,w+i); Huffmantree(w); / 根据w所存的n个权值构造哈夫曼树HT, Huffmancode(); /n个哈夫曼编码存于HC print_end(); printf(哈夫曼编码为:n); for(i=1;i=n;i+) printf(%5d: %sn,*(w+i-1),HCi); print_end(); printf(按任意键返回.); g

16、etchar(); getchar(); /-哈夫曼编码菜单-void print_huffmancode() int i; system(cls); print_title(); printf(哈夫曼编码为:n); for(i=1;i请选择17); scanf(%d,&selected); if(selected7) printf(错误的选择!(请输入17).按任意键继续.); getchar(); getchar(); switch(selected) case 1: int_huffmantree(); break; case 2: print_huffmancode(); break;

17、 case 3: print_tree(); break; case 4: encode(); break; case 5: decode(); break; case 6: print_helpabout(); break; case 7: exit(0); break; void print_title() printf(+=+n); printf(| 哈夫曼编码译码器 |n); printf(| Designed By Organne |n); printf(+=+n); void print_end() printf(+=+n); void main() int w8=5,29,7,8

18、,14,23,3,11; Huffmantree(w); / 根据w所存的n个权值构造哈夫曼树HT, Huffmancode(); /n个哈夫曼编码存于HC system(color 17); print_title(); print_menu(); 1.3 流程图主函数流程图: 1.4 实现技术 开发工具:VISCALL c+6.0;编程语言:C语言。实现步骤如下:(1)主调函数(2)建立HuffmanTree(3)生成Huffman编码并写入文件(4)电文译码运行结果如下:注意:此处应采用软件截图说明!1.5 设计结论和心得在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内

19、容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

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

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