




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include stdio.h#include stdlib.h /exit#include math.h /pow,floor函数#include string.h /strcmp函数#define END_OF_STREAM 256 /最后结束符为257#define Max_code_length 256 /共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符#define Max_number 257 /加上结束符,共257个字typedef struct tree_node double weight; /权重,把权重写入输出文件时,int flag; /标识是否为待构建结点,是的话用0表示,否则用1表示int parent; /父结点int lchild; /左结点int rchild; /右结点NODE;typedef struct codetype int codeMax_code_length; /共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符int code_length;CODE;FILE *read_file1(char *p)/读取文件FILE *fp;if(!(fp=fopen(p,rb)printf(打开文件失败!n);exit(0);return(fp);FILE *write_file1(char *p)/写入文件FILE *fp;if(!(fp=fopen(p,wb)printf(打开文件失败!n);exit(0);return(fp);void InitHuffman1(NODE nodes,int n)/霍夫曼树的初始化int i;for(i=0;i2*n-1;i+) nodesi.weight=0; nodesi.parent=0; nodesi.flag=0; nodesi.lchild=-1; nodesi.rchild=-1;void count_bytes1(FILE *input,NODE nodes)/统计待压缩文件中每个字符出现的次数,求权重int n;nodes256.weight=1;/对于结束符“n”,假设其定义的权重为1n=fgetc(input); /利用fgetc函数从待压缩文件中读入一个字符while(n!=EOF)/End Of File,带压缩文件也已经读取完毕 nodesn.weight+;/当文件中有相同的字符时权重自动+1n=fgetc(input);fseek(input,0,0);/使用文件指针定位函数fseek(),使原始文件指针重新回到文件头void scale_counts1(NODE nodes)/*将权重进行同比例缩小,然后重新赋给nodesi.weight*/double MAX_weight,less_any_weight,a;int i;MAX_weight=nodes0.weight;for(i=1;iMAX_weight)MAX_weight=nodesi.weight;a=floor(MAX_weight/256)+1;/floor向下取整,例:floor(2.8)=2for(i=0;i=256;i+)if(nodesi.weight!=0)less_any_weight=floor(nodesi.weight/a);/缩小后的权重赋给less_any_weightif(less_any_weight=0)/将为出现的字符的权重less_any_weight设为1nodesi.weight=less_any_weight+1;elsenodesi.weight=less_any_weight;void output_counts1(FILE *output,NODE nodes)/把权重写入以压缩文件,使编码和解码霍夫曼树一致int a,i;for(i=0;i=256;i+)a=(int)nodesi.weight;fputc(a,output);/利用fputc函数把权重写入以压缩文件int build_tree1(NODE nodes)/构建霍夫曼树double q1,q2;int i,j,m1,m2;for(i=1;i=257;i+)for(j=0;j513;j+)/*从0结点开始找出第一个权重不为0和标志不为1的结点对min1,m1赋值*/if(nodesj.weight!=0&nodesj.flag=0)m1=j;q1=nodesj.weight;break;for(j=1;m1+jnodesm1+j.weight)m1=m1+j;j=0;nodesm1.flag=1;/找到最小权重结点之后,将其标记变为0,为寻找次小结点做准备for(j=0;j513;j+)/*从0结点开始找出第一个权重不为0和标志不为1的结点对m2,q2赋值*/if(nodesj.weight!=0&nodesj.flag=0)m2=j;q2=nodesj.weight;break;if(j=513)break;/当达到第513个结点是直接跳出循环for(j=1;m2+jnodesm2+j.weight)q2=nodesm2+j.weight;m2=m2+j;j=0;nodesm2.flag=1;/将已经选出的结点的标志设为1nodes256+i.lchild=m1;/将m1,m2对应结点的权值求和后赋值给256+i的左右子树nodes256+i.rchild=m2;nodes256+i.weight=q1+q2;/并将m1,m2对应结点权值求和后赋值给256+i结点的权重nodesm1.parent=256+i;/将256+i的值赋给已经选出的两个结点的双亲结点nodesm2.parent=256+i;return(m1);void convert_tree_to_code1(CODE codes,NODE nodes)/对codes数组赋值,完成霍夫曼编码int cod256,i,j,k;int child,parent;k=j=0;for(i=0;i0;k+)/逆序求出每个结点的编码j-;codesi.codek=codj;void printf_model1(NODE nodes,CODE codes)/输出各结点的编码int i,j;for(i=0;i=256;i+)if(nodesi.weight!=0)printf(ASCII 码: %d,tt权重是 %3d,tt,i,(int)nodesi.weight);printf(编码是: );for(j=0;jcodesi.code_length;j+)printf(%d,codesi.codej);printf(n); void OutputBits1(FILE *output,CODE codes,int *pbyte_length,unsigned char *pascii_code) /*将codes表示的编码写入output所指向的输出文件中*/int i;for(i=0;i3&strcmp(argv3,-d)=0) /argc3必须要有,否则出错,没有第3个参数,就不能进行strcmp操作printf_model1(nodes,codes); / dLL和exe两者都行,可选函数,该函数不是必须的,若有第3个参数-d,则打
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度跨境电商物流配送与专属包车运输服务合同
- 2025医疗设备引进及医院信息化系统深度定制合同
- 2025年环保节能型小型厂房租赁及商务配套设施服务合同
- 2025年专业医疗骨科器械技术培训及市场拓展合作协议
- 2025年药厂专用枸杞原料直采直销供应链管理合同
- 2025年血管活性药物静脉输注护理考核试题及答案
- 电动汽车充电桩选址与布局优化方案
- 2025-2030中国工业用水行业经营状况及前景动态预测报告
- 工程项目沟通与协调管理方案
- 2025年天然水收集与分配行业研究报告及未来行业发展趋势预测
- 北师大版高一数学必修一教学安排
- 广州市南沙区卫生健康局招聘下属事业单位工作人员考试真题2024
- 职场心理健康课件
- 2025年锅炉专业培训试题及答案
- 2025至2030中国舆情大数据行业市场深度调研及投资前景报告
- 高三职业生涯规划课件
- 上汽大众品牌培训课件
- 铅锌行业规范条件 (一)
- 《礼仪规范教程》中职生礼仪教学全套教学课件
- 高一2024岳阳期末数学试卷
- 2025秋人教版(2024)八年级上册地理 【教学课件】1.3《民族》
评论
0/150
提交评论