已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
#include stdio.h#include stdlib.h /exit#include math.h /pow,floor函數(shù)#include string.h /strcmp函數(shù)#define END_OF_STREAM 256 /最后結束符為257#define Max_code_length 256 /共257個字符,可能的最長代碼二進制位數(shù)為256個,假設第257個字符為結束符#define Max_number 257 /加上結束符,共257個字typedef struct tree_node double weight; /權重,把權重寫入輸出文件時,int flag; /標識是否為待構建結點,是的話用0表示,否則用1表示int parent; /父結點int lchild; /左結點int rchild; /右結點NODE;typedef struct codetype int codeMax_code_length; /共257個字符,可能的最長代碼二進制位數(shù)為256個,假設第257個字符為結束符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(打開文件失??!n);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)計待壓縮文件中每個字符出現(xiàn)的次數(shù),求權重int n;nodes256.weight=1;/對于結束符“n”,假設其定義的權重為1n=fgetc(input); /利用fgetc函數(shù)從待壓縮文件中讀入一個字符while(n!=EOF)/End Of File,帶壓縮文件也已經(jīng)讀取完畢 nodesn.weight+;/當文件中有相同的字符時權重自動+1n=fgetc(input);fseek(input,0,0);/使用文件指針定位函數(shù)fseek(),使原始文件指針重新回到文件頭void scale_counts1(NODE nodes)/*將權重進行同比例縮小,然后重新賦給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);/縮小后的權重賦給less_any_weightif(less_any_weight=0)/將為出現(xiàn)的字符的權重less_any_weight設為1nodesi.weight=less_any_weight+1;elsenodesi.weight=less_any_weight;void output_counts1(FILE *output,NODE nodes)/把權重寫入以壓縮文件,使編碼和解碼霍夫曼樹一致int a,i;for(i=0;i=256;i+)a=(int)nodesi.weight;fputc(a,output);/利用fputc函數(shù)把權重寫入以壓縮文件int build_tree1(NODE nodes)/構建霍夫曼樹double q1,q2;int i,j,m1,m2;for(i=1;i=257;i+)for(j=0;j513;j+)/*從0結點開始找出第一個權重不為0和標志不為1的結點對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;/找到最小權重結點之后,將其標記變?yōu)?,為尋找次小結點做準備for(j=0;j513;j+)/*從0結點開始找出第一個權重不為0和標志不為1的結點對m2,q2賦值*/if(nodesj.weight!=0&nodesj.flag=0)m2=j;q2=nodesj.weight;break;if(j=513)break;/當達到第513個結點是直接跳出循環(huán)for(j=1;m2+jnodesm2+j.weight)q2=nodesm2+j.weight;m2=m2+j;j=0;nodesm2.flag=1;/將已經(jīng)選出的結點的標志設為1nodes256+i.lchild=m1;/將m1,m2對應結點的權值求和后賦值給256+i的左右子樹nodes256+i.rchild=m2;nodes256+i.weight=q1+q2;/并將m1,m2對應結點權值求和后賦值給256+i結點的權重nodesm1.parent=256+i;/將256+i的值賦給已經(jīng)選出的兩個結點的雙親結點nodesm2.parent=256+i;return(m1);void convert_tree_to_code1(CODE codes,NODE nodes)/對codes數(shù)組賦值,完成霍夫曼編碼int cod256,i,j,k;int child,parent;k=j=0;for(i=0;i0;k+)/逆序求出每個結點的編碼j-;codesi.codek=codj;void printf_model1(NODE nodes,CODE codes)/輸出各結點的編碼int i,j;for(i=0;i=256;i+)if(nodesi.weight!=0)printf(ASCII 碼: %d,tt權重是 %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必須要有,否則出錯,沒有第3個參數(shù),就不能進行strcmp操作printf_model1(nodes,codes); / dLL和exe兩者都行,可選函數(shù),該函數(shù)不是必須的,若有第3個參數(shù)-d,則打
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年欽州市靈山縣赴高校招聘教師135人備考題庫及1套參考答案詳解
- 基于實踐導向的初中科技創(chuàng)新社團活動課程設計與實施教學研究課題報告
- 2025年定西市通渭縣公開招聘鄉(xiāng)村醫(yī)生7人備考題庫及1套參考答案詳解
- 2025年巧家縣社會工作協(xié)會面向社會公開招聘政府購買社會救助服務人員備考題庫及答案詳解一套
- 2025年新疆天筑建工集團有限公司備考題庫及1套完整答案詳解
- 2025年麗江文化旅游學院招聘140名教師備考題庫附答案詳解
- 2025年永州市零陵區(qū)陽光社會工作服務中心招聘人員備考題庫及一套答案詳解
- 2025年天津北海油人力資源咨詢服務有限公司招聘外包工作人員備考題庫完整參考答案詳解
- 2025年國有企業(yè)招聘工作人員備考題庫帶答案詳解
- 2025年浙江中醫(yī)藥大學臨床醫(yī)學院及直屬附屬醫(yī)院公開招聘277人備考題庫參考答案詳解
- 廣西貴百河2025-2026學年高一上學期12月聯(lián)考語文試題
- 2025四川航天川南火工技術有限公司招聘考試題庫及答案1套
- 廣東廣電網(wǎng)絡2026屆秋季校園招聘185人備考題庫完整答案詳解
- 2025年度皮膚科工作總結及2026年工作計劃
- (一診)成都市2023級高三高中畢業(yè)班第一次診斷性檢測物理試卷(含官方答案)
- 四川省2025年高職單招職業(yè)技能綜合測試(中職類)汽車類試卷(含答案解析)
- 2024江蘇無錫江陰高新區(qū)招聘社區(qū)專職網(wǎng)格員9人備考題庫附答案解析
- 2025西部機場集團航空物流有限公司招聘筆試考試備考試題及答案解析
- 植入類器械規(guī)范化培訓
- 生物樣本庫解決方案
- 水泥罐安全操作規(guī)程標準
評論
0/150
提交評論