huffman解码.doc
上传人:yy****24 上传时间:2024-09-10 格式:DOC 页数:7 大小:50KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

huffman解码.doc

huffman解码.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

#include"stdio.h"#include"stdlib.h"//exit#include"math.h"//pow,floor函数#include"string.h"//strcmp函数#defineEND_OF_STREAM256//最后结束符为257#defineMax_code_length256//共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符#defineMax_number257//加上结束符,共257个字typedefstructtree_node{doubleweight;//权重,把权重写入输出文件时,intflag;//标识是否为待构建结点,是的话用0表示,否则用1表示intparent;//父结点intlchild;//左结点intrchild;//右结点}NODE;typedefstructcodetype{intcode[Max_code_length];//共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符intcode_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);}voidInitHuffman1(NODEnodes[],intn)//霍夫曼树的初始化{inti;for(i=0;i<2*n-1;i++){nodes[i].weight=0;nodes[i].parent=0;nodes[i].flag=0;nodes[i].lchild=-1;nodes[i].rchild=-1;}}voidcount_bytes1(FILE*input,NODEnodes[])//统计待压缩文件中每个字符出现的次数,求权重{intn;nodes[256].weight=1;//对于结束符“\n”,假设其定义的权重为1n=fgetc(input);//利用fgetc函数从待压缩文件中读入一个字符while(n!=EOF)//EndOfFile,带压缩文件也已经读取完毕{nodes[n].weight++;//当文件中有相同的字符时权重自动+1n=fgetc(input);}fseek(input,0,0);//使用文件指针定位函数fseek(),使原始文件指针重新回到文件头}voidscale_counts1(NODEnodes[])/*将权重进行同比例缩小,然后重新赋给nodes[i].weight*/{doubleMAX_weight,less_any_weight,a;inti;MAX_weight=nodes[0].weight;for(i=1;i<=256;i++)//找到结点中权重最大的赋给MAX_weight{if(nodes[i].weight>MAX_weight){MAX_weight=nodes[i].weight;}}a=floor(MAX_weight/256)+1;//floor向下取整,例:floor(2.8)=2for(i=0;i<=256;i++){if(nodes[i].weight!=0){less_any_weight=floor(nodes[i].weight/a);//缩小后的权重赋给less_any_weightif(less_any_weight==0)//将为出现的字符的权重less_any_weight设为1nodes[i].weight=less_any_weight+1;elsenodes[i].weight=less_any_weight;}}}voidoutput_counts1(FILE*output,NODEnodes[])//把权重写入以压缩文件,使编码和解码霍夫曼树一致{inta,i;for(i=0;i<=256;i++){a=(int)nodes[i].weight;fputc(a,output);//