下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山西工程职业学院单招职业适应性测试题库有答案详细解析
- 2026年威海荣成市面向村(社区)党组织书记公开招聘事业单位工作人员(3人)考试备考题库及答案解析
- 河南省南召县联考2026年初三下学期第二次周练语文试题含解析
- 甘肃省天水市秦安县2025-2026学年下学期初三联考试卷英语试题含解析
- 山东省德州市乐陵市花园中学2026年初三1月第一次诊断语文试题理试卷含解析
- 2026届云南省楚雄州-重点名校初三重点班下学期开学英语试题含解析
- 浙江省鄞州区2025-2026学年初三第一次联考(4月)语文试题试卷含解析
- 2026届山东省济宁地区初三下学期期中统考英语试题含解析
- 浙江杭州余杭区重点中学2025-2026学年初三下学期3月练习卷英语试题试卷含解析
- 环境提升整改承诺书(6篇)
- 建筑防水工程技术规程DBJ-T 15-19-2020
- 《创新创业基础》课件-模块四 创新成果保护与转化
- 燃料检修潜在风险与预控措施
- 中学生防震减灾知识
- 劳务合同模板电子下载
- 新安全生产法全文-安全生产法全文
- 初中体育-篮球绕杆运球教学课件设计
- 《物理(下册)》教学课件-第六章-光现象及其应用
- 麦积山石窟课件
- 分数百分数应用题的复习课件
- 开复工安全检查表
评论
0/150
提交评论