#include#include#includestr">
利用哈夫曼編碼實現(xiàn)文件壓縮.pdf

利用哈夫曼編碼實現(xiàn)文件壓縮.pdf

ID:47999899

大小:101.59 KB

頁數(shù):11頁

時間:2020-01-11

利用哈夫曼編碼實現(xiàn)文件壓縮.pdf_第1頁
利用哈夫曼編碼實現(xiàn)文件壓縮.pdf_第2頁
利用哈夫曼編碼實現(xiàn)文件壓縮.pdf_第3頁
利用哈夫曼編碼實現(xiàn)文件壓縮.pdf_第4頁
利用哈夫曼編碼實現(xiàn)文件壓縮.pdf_第5頁
資源描述:

《利用哈夫曼編碼實現(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].count

5、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;i

6、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;i

8、)//置左分支編碼0{j=strlen(header[i].bits);memmove(hea

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。