資源描述:
《利用哈夫曼編碼實現(xiàn)文件壓縮.pdf》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、用哈夫曼壓縮文件(C語言)2007-12-2921:09利用哈夫曼編碼制作壓縮軟件,內(nèi)容如下:#include#include#include#includestructhead{unsignedcharb;//記錄字符在數(shù)組中的位置longcount;//字符出現(xiàn)頻率(權(quán)值)longparent,lch,rch;//定義哈夫曼樹指針變量charbits[256];//定義存儲哈夫曼編碼的數(shù)組}header[512],tmp;/*壓縮*/voidcompress(){charf
2、ilename[255],outputfile[255],buf[512];unsignedcharc;longi,j,m,n,f;longmin1,pt1,flength,length1,length2;doublediv;FILE*ifp,*ofp;printf("t請您輸入需要壓縮的文件:");gets(filename);ifp=fopen(filename,"rb");if(ifp==NULL){printf("t文件打開失敗!");return;}printf("t請您輸入壓縮后的文件名:");gets(outputfil
3、e);ofp=fopen(strcat(outputfile,".hub"),"wb");if(ofp==NULL){printf("t壓縮文件失敗!");return;}flength=0;while(!feof(ifp)){fread(&c,1,1,ifp);header[c].count++;//字符重復(fù)出現(xiàn)頻率+1flength++;//字符出現(xiàn)原文件長度+1}flength--;length1=flength;//原文件長度用作求壓縮率的分母header[c].count--;for(i=0;i<512;i++){if(head
4、er[i].count!=0)header[i].b=(unsignedchar)i;/*將每個哈夫曼碼值及其對應(yīng)的ASCII碼存放在一維數(shù)組header[i]中,且編碼表中的下標(biāo)和ASCII碼滿足順序存放關(guān)系*/elseheader[i].b=0;header[i].parent=-1;header[i].lch=header[i].rch=-1;//對結(jié)點進(jìn)行初始化}for(i=0;i<256;i++)//根據(jù)頻率(權(quán)值)大小,對結(jié)點進(jìn)行排序,選擇較小的結(jié)點進(jìn)樹{for(j=i+1;j<256;j++){if(header[i].count5、der[j].count){tmp=header[i];header[i]=header[j];header[j]=tmp;}}}for(i=0;i<256;i++)if(header[i].count==0)break;n=i;//外部葉子結(jié)點數(shù)為n個時,內(nèi)部結(jié)點數(shù)為n-1,整個哈夫曼樹的需要的結(jié)點數(shù)為2*n-1.m=2*n-1;for(i=n;i6、parent!=-1說明該結(jié)點已存在哈夫曼樹中,跳出循環(huán)重新選擇新結(jié)點*/if(min1>header[j].count){pt1=j;min1=header[j].count;continue;}}header[i].count=header[pt1].count;header[pt1].parent=i;//依據(jù)parent域值(結(jié)點層數(shù))確定樹中結(jié)點之間的關(guān)系header[i].lch=pt1;//計算左分支權(quán)值大小min1=999999999;for(j=0;j
7、f(min1>header[j].count){pt1=j;min1=header[j].count;continue;}}header[i].count+=header[pt1].count;header[i].rch=pt1;//計算右分支權(quán)值大小header[pt1].parent=i;}for(i=0;i8、)//置左分支編碼0{j=strlen(header[i].bits);memmove(hea