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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

完整word版Huffman编码报告.docx

1、完整word版Huffman编码报告 数据结构课程设计上机实习报告课 设 题 目Huffman编码和解码班 级学 生 姓 名学 号指 导 教 师时 间2015.122015。1一、设计目的1.进一步熟悉C语言开发环境,熟悉用C语言完成一个应用程序的设计过程,掌握有关编辑、调试和整合程序的方法和技巧.2.通过此设计,了解数据结构课程中霍夫曼编码的的有关内容,明确其操作,熟悉其设计,同时学习到有关位向量的内容,对文件掌握加深二、设计内容Huffman编码与解码 (必做)(Huffman编码、二叉树)问题描述对一篇英文文章(大于2000个英文字符),统计各字符出现的次数,实现Huffman编码,以及

2、对编码结果的解码.基本要求(1) 输出每个字符出现的次数和编码,其中求最小权值要求用堆实现。(2) 在Huffman编码后,要将编码表和英文文章编码结果保存到文件中,编码结果必须是二进制形式,即0 1的信息用比特位表示,不能用字符0和1表示.(3) 提供读编码文件生成原文件的功能。三、数据结构说明在该程序中我仅仅使用了两个结构体来完成编码,用位域来实现bite流存储:const int MAXSIZE=300;/定义一次分配的Huffman储存单词最大量为500 const int OVERFLOW = 0;const int ERROR = 0;const int LineCountNum=

3、500;typedef struct WordCount char Word;/存放字符 int freq; int parent , lchild , rchild;/存放亲子节点位置 int place;/用来保存第一次堆排序后,建立霍夫曼表前的相对位置 char *HuffmanCode;/存放霍夫曼编码 WordCount , *WC;/存放单词结点的结构体typedef struct HuffmanTree WC w; int Number;/存储有多少数据存入 HuffmanTree , *HTree; typedef struct unsigned int a:1;bite;/设

4、置位段,存储一个bite /*操作函数声明*void InitHuffmanTree(HTree &H);/初始化霍夫曼树 void HeapSort(WC &W , int Number , int choice);/堆排序核心函数void HeapAdjust(WC &W , int down , int up , int choice);/堆排序调整函数,实现两种排序 void HuffmanCoding(HTree H , WC HT); /求霍夫曼树和霍夫曼编码表void ShowHuffmanTree(HTree H);/输出霍夫曼树 void Select(WC W , int

5、i , int s1 , int s2);/选择1-i1之间最小的两个数,且parent为0,用s1,s2返回 void GetTheDeCode(HTree H);/将编码结果写入函数 void PutTheDeCode(FILE fp1 , FILE fp2);/将编码结果解码得到文章 void CountTheWord(HTree &H , FILE fp);/记录单词权值 void ShowTheEassy(FILE wp);/展示文章四、详细设计1.首先我给出了编码和解码的菜单供其选择2.在编码功能中,我先通过CountTheWord()函数进行单词权值记录,然后进入编码功能,值得一

6、提的是,编码时我给堆排序设计了两种排序形式-对权值的排序和对位置的排序,以达到选择两个最小的权值结点的最优时间复杂度的目的,此功能通过switch实现,但要给编码结构体中放置一个place空间,这也从侧面反映了时间和空间矛盾的地方(值得一提的是,有些编码并不可见且有特殊含义,如换行符,所以将字符放入文件中时,并不对其进行处理,读出是进行顺序读出)3.编码结束后将编码结果,对应字符分别存放在文件中,然后对整篇文章进行编码4.解码时依据霍夫曼编码的唯一性进行比较求解,遇到同样的字符即返回对应的字母并写入解码文件中五、调试与测试(测试数据:献给艾米莉的玫瑰)1.首先打开文件进行字符权值统计并输出结果

7、(有些符号不可见,所以无法显示)2.然后对其进行堆排序3.输出编码表,及其对应亲子关系(#号代表为父结点)4.输出编码结果(可以轻易看出编码具备唯一性)5.将编码写入文件,一下显示文件部分内容位域存储的bite编码文档编码对应的字符顺序存储(可以看到因为换行符的 存在,自动换行了)6.解码(将文章在命令行显示,也写入了翻译文档(以doc格式保存)六、课程设计总结本次程序设计过程中遇到过许多大大小小的问题,也在设计思路上遇到过难题,但都在各方面的努力下得到了解决。一些问题如下:1.Bite形式保存由于以前没学到过位向量的内容,有一段时间无法实现这个功能,后来在网络上偶然接触到位域的内容,认识到其

8、可行性,于是解决了此问题2.选择最小的两个权值一开始我认识的这个可能很复杂,又联想到堆排序可以对其有序输出,但我又不想改变其位置,所以增设一个place记录一开始的编码表位置,进行编码时改变后可以轻易还原总结:霍夫曼编码在通信领域内是十分重要的内容,对其的掌握既能帮助我们理解二叉树的重要性,也能为我们未来工作提供一个更广阔的舞台七、附录/ *题目:Huffman编码的编码和解码 *作者:杨欢 *学号:161420325 *完成时间:2015-12-30 算法思想:以书上的霍夫曼算法为核心进行文章(所有内容,包括标点,换行符,所以命令行可能无法显示部分字符)编码和解码. 对于比特位的存储,我选择

9、用位域进行简单方便的操作。文件的读写都以最基本的方式进行. 测试文章上,我选择艾米莉的玫瑰这一小说测试,数据量大,可以验证程序的正确性 */includestdio。h#includestdlib.h#includestring。hconst int MAXSIZE=300;/定义一次分配的Huffman储存单词最大量为500 const int OVERFLOW = 0;const int ERROR = 0;const int LineCountNum=500;typedef struct WordCount char Word;/存放字符 int freq; int parent , l

