下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include stdlib.h #define MAXBIT 10#define MAXVALUE 10000#define MAXLEAF 100#define MAXNODE MAXLEAF*2-1 /定义哈夫曼树编码类型typedef struct char bitMAXBIT; /存放叶子结点字符编码过后的二进制编码 int start; /存放叶子结点二进制编码在bit数组里的起始数组位置int length; /存放二进制编码的位数HFMCode; /定义哈夫曼树结点类型typedef struct char data; /编码字符int weight; /哈
2、夫曼树结点的权值int parent; /哈夫曼树结点的父结点int lchild; /哈夫曼树结点的左孩子int rchild; /哈夫曼树结点的右孩子HFMNode; /构造哈夫曼树void createHFMTree(HFMNode hfmnodeMAXNODE,int n) int i,j,m1,m2,x1,x2; for(i=0;i2*n-1;i+) hfmnodei.weight=0; hfmnodei.parent=-1; hfmnodei.lchild=-1; hfmnodei.rchild=-1; for(i=0;in;i+) getchar();printf(请输入第%d片
3、叶子的字符:,i+1); scanf(%c,&hfmnodei.data);printf(请输入第%d片叶子的权重:,i+1); scanf(%d,&hfmnodei.weight); for(i=0;in-1;i+) m1=m2=MAXVALUE; /m1和m2分别用来存储叶子结点权值的最小值和次小值x1=x2=0; /x1和x2分别用来存储m1和m2的位置for(j=0;jn+i;j+) if(hfmnodej.weightm1&hfmnodej.parent=-1) m2=m1;x2=x1;m1=hfmnodej.weight;x1=j; else if(hfmnodej.weightm
4、2&hfmnodej.parent=-1) m2=hfmnodej.weight;x2=j; hfmnodex1.parent=n+i; hfmnodex2.parent=n+i; hfmnoden+i.weight=hfmnodex1.weight+hfmnodex2.weight;/父结点的权重是左孩子和右孩子的权重之和 hfmnoden+i.lchild=x1; hfmnoden+i.rchild=x2; /显示叶子的编码字符和编码字符对应的二进制编码void showCode(HFMCode hfmcodeMAXNODE,HFMNode hfmnodeMAXNODE,int n)int
5、 i,j,k,c,p; HFMCode cd;for(i=0;in;i+) hfmcodei.length=0;hfmcodei.start=0;k=hfmcodei.start;cd.start=n-1;c=i; p=hfmnodec.parent; while(p!=-1) if(hfmnodep.lchild=c) cd.bitcd.start=0; else cd.bitcd.start=1; cd.start-; c=p; p=hfmnodec.parent; for(j=cd.start+1;jn;j+) hfmcodei.bitk=cd.bitj; k+;hfmcodei.len
6、gth+; /length计算存放的二进制编码的位数 for(i=0;in;i+) /输出每个叶子节点的哈夫曼编码 printf(第%d片叶子的编码是:,i+1); printf(%ct,hfmnodei.data);for(j=hfmcodei.start;jhfmcodei.length;j+)printf(%d,hfmcodei.bitj); printf(n); /输入字符串,得到二进制编码void compileCode(char str,int n,HFMCode hfmcodeMAXLEAF,HFMNode hfmnodeMAXNODE)int i,j,k;for(i=0;str
7、i!=0;i+)for(j=0;jn;j+)if(stri=hfmnodej.data)for(k=hfmcodej.start;khfmcodej.length;k+)printf(%d,hfmcodej.bitk);printf(nn);/输入二进制编码得到字符串void decompileCode(char num,int n,HFMCode hfmcodeMAXLEAF,HFMNode hfmnodeMAXNODE)int i,j;j=2*n-2; /哈夫曼树根结点的位置for(i=0;numi!=0;i+)if(numi=0)j=hfmnodej.lchild;else if(num
8、i=1)j=hfmnodej.rchild;if(jn) /j大于等于n表示的都是除叶子结点以外的哈夫曼树结点 printf(%c,hfmnodej.data);j=2*n-2;printf(n);/主函数void main() HFMNode hfmnodeMAXNODE; HFMCode hfmcodeMAXLEAF; char str100; /存放输入的需要编译的的字符串char num100; /存放输入的需要编译的二进制字符串int n; /输入的叶子结点数/哈夫曼编码器printf(-哈弗曼编码器-n);printf(请输入叶子结点数:); scanf(%d,&n);createHFMTree(hfmnode,n);showCode(hfmcode,hfmnode,n);/哈夫曼译码器printf(-哈夫曼译码器-n);printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加强县域基础设施建设和基本公共服务供给统筹实施方案
- 电线电缆制造企业原材料阻燃抽检细则
- 城市公共体育设施空间布局优化配置方案
- 第三十课 自己的事自己做教学设计小学心理健康北师大版二年级下册-北师大版
- 八年级语文下册 第三单元 10 小石潭记第1课时教案 新人教版
- 2026学年海南省文昌市三年级数学期末自测高频题(详细参考解析)详细答案和解析
- 2026年全国初级经济师之初级经济师基础知识考试历年考试题附答案
- 2026学年山东省滕州市六年级语文期末高分预测黑金考题详细参考解析详细答案和解析
- 2026学年江苏省昆山市五年级语文期末高分竞赛挑战题(附答案)详细答案和解析
- 2026学年山西省大同市一年级数学期末提升黑金提分题(附答案)详细答案和解析
- 12.1.1全面调查【知识精研】七年级数学下册(人教版)
- 2025年江苏连云港市赣榆农业发展集团有限公司招聘笔试参考题库附带答案详解
- 2025年上海嘉定招商服务有限公司招聘笔试参考题库含答案解析
- 国家职业技术技能标准 4-12-01-01 汽车维修工 人社厅发2018147号
- 7.5 歌曲 《红河谷》课件(20张)
- 人工智能导论智慧树知到期末考试答案章节答案2024年哈尔滨工程大学
- 新大象版四年级下册科学全册知识点(精编版)
- 磨床操作培训课件
- GB/T 43189-2023核仪器仪表闪烁体和闪烁探测器的命名(标识)以及闪烁体的标准尺寸
- 预制钢筋混凝土方桩图集
- 民用航空器活动区驾驶员笔试备考题库(含答案)
评论
0/150
提交评论