1 / 12
文档名称:

Huffman哈弗曼编码C语言.doc

格式:doc   大小:27KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Huffman哈弗曼编码C语言.doc

上传人:文库旗舰店 2019/9/26 文件大小:27 KB

下载得到文件列表

Huffman哈弗曼编码C语言.doc

相关文档

文档介绍

文档介绍:/*题目:哈夫曼压缩与解压。编者:覃冠日学号:09211157一、压缩(code_File):calculate_freq。,并得出相应的哈夫曼编码:creat_Huffmantree,creat_Huffmancode。:codef。二、解压(decode_File):,并得出相应的哈夫曼编码:creat_Huffmantree,creat_Huffmancode。:decodef。*/#include<iostream>#include<cstring>#include<cmath>usingnamespacestd;/*-----------数据结构---------------*/structHuffman_node{intfreq_;intlc_;intrc_;};Huffman_nodehuff[514];//huffmantreestructcode_01{charcode01[260];};code_01code[257];//huffmancodechartempcode01[260];//用于临时存储01串intsource_length=0,code_length=0;/*-------------------------------------------------------------*/voidinitialize_node(void){for(inti=0;i<514;i++){huff[i].freq_=0;huff[i].lc_=huff[i].rc_=-1;}}voidcalculate_freq(FILE*infile)/*统计字符频率*/{initialize_node();huff[256].freq_=1;intnum;while(!feof(inFile)){num=fgetc(infile);if(feof(infile))break;huff[num].freq_++;//频率加1source_length++;}}intmin_w(void)/*求集合中最小权值*/{intmin_weight=100000000;intflag;for(inti=0;i<514;i++){if(huff[i].freq_>0&&huff[i].freq_<min_weight){min_weight=huff[i].freq_;flag=i;}}huff[flag].freq_*=(-1);//将频率修改为负数,起标记效果returnflag;//返回对应下标}voidcreat_Huffmancode(intn=513,intk=0)/*求出哈夫曼编码*/{if(huff[n].lc_==-1&&huff[n].rc_==-1)//如果是树的叶节点{tempcode01[k]='#';strcpy(code[n].code01,tempcode01);return;}else{if(huff[n].lc_!=-1){tempcode01[k]='0';//编码creat_Huffmancode(huff[n].lc_,k+1);}if(huff[n].rc_!=-1){tempcode01[k]='1';//编码creat_Huffmancode(huff[n].rc_,k+1);}}}voidcreat_Huffmantree(void)/*生成哈夫曼树*/{intcount=0,N=257;intx1,x2;for(intj=0;j<257;j++)count+=huff[j].freq_>0;while(count>1){x1=min_w();x2=min_w();if(count==2)N=513;huff[N].freq_=-huff[x1].freq_-huff[x2].freq_;huff[N].lc_=x1;huff[N].rc_=x2;count--;N++;}for(inti=0;i<514;i++)//还原频率真实值huff[i].freq_*=huff[i].freq_<0?-1:1;}voidwrite_freq(File*outfile)//向文件中写入频率{fwrite(&source_length,sizeof(int),1,outfile);fwrite(&code_length,sizeof(int),1,outfile);for(intj=0;j<257;j++)fwrite(&huff[j],sizeof(huff[j]),1,outfile);}voidread_fr