您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 霍夫曼编码译码信息论实验C语言
//´ÓÎı¾ÊäÈë·ûºÅ£¬±£´æÔÚin.txtÖÐ#includestdio.h#includewindows.h#includestring.h#defineMaxNo256#defineNULL0typedefstruct{unsignedcharsymbol;intsweight;}syml_weit;syml_weit*sw;//´æ·Å·ûºÅ¼°ÆäȨֵtypedefstruct{intweit;intlchd;intrchd;intpart;}hufmtree;hufmtree*htree;//´æ·ÅHuffmanÊ÷intleafnode,totalnode;//Ò¶×Ó½Úµã¸öÊýºÍÕû¿ÃÊ÷µÄËùÓнڵãunsignedchar*DataBuf;//´æ·ÅÎı¾ÎļþÊý¾ÝµÄÄÚ´æ¿Õ¼äunsignedchar*CodeBook;//´æ·ÅÂë±¾unsignedchar*CodeBuf;//´æ·Å±àºÃµÄÂëunsignedchar*DCodeBuf;intCodeBookLen;//Âë±¾³¤¶ÈintCodeLen;//Â볤¶ÈintDCodeLen;voidCountWeight(unsignedchar*DataBuf,intFileLen);voidBuildTree();voidHufmCode(unsignedchar*DataBuf,intFileLen);voidHufmDCode(unsignedchar*CDataBuf,intCDataLen);intmain(){FILE*fp1,*fp2,*fp3,*fp4;//Îļþ¶ÁÈ¡Ö¸Õëcharfilepath[]=in.txt;intFileLen;//¶ÁÈëµÄÎļþ³¤¶ÈDataBuf=newunsignedchar[1024*1024];printf(=====ʵÑéËÄHuffman±àÂë¼°ÆäʵÏÖ*NJIT====\n\n);if((fp1=fopen(filepath,rb))==NULL)//¶ÁÈëÎı¾Îļþ{printf(inputfileopenerror!);}FileLen=fread(DataBuf,1,1024*1024,fp1);CountWeight(DataBuf,FileLen);//¼ÆËãȨֵBuildTree();//½¨Ê÷HufmCode(DataBuf,FileLen);//±àÂëHufmDCode(CodeBuf,CodeLen);//ÒëÂë//printf(%d,FileLen/3);/////Êä³öÂë±¾ÎļþºÍѹËõÂÊif((fp2=fopen(result.txt,w))==NULL){printf(resultfileopenerror!);}printf(·ûºÅ¸ÅÂÊÂë×Ö\n);fprintf(fp2,·ûºÅ¸ÅÂÊÂë×Ö\n);for(inti=0;ileafnode;i++){printf(%c(%8.4f%%),*(CodeBook+i*(leafnode+1)),100.0*sw[i].sweight/htree[totalnode-1].weit);fprintf(fp2,%c(%8.4f%%),*(CodeBook+i*(leafnode+1)),100.0*sw[i].sweight/htree[totalnode-1].weit);for(intj=0;j*(CodeBook+i*(leafnode+1)+1);j++){printf(%d,*(CodeBook+i*(leafnode+1)+2+j));fprintf(fp2,%d,*(CodeBook+i*(leafnode+1)+2+j));}puts(\n);fprintf(fp2,\n);}printf(ѹËõÂÊ£º%.5f%%\n,100.0*CodeLen/8/FileLen);fprintf(fp2,\nѹËõÂÊ£º%.5f%%,100.0*CodeLen/8/FileLen);printf(ÊäÈë·ûºÅ±àÂëºó±£´æÔÚhuffmancode.txtÖÐ\nÒëÂëºó±£´æÔÚhuffmandcode.txtÖÐ\n\n);/////Êä³ö±àÂëÎļþif((fp3=fopen(huffmancode.txt,w))==NULL){printf(huffmancodeopenerror!);}fwrite(CodeBuf,1,CodeLen,fp3);/////Êä³öÒëÂëÎļþif((fp4=fopen(huffmandcode.txt,wb))==NULL){printf(huffmandcodeopenerror!);}fwrite(DCodeBuf,1,DCodeLen,fp4);fclose(fp1);fclose(fp2);fclose(fp3);fclose(fp4);delete[]DataBuf;delete[]CodeBook;delete[]CodeBuf;delete[]DCodeBuf;}voidCountWeight(unsignedchar*DataBuf,intFileLen){inti=0,sum=0;intcounter[MaxNo]={0x0};for(i=0;iFileLen;i++)//¼ÆËãȨֵ{counter[DataBuf[i]]++;}for(i=0;iMaxNo;i++)//¼ÆËãÒ¶×Ó½Úµã¸öÊý{if(counter[i]){leafnode++;}}totalnode=(leafnode-1)+leafnode;//ÂúÊ÷Çé¿öϵĽڵã¸öÊýsw=newsyml_weit[leafnode];//´æ·ÅÂë×ÖºÍȨֵhtree=newhufmtree[totalnode];//´æ·ÅhuffmanÊ÷intj=0;for(i=0;iMaxNo;i++){if(counter[i]){sw[j].sweight=counter[i];sw[j].symbol=i;htree[j].weit=counter[i];htree[j].lchd=0;htree[j].rchd=0;htree[j++].part=0;}}}voidBuildTree(){inti=0;intj=leafnode;//·ÇÒ¶×Ó½ÚµãµÄ¿ªÊ¼intw1,w2;//Á½¸ö×îСµÄȨֵintp1=-1,p2=-1;for(intleaf=0;leafleafnode-1;leaf++){/////////////////////////ÕÒȨֵ×îСµÄÁ½¸ö½Úµã///////for(i=0;itotalnode;i++){if(htree[i].part==0){if(p1==-1){p1=i;w1=htree[i].weit;}elseif(p2==-1){if(htree[i].weit=w1){p2=i;w2=htree[i].weit;}else{p2=p1;w2=w1;p1=i;w1=htree[i].weit;}break;}}}for(i=0;itotalnode;i++){if(htree[i].part==0&&i!=p1&&i!=p2){if(htree[i].weitw2){if(htree[i].weitw1){w2=w1;p2=p1;w1=htree[i].weit;p1=i;}else{w2=htree[i].weit;p2=i;}}}}/////////////////////////////////////////////////////ÉèÖø¸½Úµãhtree[j].weit=w1+w2;htree[j].lchd=p1;htree[j].rchd=p2;htree[j].part=0;htree[p1].part=j;htree[p2].part=j;p1=-1;p2=-1;j++;}}voidHufmCode(unsignedchar*DataBuf,intFileLen){CodeBookLen=leafnode*(leafnode+1);CodeBook=newunsignedchar[CodeBookLen];//´æ·Å±àºÃµÄÂë×Öunsignedchar*codetemp=newunsignedchar[leafnode];//ÁÙʱ´æ·Å±àºÃµÄÂë×Öintp;intCodLen;for(inti=0;ileafnode;i++){CodLen=0;*(CodeBook+i*(leafnode+1))=sw[i].symbol;p=i;while(htree[p].part){if(p==htree[htree[p].part].lchd)//pÊÇ×óº¢×Ó{codetemp[CodLen]=0x0;}else//PÊÇÓÒº¢×Ó{codetemp[CodLen]=0x1;}CodLen++;p=htree[p].part;}*(CodeBook+i*(leafnode+1)+1)=CodLen;for(intj=0;jCodLen;j++){*(CodeBook+i*(leafnode+1)+1+CodLen-j)=*(codetemp+j);}}CodeBuf=newunsignedchar[FileLen*(leafnode-1)];for(intii=0;iiFileLen;ii++){for(intjj=0;jjleafnode;jj++){if(*(DataBuf+ii)==*(CodeBook+jj*(leafnode+1))){for(intkk=0;kk*(CodeBook+jj*(leafnode+1)+1);kk++){*(CodeBuf+CodeLen)=*(CodeBook+jj*(leafnode+1)+2+kk);CodeLen++;}}}}}voidHufmDCode(unsignedchar*CDataBuf,intCDataLen){FILE*lp;inti=0;DCodeBuf=newunsignedchar[1024*1024];while(iCDataLen){intp=totalnode-1;while(p=leafnode){if(*(CDataBuf+i)==1)p=htree[p].rchd;elsep=htree[p].lchd;i++;}*(DCodeBuf+DCodeLen)=sw[p].symbol;DCodeLen++;}}
本文标题:霍夫曼编码译码信息论实验C语言
链接地址:https://www.777doc.com/doc-5702777 .html