




已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)重寫(xiě)入輸出文件時(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(打開(kāi)文件失?。);exit(0);return(fp);FILE *write_file1(char *p)/寫(xiě)入文件FILE *fp;if(!(fp=fopen(p,wb)printf(打開(kāi)文件失??!n);exit(0);return(fp);void InitHuffman1(NODE nodes,int n)/霍夫曼樹(shù)的初始化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)重寫(xiě)入以壓縮文件,使編碼和解碼霍夫曼樹(shù)一致int a,i;for(i=0;i=256;i+)a=(int)nodesi.weight;fputc(a,output);/利用fputc函數(shù)把權(quán)重寫(xiě)入以壓縮文件int build_tree1(NODE nodes)/構(gòu)建霍夫曼樹(shù)double q1,q2;int i,j,m1,m2;for(i=1;i=257;i+)for(j=0;j513;j+)/*從0結(jié)點(diǎn)開(kāi)始找出第一個(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)開(kāi)始找出第一個(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的左右子樹(shù)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表示的編碼寫(xiě)入output所指向的輸出文件中*/int i;for(i=0;i3&strcmp(argv3,-d)=0) /argc3必須要有,否則出錯(cuò),沒(méi)有第3個(gè)參數(shù),就不能進(jìn)行strcmp操作printf_model1(nodes,codes); / dLL和exe兩者都行,可選函數(shù),該函數(shù)不是必須的,若有第3個(gè)參數(shù)-d,則打
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四級(jí)人力資源管理師-2018年11月四級(jí)人力資源管理師考試《理論知識(shí)》真題
- 上海市嘉定區(qū)封浜高中2017-2018學(xué)年第二學(xué)期高二化學(xué)期中試卷
- 2024-2025學(xué)年教案語(yǔ)文(必修上冊(cè))131《讀書(shū)目的和前提》
- 山西省晉中市高三1月高考適應(yīng)性調(diào)研考試?yán)砭C生物試題
- 河南省正陽(yáng)縣第二高級(jí)中學(xué)高三下學(xué)期理科數(shù)學(xué)周練(二)
- 高三化學(xué)總復(fù)習(xí)練習(xí)第三章金屬及其化合物3-8
- 2018年高考物理一輪訓(xùn)練(11)及詳細(xì)解析
- 基于DBR的再制造時(shí)間緩沖控制方法研究
- 基于ANSYS軟件的新型戶(hù)外可自主拼裝拼花地板研發(fā)
- 鋅指蛋白A20在Behcet病和Vogt-小柳原田綜合征發(fā)病機(jī)制中作用的研究
- 女神節(jié)花藝沙龍活動(dòng)
- 大劇院音視頻系統(tǒng)工程調(diào)試方案
- 社區(qū)商業(yè)招商與運(yùn)營(yíng)管理方案
- 人教PEP版(2024)三年級(jí)上冊(cè)英語(yǔ)Unit 6《Useful numbers》單元作業(yè)設(shè)計(jì)
- 魔發(fā)奇緣電影中英文對(duì)白
- 浙江省寧波市九校2023-2024學(xué)年高二下學(xué)期期末聯(lián)考數(shù)學(xué)試題2
- 事業(yè)單位公開(kāi)招聘分類(lèi)考試公共科目筆試考試大綱2022年版
- 8 歌曲 《郵遞員叔叔來(lái)了》課件(13張內(nèi)嵌視頻)
- 網(wǎng)絡(luò)數(shù)據(jù)安全風(fēng)險(xiǎn)治理與防護(hù)項(xiàng)目需求說(shuō)明
- GB/T 14020-2024氫化松香
- 中醫(yī)護(hù)理學(xué) 課件 模塊七 中醫(yī)護(hù)理操作 項(xiàng)目四麥粒灸技術(shù)
評(píng)論
0/150
提交評(píng)論