资源描述:
《哈弗曼编码译码器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、哈弗曼编码译码器#include#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2#defineMAX_BUFFER_SIZE40960//40K以下的文件。#defineMAX_REFORM_SIZE1024//只读取前1k字符,做字典。#defineMAX_WORDS128#defineMAX_PATH512typedefintStatus;typedefstructdefineHfTre
2、eNode{intweight;intparent,lchild,rchild;}HTNode;//0号元素未使用。【0】.weight为叶子节点数。typedefHTNode*HfTree;typedefchar*HfCode;typedefstructdefineWeightList{intweight[MAX_WORDS];}WList;/************************************************************************//*方法声明*//***********
3、*************************************************************///扫描文件,获取字符的权值。intFormartFWeightList(char*fp,WList**wl);//默认权值表。WList*DefWeight();//依次存入权值,形成树的叶子节点。StatusStoneWlToHf(HfTree*ht,WListwl);//将含有权值的表转换成为哈弗曼树。StatusHfForming(HfTreeht);//扫描父节点为零的节点中最小的两个。Statu
4、sScanHT(HfTreeht,int*p1,int*p2);//从输入获取输入。StatusGetFromInput(char**buffer);//从文件获取输入。StatusGetFromFile(char*path,char**buffer);//获取输入,存入表。StatusGetWords(HfTree*ht,WListwl);//获取文件中的输入,存入表。StatusGetFWords(char*fp,HfTree*ht,WListwl);//构造可以存储N个叶子节点的HT。StatusCreatHT(HfTre
5、e*ht,intn);//编译哈弗曼编码。StatusFormHC(HfTreeht,HfCode*hc);//创建哈弗曼编码二维数组。StatusCreatHC(HfCode*hc,intn);//输出编码到屏幕。StatusPrintHC(HfCodehc);//输出权值表到屏幕。StatusPrintWlScn(WListwl);/*方法定义*///构建函数//创建哈弗曼编码二维数组。StatusCreatHC(HfCode*hc,intn){inti=n-1,j=MAX_WORDS-1;if((*hc)=(char*)m
6、alloc(n*MAX_WORDS*sizeof(char)))//0号元素表示维度数{//(*hc)[0]=(char*)(*hc);for(;i>0;i--){for(j=MAX_WORDS-1;j>=0;j--){(*hc)[i*MAX_WORDS+j]=-1;}}((int*)(*hc))[0]=n-1;returnOK;}else{returnERROR;}}//构造可以存储N个叶子节点的HT。StatusCreatHT(HfTree*ht,intn){inti=2*n;if((*ht)=(HfTree)malloc(
7、i*sizeof(HTNode))){for(i--;i>=0;i--){(*ht)[i].weight=(*ht)[i].lchild=(*ht)[i].rchild=(*ht)[i].parent=0;}returnOK;}else{returnERROR;}}//根据文件的字符,构造权值表wl。StatusFormartFWeightList(char*fp,WList**wl){inti=MAX_REFORM_SIZE;charc=0;inta=0;FILE*p=fopen(fp,"r");*wl=(WList*)mal
8、loc(sizeof(WList));for(;aweight[a]=1;}for(;i>0;i--){c=fgetc(p);if(c==EOF){break;}(*(*wl)).weight[c]++;}fclos