10、child , rchild;/存放亲子节点位置 int place;/用来保存第一次堆排序后,建立霍夫曼表前的相对位置 char *HuffmanCode;/存放霍夫曼编码 WordCount , *WC;/存放单词结点的结构体typedef struct HuffmanTree WC w; int Number;/存储有多少数据存入 HuffmanTree , *HTree; typedef struct unsigned int a:1;bite;/设置位段,存储一个bite /*操作函数声明*void InitHuffmanTree(HTree H);/初始化霍夫曼树 void Hea

11、pSort(WC &W , int Number , int choice);/堆排序核心函数void HeapAdjust(WC &W , int down , int up , int choice);/堆排序调整函数,实现两种排序 void HuffmanCoding(HTree H , WC HT); /求霍夫曼树和霍夫曼编码表void ShowHuffmanTree(HTree H);/输出霍夫曼树 void Select(WC &W , int i , int s1 , int s2);/选择1i1之间最小的两个数,且parent为0,用s1,s2返回 void GetTheDeC

12、ode(HTree H);/将编码结果写入函数 void PutTheDeCode(FILE *fp1 , FILE fp2);/将编码结果解码得到文章 void CountTheWord(HTree &H , FILE *fp);/记录单词权值 void ShowTheEassy(FILE wp);/展示文章 /*主函数*int main() FILE fp , *wp; HTree H; WC HT;/存放编码表 printf(*菜单*n) ; printf(*1.编码文档*n); printf(”*2.解码文档*n); printf(”*0.退出*n”); printf(”请输入您的选择

13、:); int choice; scanf(%d ,choice); getchar(); while(choice != 0) switch(choice) case 1: InitHuffmanTree(H); if(!(fp = fopen(献给艾米莉的玫瑰。txt” , r”)) /以文本文件形式打开文件 printf(此文件不存在n”); exit(ERROR); printf(文件打开成功n”); CountTheWord(H , fp); printf(”按任意键统计该文章各字符出现的频率为n); getchar(); ShowHuffmanTree(H); printf(按任意

14、键开始堆排序n”); getchar(); HeapSort(H-w , HNumber , 1);/对频率排序 printf(”按任意键输出堆排序后的情况n”); getchar(); ShowHuffmanTree(H); printf(”现在开始进行霍夫曼树的构建和霍夫曼编码的构建n); HuffmanCoding(H , HT); printf(”输入任意键输出霍夫曼编码表:); getchar(); printf(”字符 位置 权值 左孩子 右孩子 父亲n); for(int i=1 ; i=2HNumber ; +i) printf(c %d d %d %d %dn , HTi。W

15、ord , i , HTi.freq ,HTi。lchild , HTi.rchild , HTi。parent); printf(按任意键输出构建的霍夫曼编码结果:”); getchar(); for(int i=1 ; iNumber ; +i) printf(c 对应的编码为 %sn” , Hwi.Word , Hwi.HuffmanCode); printf(按任意键将结果写入文件n); getchar(); GetTheDeCode(H); free(H);/释放空间,避免影响 break; case 2: PutTheDeCode(fp , wp); printf(该英文文章为n)

16、; ShowTheEassy(wp); printf(n); fclose(fp); break; case 0: break; printf(”请输入您的选择:); scanf(%d” ,choice); getchar(); return 0; /*操作函数实现*void InitHuffmanTree(HTree H) if(!(H = (HuffmanTree *)malloc(sizeof(HuffmanTree))) exit(OVERFLOW); if(!(H-w = (WC)malloc(sizeof(WordCount)*MAXSIZE))) exit(OVERFLOW);/

17、创建结点 HNumber = 0;/*将结果写入文件* void GetTheDeCode(HTree H) FILE *fp , *wp; /*将编码表写出* if(!(fp = fopen(”编码表文档.txt , w”) /以二进制方式写出文章编码 printf(”此文件不存在n”); clearerr(fp); exit(ERROR); for(int i=1 ; i=HNumber ; +i) fprintf(fp , sn” , Hwi。HuffmanCode); fclose(fp); if(!(fp = fopen(”编码表对应单词文档.txt , ”w)) /以二进制方式写出

18、文章编码 printf(”此文件不存在n”); clearerr(fp); exit(ERROR); for(int i=1 ; i=H-Number ; +i) fprintf(fp , c , H-wi.Word); /因为存在换行符,需要进行读取换行符,所以不进行分行存储 fclose(fp); /*将编码文档写出* if(!(fp = fopen(献给艾米莉的玫瑰.txt , ”r)) /打开文章进行对比写出编码结果 printf(此文件不存在n”); clearerr(fp); exit(ERROR); if(!(wp = fopen(”编码文档.txt , ”wb) /以二进制形式

19、写出编码文档 printf(”此文档不存在n”); clearerr(wp); exit(ERROR); bite Save; while(!feof(fp)) char Count; fscanf(fp , ”%c , &Count); for(int i=1 ; iwi。Word) /寻找到匹配的,得到其字符编码,现在将其以Bite位写出到文件 for(int j=0 ; jwNum。Word = fgetc(fp); +Num; fclose(fp); /*翻译* if(!(fp = fopen(编码文档。txt” , rb”))) /以二进制读取编码文档 printf(”此文件不存在n

20、”); clearerr(fp); exit(ERROR); if(!(wp = fopen(翻译文档。doc” , w”)) /写出文章编码 printf(”此文件不存在n”); clearerr(wp); exit(ERROR); bite Put;/位段,用来将字符读出 Num = Num2;/存储了多余的换行符并且多加了一次,还原真实数目 int NumberCount = strlen(H-wNum。HuffmanCode);/存放最小的霍夫曼编码数,减小后面的比较次数 int CT , i=0 ,j=1; while(!feof(fp) if(i NumberCount) /从最小

21、字符串开始可以减少循环 fread(Put , sizeof(bite) , 1 , fp); if(Put.a = 1) Counti = 1; else Counti = 0; +i; else while(j Num) /代表当前编码不是霍夫曼编码,继续读入编码 fread(&Put , sizeof(bite) , 1 , fp); if(Put。a = 1) Counti = 1; else Counti = 0; j = 1; +i; fclose(fp); fclose(wp); /*解码文章输出*void ShowTheEassy(FILE *wp) if(!(wp = fop

22、en(翻译文档。doc , r))) /写出文章编码 printf(此文件不存在n); clearerr(wp); exit(ERROR); char LineLineCountNum; while(!feof(wp)) fgets(Line , LineCountNum , wp); printf(s , Line); memset(Line , 0 , sizeof(char)*strlen(Line);/清零 /*存储单词* void CountTheWord(HTree H , FILE fp) int WordNumCount = 1;/单词结点记载 int jcount;/单词重复比较操作时的临时变量 char LineCountLineCountNum;/读入文章时规定一行最

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

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