数据结构c语言版胡学刚答案,哈夫曼树的建立与实现(最终版)最新版-程序员宅基地

技术标签: 数据结构c语言版胡学刚答案  

《哈夫曼树的建立与实现.doc》由会员分享,可免费在线阅读全文,更多与《哈夫曼树的建立与实现(最终版)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。

1、字母的总数str[j]=i+;送对应的字母到数组中cnt[j]=tem[i];存入对应字母的权值}returnj;j是输入字母总数}voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){构造哈夫曼树HTinti,s,s;for(i=;ilt=*num;i++){初始化HT,*num是指哈夫曼树所有的结点数目HT[i]lchild=;HT[i]rchild=;初始化为根结点HT[i]arent=;HT[i]weight=;初始化为根结点}for(i=;ilt=num;i++)输入num个叶子结点的权值HT[i]weight=cnt[i];赋权值for(i=num+;ilt=*num;i++){select(HT,i,s,s);在ht[k]中选择arent为且权值最小的两个根结点HT[s]arent=i;HT[s]arent=i;其序号为s和sHT[i]lchild=s;HT[i]rchild=s;i为双亲HT[i]weight=+;送对应字母到数组中

2、lect(HuffmanTreeT,intk,intams,intams){选取最小的根结点的函数inti,j;s=s以s和s作为两个最小节点的变量for(i=;i=’A’amam*lt=’Z’)k=*;找到该字母的位置tem[k]++;}统计各种字符的个数for(i=,j=;ilt=;++i)if(tem[i]!=){j++;str[j]=清华大学出版社,[]苏仕华数据结构课程设计[M]机械工业出版社,[]谭浩强C语言程序设计教程[M]高等教育出版社,致谢对于老师详细的指导和同学们的积极配合予以感谢,同时对各个参考文件的提供出版社以真诚的感谢。附录includeincludeincludeinclude*********************类型相关变量的定义****************************definen叶子结点数definem*n哈夫曼树中的结点数tyedefstruct{charch;相关的字母charbits[];存放编码位串intlen;该字母编码的长度}CodeNode;编码的类型ty

3、edefCodeNodeHuffmanCode[n+];所有的叶子结点的编码数组tyedefstruct{intweight;权值intlchild,rchild,arent;左右孩子及双亲指针}HTNode;哈夫曼树结点的类型tyedefHTNodeHuffmanTree[m+];号单元不用intnum;统计每种字母出现的次数和种类数目**************************建立HuffmanTree**************************voidselect(HuffmanTreeT,intk,intams,intams){在ht[k]中选择arent为且权值最小的两个根结点的算法其序号为s和sinti,j;intmin=;min的数字无何意义只是初始值之后用来记录权值,i为循环最小权值的下标,k为数组结点的总数for(i=;i='A'amam*lt='Z')k=*;找到字母在数组中的下标tem[k]++;字母个数累加}}for(i=,j=;ilt=;++i)if(tem[i]!=){j++;j

4、行和的赋值,进而可以对每一个权值所对应的位置进行编码。图哈夫曼算法实现流程图⑸哈夫曼编码是通过对构成最优二叉树的结点进行有规律的和的编码,之后从根结点往下进行不断地延伸,且在延伸的过程中会途径所有的结点并记住每一个结点所对应的数值开始读取输入的数据统计字符的频率输入字符排序建立哈夫曼树输入字符编码结束是还是并进行记录,进而可以将每个途径的结点所对应的数值记录在数组中。直到所有的结点都遍历了一遍的时候,整个编码的过程也就完成了,而此时数组中所存储的,代码便是每一个结点所对应的编码图哈夫曼编码流程图()构造哈夫曼树其实就是对以上已经建立好的权值利用哈夫曼算法把它建立成一个最优二叉树即哈夫曼树。其详细的过程是通过比较权值域来选取最小的两个权值,进行一步步的合并和删除直到权值域中只剩下唯一的一个所谓的权值时,则整个哈夫曼树的构造便顺利的完成了,而这唯一的一个权值便是整棵二叉树的根结点。开始数组初始化当前位置编码当前位置进数组换下一个位置切换下一个位置继续是否为终点结果查找,输出数组空结束是是图哈夫曼树构造流程图详细设计各模块分别为

5、这两个最小的权值合并成为双亲结点之后在将插入到权值域中,同时将此两个最小的结点删除。按照此方法一步步的运行下去最终使得权值域中只剩下唯一的一个权值,至此最优二叉树便建立好了。并且这个最后的结点便是整棵二叉树中的根结点,在本例子中便是整棵最优二叉树的根结点。图哈夫曼树示意图学年设计总结与体会本学年设计的主要目的是要建立一个哈夫曼树并将其实现。通过构建哈夫曼编码结构体来解决一系列因编码带来的复杂问题。同时利用几个数组来存储字符出现的频率和种类。且在此过程中也用到了哈夫曼编码函数和哈夫曼构建函数等,因而使得整个程序繁而不乱有条不紊的编辑和运行在此次的学年设计中,对于构建哈夫曼树主要的思想是通过记录文件中字符的频率来作为在哈夫曼树构造中必不可少的权值,再根据权值来构造哈夫曼树,进而根据这棵建好的哈夫曼树来进行字符编码,并将其存储在所对应的文件中。参考文献[]严蔚敏,胡学刚数据结构(C语言版)[M]主调函数建立HUFFMANTREE生成HUFFMAN树并写入文件调试与操作说明读出文本输出哈夫曼树存储结构的初态输出哈夫曼树存储结构的终

6、HT[s]weight+HT[s]weight;}for(i=;ilt=num;i++)输入字符集的中字符HC[i]ch=str[i];字符的种类i=;while(ilt=num)rintf(quot字符%c次数:%d\nquot,HC[i]ch,cnt[i++]);}*************************生成Huffman树并写入文件*****************voidHuffmanEncoding(HuffmanTreeT,HuffmanCodeH){根据哈夫曼树T求哈夫曼编码Hintc,,i;c和分别指示t中孩子和双亲charcd[n];临时存放编码串,n为字母总数intstart;指示码在cd中的起始位置cd[num]='\';num为叶子结点的总数for(i=;i){直至上溯到t[c]是树根为止若t[c]是t[]的左孩子,则生成,否则生成cd[start]=(T[]lchild==c)?'':'';c=;使得可以进行循环}strcy(H[i]bits,amcd[start]);H[i]len=n

7、str为编码的指针for(i=;ilt=num;i++)if(HC[i]ch==*str){for(j=;jlt=HC[i]len;j++)Futc(HC[I]bits[j],f);eak;}str++;}fclose(f);将文件关闭}调试与操作说明本次测试是通过建立一个名为filetxt的文本文档,其中有一篇英文字母的文章期望程序能将其读出至界面并实现其它相关的功能。运行程序后,我们可以见到以下运行界面。读出文本从filetxt中读取刚输入的字符串并将其输出到显示屏如图所示。图读出文本示意图输出哈夫曼树存储结构的初态下图所示的为哈夫曼树的初态。其中的每行数字分别表示字符的权值,字符的双亲,字符的左孩子,字符的右孩子,而本图为哈夫曼树的初始化如图所示。图哈夫曼树的初态图输出哈夫曼树存储结构的终态该图为哈夫曼树的终态。本图显示的是哈夫曼树的构建以后的其字符的权值,双亲下标,左孩子,右孩子如图所示。图哈夫曼的终态图图哈夫曼树的终态图输出哈夫曼树构成后的抽象图此图的构成首先是从权值域中选取最小的两个权值,在此例中其分别为、通过

