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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计Huffman编译码器.docx

1、数据结构课程设计Huffman编译码器课程设计(论文)任务书 软件 学院软件工程专业2010 - 3班 一、课程设计(论文)题目数据结构课程设计(A)二、课程设计(论文)工作自 2011 年 12月 22日起至 2011 年 12月 23 日止。三、课程设计(论文) 地点: 软件学院机房 四、课程设计(论文)内容要求:1本课程设计的目的(1)使学生熟练掌握抽象数据类型的组织和定义; (2)使学生熟练掌握数据类型的定义和实现; (3)培养学生组织和分析数据的能力;(4)培养学生分析和应用基于不同数据结构的算法的能力;(5)提高学生的科技论文写作能力。2基本要求:每位同学在以下题目中任选一题(在方

2、框中打勾),独立完成课程设计: 集合的并交差运算:参见数据结构题集P80。 赫夫曼编/译码器:参见数据结构题集P149。 井字棋:参见数据结构教材P2。设计棋谱,当对方落子后,能从棋谱中选择一种应对方式,并能判断胜负。3课程设计论文编写要求(1)要按照书稿的规格打印誊写课设报告;(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;学生签名: 2011年 12月 23 日课程设计(论文)评审意见(1)题目分析 (20分):优()、良()、中()、一般()、差(); (2)流程分析 (30分):优()、良()、中()、一般()、差(); (3)数据定义 (30分):优()、良

3、()、中()、一般()、差();(4)代码编写 (10分):优()、良()、中()、一般()、差();(5)创新能力 (10分):优()、良()、中()、一般()、差();(6)格式规范性、设计态度及考勤是否降等级:是()、否()评阅人: 职称: 讲 师 2012年 1 月 5 日一、数据结构定义1.抽象数据类型本设计中用到的数据结构ADT定义如下: ADT HuffmanTree 数据对象D:D是具有相同特性的数据元素集合。 数据关系R: 若D为空,则R为空,称Huffmantree为空赫夫曼树。 若D不为空,则R=H,H是如下的二元关系: 在D中存在惟一的称为根的数据元素,它在关系H下无前

4、驱; 若,则存在,且; 若,则中存在惟一的元素,,且存在 上的关系;若,则中存在惟一的元素, ,且存在上的关系, ; 是一棵符合本定义的赫夫曼树,称为根的左子树, 是一棵符合本定义的赫夫曼树,称为根的右子树; 基本操作P: InputHuffman(Huffman Hfm) 操作结果:输入并存储字符和相应权值。 Select(HuffmanTree HT,int end,int *s1,int *s2) 初始条件:频率数组已经建立。 操作结果:选择HT1.i-1中无双亲且权值最小的两个节点,其序 号为s1,s2。 HuffmanCoding(Huffman Hfm) 初始条件:频率数组已经建立

5、。 操作结果:w存放n个字符的权值(均0),构造赫夫曼树HT,并 求出n个字符的构造赫夫曼编码HC。 InitHuffman(Huffman Hfm) 初始条件:频率数组已经建立。 操作结果:要求用户输入字符和相应权值,初始化赫夫曼数 Encoding(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作结果:利用已建好的Huffman树(如不在内存,则从文件 hfmTree中读入),对文件ToBeTran中的正文进行编码, 然后将结果存入文件CodeFile中。 Decoding(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作

6、结果:利用已建好的Huffman树将文件CodeFile中的代码进 行译码,结果存入文件TextFile中。 Print(Huffman Hfm) 初始条件:霍夫曼树HoffmanTree已经存在。 操作结果:将文件CodeFile以紧凑格式显示在终端上,每行50个 代码。 Treeprint(Huffman Hfm) 初始条件:霍夫曼树HuffmanTree已经存在。 操作结果:将已在内存中的哈夫曼树以凹入表的形式显示在终端上 同时将此字符形式的哈夫曼树写入文件TreePrint中。 ADT HuffmanTree;2.存储结构定义数据存储结构的C语言定义如下:ypedef char *Hu

7、ffmanCode; /动态分配数组存储哈夫曼表码表typedef struct unsigned int weight; unsigned int parent,lchild,rchild;HTNode,*HuffmanTree; /动态分配数组存储哈夫曼树typedef struct HuffmanTree HT; char *c; int length; HuffmanCode HC;Huffman;Huffman Hfm; /全局结构体变量,来存储字符与代码3.基本操作数据结构的基本操作实现如下:/*输入函数,控制用户输入字符和相应权值*/Huffman InputHuffman(Hu

8、ffman Hfm) int i,n; printf(nn*Initialization*n); printf(The chars and weights will be saved in the file :hfmTree n); printf(Please input the number of the chars: ); scanf(%d,&n); if(n=1) /*若只有一个数值则无需编码*/ printf(Only One Char!There Is No Need For Coding!); printf(n); printf(Please input the number of

9、 the chars: ); scanf(%d,&n); Hfm.HT=(HuffmanTree)malloc(2*n)*sizeof(HTNode); Hfm.c=(char *)malloc(n+1)*sizeof(char); for(i=1;i=n;i+) printf(Please input the char: ); scanf(%s,&Hfm.ci); printf(Please input the weight of the char: ); scanf(%d,&Hfm.HTi.weight); Hfm.HTi.parent=0; Hfm.HTi.lchild=0; Hfm.H

10、Ti.rchild=0; for(;i=2*n-1;+i) Hfm.HTi.weight=0; Hfm.HTi.parent=0; Hfm.HTi.lchild=0; Hfm.HTi.rchild=0; Hfm.length=n; return Hfm;/*选择HT1.i-1中无双亲且权值最小的两个节点,其序号为s1,s2*/void Select(HuffmanTree HT,int end,int *s1,int *s2) int i; int min1=MAX_NUM; int min2; for (i=1;i=end;i+)/遍历查找权值最小的结点S1 if (HTi.parent=0

11、&HTi.weightmin1) *s1=i; min1=HTi.weight; min2=MAX_NUM; for(i=1;iHTi.weight) *s2=i; min2=HTi.weight; /* 存放n个字符的权值(均0),构造哈夫曼树HT,* 并求出n个字符的构造哈夫曼编码HC*/Huffman HuffmanCoding(Huffman Hfm) int i,n,m,s1,s2,start; int c,f; char *cd; n=Hfm.length; if(n=1) return Hfm; m=2*n-1; for(i=n+1;i=m;+i) Select(Hfm.HT,i

12、-1,&s1,&s2); Hfm.HTs1.parent=i; /修改父亲位置 Hfm.HTs2.parent=i; Hfm.HTi.lchild=s1; /修改孩子位置 Hfm.HTi.rchild=s2; /*父亲结点权值为左右孩子权值之和*/ Hfm.HTi.weight=Hfm.HTs1.weight+Hfm.HTs2.weight; /*从叶子结点到根逆向求每个字符的哈夫曼编码*/ Hfm.HC=(HuffmanCode)malloc(n+1)*sizeof(char *); cd=(char *)malloc(n*sizeof(char); /分配求编码的工作空间 cdn-1=0;

13、 /编码结束符 for(i=1;i=n;+i) /逐个字符求哈夫曼编码 start=n-1; /编码结束符位置 /*从叶子到根逆向求编码*/ for(c=i,f=Hfm.HTi.parent;f!=0;c=f,f=Hfm.HTf.parent) if(c=Hfm.HTf.lchild) cd-start=0; else cd-start=1; Hfm.HCi=(char *)malloc(n-start)*sizeof(char); strcpy(Hfm.HCi,&cdstart);/从cd复制编码到Hfm.HC free(cd);/释放工作空间 return Hfm;/*初始化哈夫曼数,要求

14、用户输入字符和相应权值*/Huffman InitHuffman(Huffman Hfm) int n,i;char x; FILE *fp; fp=fopen(hfmTree.txt,r+);/对文件hfmTree以读文本的形式打开 if(fp=NULL) printf(Open hfmTree.txt error!); Hfm=InputHuffman(Hfm); fp=fopen(hfmTree.txt,w+); fprintf(fp,%dn,Hfm.length); for(i=1;i=Hfm.length;i+) fprintf(fp,%c %d ,Hfm.ci,Hfm.HTi.we

15、ight); rewind(fp); fclose(fp); Hfm=HuffmanCoding(Hfm); return Hfm;void Encoding(Huffman Hfm) int i=0,j=0,n; char chMAX; FILE *fp,*fw; n=Hfm.length; printf(nn*Encoding*nn); if(fw=fopen(ToBeTran.txt,r+)=NULL) printf(nPlease input the sentence: ); scanf(%s,ch); printf(n); fp=fopen(CodeFile.txt,w+); els

16、e fscanf(fw,%s,ch); fclose(fw); while(chj) for(i=1;ilchild|p-rchild) if(dj=0) i=p-lchild; p=&Hfm.HTi; else i=p-rchild; p=&Hfm.HTi; j+; printf(%c,Hfm.ci); fprintf(fp,%c,Hfm.ci); printf(n); fclose(fp);void Print(Huffman Hfm) int i,n; int m=1 ;/计数器 char ch; FILE* fprint,fp; n=Hfm.length; printf(nn*Outp

17、ut the code of the chars*n); for(i=1;i=n;i+)/显示每一个字符对应的哈夫曼编码 printf(n); printf(Char: %ct,Hfm.ci); printf(Weight: %dt,Hfm.HTi.weight); printf(Code: ); puts(Hfm.HCi); fprint=fopen(CodeFile.txt,rb);/fp=fopen(CodePrint.txt,w+); while ( feof(fprint)=0 ) ch=fgetc(fprint); printf(%c,ch); /fprintf(fp,%c,ch)

18、; m+; if (m%50=0)/保证每一行输出50个字符 printf(n); printf(nn); fclose(fprint);void Convert_tree(unsigned char T100100,int s,int *i,int j) int k,m;Huffman Hfm; m=+(*i); for(k=0;ks;k+) Tmk= ; Tmk=Hfm.HTj.weight; if(Hfm.HTj.lchild) Convert_tree(T,s+1,i,Hfm.HTj.lchild); if(Hfm.HTj.rchild) Convert_tree(T,s+1,i,Hf

19、m.HTj.rchild); Tm+k=0;void Treeprinting(Huffman Hfm) unsigned char T100100; int n=Hfm.length; int i,j,m=0; FILE *fp; Convert_tree(T,0,&m,2*n-1); if(fp=fopen(treeprint.txt,wb+)=NULL) printf(Open file treeprint.txt error!n); printf(n以凹入表形式打印已建好的赫夫曼树:n); for(i=1;i=2*n-1;i+) for (j=0;Tij!=0;j+) if(Tij=

20、) printf( ); fputc(Tij,fp); else printf(%d,Tij); fprintf(fp,%dn,Tij); printf(n); fclose(fp); printf(n此字符形式的哈夫曼树已写入文件treeprint.txt中.nn);二、解题过程1.问题分解该问题主要应实现以下功能:(1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个 权值,建立赫夫曼树,并将它存于文件hfmTree中。(2) E:编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree 中读入),对文件ToBeTran中的

21、正文进行编码,然后将结果存入文件 CodeFile中。(3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进 行译码,结果存入文件Textfile中。(4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行 50个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5) T:印赫夫曼树(Tree printing)。将已在内存中的赫夫曼树以直观的方式(比 如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。2.模块结构系统主要由 6个模块组成,如图所示:模块之间的结构如下:3.解题思路各模块

22、的实现步骤为:.主程序main() InitHuffman(Huffman Hfm); Encoding(Huffman Hfm); Decoding(Huffman Hfm); Print(Huffman Hfm); Treeprint(Huffman Hfm);.其他模块:void Select(HuffmanTree HT,int end,int *s1,int *s2) FOR (i=1;i*s1 IF(HTi.parent是次最小的) THEN HTi.parent*s2 Huffman HuffmanCoding(Huffman Hfm) FOR(i=n+1;i=2*n-1;+i)

23、 Select(Hfm.HT,i-1,&s1,&s2); 修改父亲位置; 修改孩子位置; 父亲结点权值为左右孩子权值之和; /*从叶子结点到根逆向求每个字符的赫夫曼编码*/ FOR(i=1;i=n;+i) /逐个字符求赫夫曼编码 start=n-1; /编码结束符位置 for(c=i,f=Hfm.HTi.parent;f!=0;c=f,f=Hfm.HTf.parent) IF(c=Hfm.HTf.lchild) cd-start=0; ELSE cd-start=1; 再从cd复制编码到Hfm.HC RETURN Hfm;Huffman InitHuffman(Huffman Hfm) 对文件

24、hfmTree以读文本的形式打开 IF(fp=NULL) 调用InputHuffman函数,用户输入字符和相应权值存入赫夫曼数中 ELSE 输出The Huffmantree has already existed!nPlease choose again!nn); 读入hfmTree中文本 FOR(i=1;i=n;i+) 作为独立结点对结点的parent,lchild,rchild分别赋值0 FOR(;i=2*n-1;+i) 作为独立结点对结点的weight,parent,lchild,rchild分别赋值0 Hfm=HuffmanCoding(Hfm); RETURN Hfm;void Encoding(Huffman Hfm) 输出nn*

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

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