已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
#include stdio.h#include stdlib.h /exit#include math.h /pow,floor函數(shù)#include string.h /strcmp函數(shù)#define END_OF_STREAM 256 /最后結(jié)束符為257#define Max_code_length 256 /共257個(gè)字符,可能的最長(zhǎng)代碼二進(jìn)制位數(shù)為256個(gè),假設(shè)第257個(gè)字符為結(jié)束符#define Max_number 257 /加上結(jié)束符,共257個(gè)字typedef struct tree_node double weight; /權(quán)重,把權(quán)重寫入輸出文件時(shí),int flag; /標(biāo)識(shí)是否為待構(gòu)建結(jié)點(diǎn),是的話用0表示,否則用1表示int parent; /父結(jié)點(diǎn)int lchild; /左結(jié)點(diǎn)int rchild; /右結(jié)點(diǎn)NODE;typedef struct codetype int codeMax_code_length; /共257個(gè)字符,可能的最長(zhǎng)代碼二進(jìn)制位數(shù)為256個(gè),假設(shè)第257個(gè)字符為結(jié)束符int code_length;CODE;FILE *read_file1(char *p)/讀取文件FILE *fp;if(!(fp=fopen(p,rb)printf(打開文件失??!n);exit(0);return(fp);FILE *write_file1(char *p)/寫入文件FILE *fp;if(!(fp=fopen(p,wb)printf(打開文件失?。);exit(0);return(fp);void InitHuffman1(NODE nodes,int n)/霍夫曼樹的初始化int i;for(i=0;i2*n-1;i+) nodesi.weight=0; nodesi.parent=0; nodesi.flag=0; nodesi.lchild=-1; nodesi.rchild=-1;void count_bytes1(FILE *input,NODE nodes)/統(tǒng)計(jì)待壓縮文件中每個(gè)字符出現(xiàn)的次數(shù),求權(quán)重int n;nodes256.weight=1;/對(duì)于結(jié)束符“n”,假設(shè)其定義的權(quán)重為1n=fgetc(input); /利用fgetc函數(shù)從待壓縮文件中讀入一個(gè)字符while(n!=EOF)/End Of File,帶壓縮文件也已經(jīng)讀取完畢 nodesn.weight+;/當(dāng)文件中有相同的字符時(shí)權(quán)重自動(dòng)+1n=fgetc(input);fseek(input,0,0);/使用文件指針定位函數(shù)fseek(),使原始文件指針重新回到文件頭void scale_counts1(NODE nodes)/*將權(quán)重進(jìn)行同比例縮小,然后重新賦給nodesi.weight*/double MAX_weight,less_any_weight,a;int i;MAX_weight=nodes0.weight;for(i=1;iMAX_weight)MAX_weight=nodesi.weight;a=floor(MAX_weight/256)+1;/floor向下取整,例:floor(2.8)=2for(i=0;i=256;i+)if(nodesi.weight!=0)less_any_weight=floor(nodesi.weight/a);/縮小后的權(quán)重賦給less_any_weightif(less_any_weight=0)/將為出現(xiàn)的字符的權(quán)重less_any_weight設(shè)為1nodesi.weight=less_any_weight+1;elsenodesi.weight=less_any_weight;void output_counts1(FILE *output,NODE nodes)/把權(quán)重寫入以壓縮文件,使編碼和解碼霍夫曼樹一致int a,i;for(i=0;i=256;i+)a=(int)nodesi.weight;fputc(a,output);/利用fputc函數(shù)把權(quán)重寫入以壓縮文件int build_tree1(NODE nodes)/構(gòu)建霍夫曼樹double q1,q2;int i,j,m1,m2;for(i=1;i=257;i+)for(j=0;j513;j+)/*從0結(jié)點(diǎn)開始找出第一個(gè)權(quán)重不為0和標(biāo)志不為1的結(jié)點(diǎn)對(duì)min1,m1賦值*/if(nodesj.weight!=0&nodesj.flag=0)m1=j;q1=nodesj.weight;break;for(j=1;m1+jnodesm1+j.weight)m1=m1+j;j=0;nodesm1.flag=1;/找到最小權(quán)重結(jié)點(diǎn)之后,將其標(biāo)記變?yōu)?,為尋找次小結(jié)點(diǎn)做準(zhǔn)備for(j=0;j513;j+)/*從0結(jié)點(diǎn)開始找出第一個(gè)權(quán)重不為0和標(biāo)志不為1的結(jié)點(diǎn)對(duì)m2,q2賦值*/if(nodesj.weight!=0&nodesj.flag=0)m2=j;q2=nodesj.weight;break;if(j=513)break;/當(dāng)達(dá)到第513個(gè)結(jié)點(diǎn)是直接跳出循環(huán)for(j=1;m2+jnodesm2+j.weight)q2=nodesm2+j.weight;m2=m2+j;j=0;nodesm2.flag=1;/將已經(jīng)選出的結(jié)點(diǎn)的標(biāo)志設(shè)為1nodes256+i.lchild=m1;/將m1,m2對(duì)應(yīng)結(jié)點(diǎn)的權(quán)值求和后賦值給256+i的左右子樹nodes256+i.rchild=m2;nodes256+i.weight=q1+q2;/并將m1,m2對(duì)應(yīng)結(jié)點(diǎn)權(quán)值求和后賦值給256+i結(jié)點(diǎn)的權(quán)重nodesm1.parent=256+i;/將256+i的值賦給已經(jīng)選出的兩個(gè)結(jié)點(diǎn)的雙親結(jié)點(diǎn)nodesm2.parent=256+i;return(m1);void convert_tree_to_code1(CODE codes,NODE nodes)/對(duì)codes數(shù)組賦值,完成霍夫曼編碼int cod256,i,j,k;int child,parent;k=j=0;for(i=0;i0;k+)/逆序求出每個(gè)結(jié)點(diǎn)的編碼j-;codesi.codek=codj;void printf_model1(NODE nodes,CODE codes)/輸出各結(jié)點(diǎn)的編碼int i,j;for(i=0;i=256;i+)if(nodesi.weight!=0)printf(ASCII 碼: %d,tt權(quán)重是 %3d,tt,i,(int)nodesi.weight);printf(編碼是: );for(j=0;jcodesi.code_length;j+)printf(%d,codesi.codej);printf(n); void OutputBits1(FILE *output,CODE codes,int *pbyte_length,unsigned char *pascii_code) /*將codes表示的編碼寫入output所指向的輸出文件中*/int i;for(i=0;i3&strcmp(argv3,-d)=0) /argc3必須要有,否則出錯(cuò),沒有第3個(gè)參數(shù),就不能進(jìn)行strcmp操作printf_model1(nodes,codes); / dLL和exe兩者都行,可選函數(shù),該函數(shù)不是必須的,若有第3個(gè)參數(shù)-d,則打
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版智能穿戴設(shè)備技術(shù)開發(fā)與維護(hù)合同990942篇
- 二零二五版出租汽車承包合同駕駛員培訓(xùn)補(bǔ)貼政策2篇
- 二零二五年設(shè)備采購與安裝調(diào)試合同6篇
- 2025年度香菇種植技術(shù)改良與推廣合同3篇
- 二零二五年食堂經(jīng)營(yíng)權(quán)及資產(chǎn)轉(zhuǎn)讓合同2篇
- 2025年校園安全隱患排查與保安人員聘用合同2篇
- 二零二五版2025年度房地產(chǎn)合伙開發(fā)項(xiàng)目合同范本
- 2025年度二零二五新型龍門吊拆除與工程審計(jì)合同3篇
- 二零二五年房產(chǎn)公司實(shí)習(xí)生培訓(xùn)就業(yè)合同3篇
- 二零二五年度高端樓體亮化照明系統(tǒng)采購安裝合同4篇
- 小學(xué)一年級(jí)英語1a期末學(xué)業(yè)評(píng)價(jià)方案
- 中央廣播電視大學(xué)畢業(yè)生登記表-6
- 搶救制度試卷附有答案
- 勞務(wù)派遣勞務(wù)外包服務(wù)方案(技術(shù)方案)
- 2023年藥品注冊(cè)專員年度總結(jié)及來年計(jì)劃
- 易普拉格科研管理系統(tǒng)
- 最終版 古城文化修復(fù)監(jiān)理大綱
- 拔罐技術(shù)操作考核評(píng)分標(biāo)準(zhǔn)
- 軟件無線電原理與應(yīng)用第3版 課件 第4-6章 軟件無線電硬件平臺(tái)設(shè)計(jì)、軟件無線電信號(hào)處理算法、信道編譯碼技術(shù)
- RB-T 099-2022 進(jìn)口食品供應(yīng)商評(píng)價(jià)技術(shù)規(guī)范
- 戒賭法律協(xié)議書范本
評(píng)論
0/150
提交評(píng)論