8、母的首地址FILE*f;文件的指针if((f=foen(quotfiletxtquot,quotrquot))==NULL)判断该文件是否为空,若是则判空rintf(quot不能打开文件!\nquot);while(fgets(string,,f)!=NULL)rintf(quot%s\nquot,string);将所有的字母进行输出fclose(f);关闭文件return;}voidmain(){charstring[];用来存储所有的字母char*s,str[];intcnt[];用来存储字母的权值HuffmanTreeHT;定义哈夫曼树HuffmanCodeHC;定义哈夫曼结点rintf(quot读出文本为:\nquot);fileoen(string);打开字符串所在地文件num=jsq(string,cnt,str);统计字符的种类及各类字符出现的频率DhuffmanTree(HT,cnt,str);构造哈夫曼树rintf(quot\nquot);rintf(quotHuffmanTree的初态:\nquot);

9、主调函数、建立HuffmanTree、生成HuffmanTree并写入文件。具体过程如下:主调函数代码解释:这是main函数里的各个函数调用情况。fileoen(string);从C盘内中读取文件num=jsq(string,cnt,str);统计字符种类及各类字符出现的频率DhuffmanTree(HT,cnt,str);rintf(“HuffmanTree的初态:\n”);rint(HT);输出哈夫曼树的初态ChuffmanTree(HT,HC,cnt,str);建立哈夫曼树HuffmanEncoding(HT,HC);生成哈夫曼树rintf(“HuffmanTree的终态:\n”);rint(“HuffmanTree的终态:\n”);输入所有权值比较求出两个最小的权值以此两个权值作为左右孩子合并成一棵树,并将这棵树放入到权值域中,且将这两个最小权值删去。权值域的个数为?是哈夫曼树构造成功否结束建立HuffmanTree代码解释:该函数为在ht[lk]中选择atent为且权值最小的根结点的算法,其序号为s和svoids

10、umstart;}}voidcoding(HuffmanCodeHC,char*str){对str所代表的字符串进行构建哈夫曼树并写入文件inti,j;FILE*f;定义文件的指针f=foen(quotcodefiletxtquot,quotwquot);打开文件的函数while(*str){for(i=;ilt=num;i++)if(HC[i]ch==*str){for(j=;jlt=HC[i]len;j++)futc(HC[i]bits[j],f);eak;}str++;}fclose(f);关闭文件}***************输出HuffmanTree存储结构*********************voidrint(HuffmanTreeHT){intx;for(x=;x=str[i]){HT[i]weight=(char)'*';}}}**************************打开文本************************intfileoen(charstring[]){string[]为

11、cnt[j]=tem[i];存入对应字母的权值}returnj;j是输入字母总数}代码解释:下面函数用来构造哈夫曼树HT。首先初始化哈夫曼树,然后输入前面统计的各个结点的权值,用for循环来构造哈夫曼树。voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){inti,s,s;for(i=;i){直至上溯到t[c]是树根为止Cd[start]=(T[]lchild==c)?’’:’’;c=;}若t[c]是t[]的左孩子则生成;否则生成Strcy(H[i]bits,*cde[start]);H[i]len=numstart;}}代码解释:对str所代表的字符串进行构建哈夫曼树并写入文件。将翻译的二进制码写入文本文件。voidcoding(HuffmanCodeHC,char*str)对str所代表的字符串进行编码并写入文件{inti,j;FILE*f;定义文件的指针f=foen(“codefiletxt”,”w”);打开文件的函数while(*str)

12、输出哈夫曼的初态rint(HT);ChuffmanTree(HT,HC,cnt,str);建立哈夫曼树HuffmanEncoding(HT,HC);生成哈夫曼树coding(HC,string);建立电文哈夫曼编码文件rintf(quot\nquot);rintf(quotHuffmanTree的终态:\nquot);输出哈夫曼的终态rint(HT);rintf(quot*************************\nquot);}评语:评阅教师签名:年月日成绩e(){初始化;利用此函数构造出哈夫曼树for{接受命令;处理命令;}输出字符统计情况;}说明:构造哈夫曼树⑶输出哈夫曼树的存储结构的初态和终态分别调用rint()和rint()来实现voidrint(参数){输出哈夫曼树的初态初始化;输出初态;}说明:输出哈夫曼树的初态voidrint(参数){输出哈夫曼树的终态for{输出终态;}}说明:输出哈夫曼树的终态⑷哈夫曼算法是通过对输入数据的统计,根据其频率来构造出权值,再通过对构造的权值进行建立哈夫曼树。并对其

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30820933/article/details/117040007

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文