




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、用哈夫曼樹(shù)實(shí)現(xiàn)壓縮解壓程序是用VC+6.0編譯完成的,可以完成對(duì)任意文件的壓縮解壓(為方便尋找,壓縮出的文件與待壓縮文件在同一文件夾中),但壓縮文件夾還不可以,另外該程序還能打印出壓縮時(shí)所建立的哈夫曼樹(shù)及哈夫曼編碼。源代碼如下:#include #include #include #include typedef struct node long w; short p,l,r; htnode,*htnp;typedef struct huffman_code unsigned char len; unsigned char *codestr; hufcode;typedef char *huf
2、fmancode;int initial_files(char *source_filename,FILE *inp,char *obj_filename,FILE *outp);char *create_filename(char *source_filename,char* obj_filename);int compress(char *source_filename,char *obj_filename);long frequency_data(FILE *in,long fre);int search_set(htnp ht,int n,int *s1, int *s2);int c
3、reate_hftree(long w,int n,htnode ht);int encode_hftree(htnp htp,int n,hufcode hc);unsigned char chars_to_bits(const unsigned char chars8);int write_compress_file(FILE *in,FILE *out,htnp ht,hufcode hc,char* source_filename,long source_filesize);int decompress(char *source_filename,char *obj_filename)
4、;void get_mini_huffmantree(FILE* in,short mini_ht2);int write_decompress_file(FILE *in,FILE* out,short mini_ht2,long bits_pos,long obj_filesize);int d_initial_files(char *source_filename,FILE *inp,char *obj_filename,FILE *outp);main()int s;char filename10;system(color 3F);printf( *n);printf( * 菜單: *
5、n);printf( * 1.壓縮 *n);printf( * 2.-解壓縮- *n);printf( * 0.退出 *n);printf( *n);scanf(%d,&s);while(s!=0)getchar();switch(s)case 1:puts(請(qǐng)輸入待壓縮文件路徑:);gets(filename);compress(filename,NULL);break;case 2:puts(請(qǐng)輸入待解壓文件路徑:);gets(filename);decompress(filename,NULL);break;default : printf(指令錯(cuò)誤!請(qǐng)重新輸入指令:n);puts( )
6、;printf( *n);printf( * 菜單: *n);printf( * 1.壓縮 *n);printf( * 2.-解壓縮- *n);printf( * 0.退出 *n);printf( *n);scanf(%d,&s);int initial_files(char *source_filename,FILE *inp,char *obj_filename,FILE *outp) if(fopen(source_filename,rb)=NULL) return -1; if(obj_filename=NULL) if(obj_filename=(char*)malloc(256*s
7、izeof(char)=NULL) return -1; create_filename(source_filename,obj_filename); if(strcmp(source_filename,obj_filename)=0) return -1; printf(待壓縮文件:%s,壓縮文件:%sn,source_filename,obj_filename); if(*outp=fopen(obj_filename,wb)=NULL) return -1; if(*inp=fopen(source_filename,rb)=NULL) return -1; free(obj_filen
8、ame); return 0; char *create_filename(char *source_filename,char* obj_filename) char *temp; if(temp=strrchr(source_filename,.)=NULL) strcpy(obj_filename,source_filename); strcat(obj_filename,.zip); else strncpy(obj_filename,source_filename,temp-source_filename); obj_filenametemp-source_filename=0; s
9、trcat(obj_filename,.zip); return obj_filename;int compress(char *source_filename,char *obj_filename) FILE *in,*out;char ch; int error_code,i,j; float compress_rate; hufcode hc256; htnode ht256*2-1; long frequency256,source_filesize,obj_filesize=0; error_code=initial_files(source_filename,&in,obj_fil
10、ename,&out); if(error_code!=0) puts(文件打開(kāi)失??!請(qǐng)重新輸入文件路徑:); return error_code; source_filesize=frequency_data(in,frequency); printf(文件大小 %ld 字節(jié)n,source_filesize); error_code=create_hftree(frequency,256,ht); if(error_code!=0) puts(建立哈夫曼樹(shù)失??!); return error_code; error_code=encode_hftree(ht,256,hc); if(err
11、or_code!=0) puts(建立哈夫曼編碼失??!); return error_code; for(i=0;i256;i+) obj_filesize+=frequencyi*hci.len; obj_filesize=obj_filesize%8=0?obj_filesize/8:obj_filesize/8+1; for(i=0;i256-1;i+) obj_filesize+=2*sizeof(short); obj_filesize+=strlen(source_filename)+1; obj_filesize+=sizeof(long); obj_filesize+=size
12、of(unsigned int); compress_rate=(float)obj_filesize/source_filesize; printf(壓縮文件大小:%ld字節(jié),壓縮比例:%.2lf%n,obj_filesize,compress_rate*100); error_code=write_compress_file(in,out,ht,hc,source_filename,source_filesize); if(error_code!=0) puts(寫(xiě)入文件失敗!); return error_code; puts(壓縮完成!); puts( );puts(是否打印該文件中字
13、符對(duì)應(yīng)的huffman樹(shù)及編碼?);puts( Please input Y OR N);doscanf(%s,&ch);switch(ch)case Y: puts(以下是哈夫曼樹(shù):);for(i=256;i0)printf(%-10d%-10d%-10d%-10d%-10dn,i,hti.w,hti.p,hti.l,hti.r);puts(以下是哈夫曼編碼:);for(i=0;i256;i+)if(frequencyi=0)i+;elseprintf(%dt,frequencyi);for(j=0;jhci.len;j+)printf( %d,hci.codestrj);printf(n)
14、;break;case N:break;default : printf(指令錯(cuò)誤!請(qǐng)重新輸入指令:n);while(ch!=Y&ch!=N); fclose(in); fclose(out); for(i=0;i256;i+) free(hci.codestr); return 0; long frequency_data(FILE *in,long frequency) int i,read_len; unsigned char buf256; long filesize; for(i=0;i256;i+) frequencyi=0; fseek(in,0L,SEEK_SET); read
15、_len=256; while(read_len=256) read_len=fread(buf,1,256,in); for(i=0;iread_len;i+) frequency*(buf+i)+; for(i=0,filesize=0;i256;i+) filesize+=frequencyi; return filesize; int search_set(htnp ht,int n,int *s1, int *s2) int i,x; long minValue = 1000000,min = 0; for(x=0;xn;x+) if(htx.p=-1) break; for(i=0
16、;in;i+) if(hti.p=-1 & hti.w minValue) minValue = hti.w; min=i; *s1 = min; minValue = 1000000,min = 0; for(i=0;in;i+) if(hti.p=-1 & hti.w minValue & i != *s1) minValue = hti.w; min=i; *s2 = min; return 1; int create_hftree(long w,int n,htnode ht) int m,i,s1,s2; if (n1) return -1; m=2*n-1; if (ht=NULL
17、) return -1; for(i=0;in;i+) hti.w=wi;hti.p=hti.l=hti.r=-1; for(;im;i+) hti.w=hti.p=hti.l=hti.r=-1; for(i=n;im;i+) search_set(ht,i,&s1,&s2); hts1.p = hts2.p = i; hti.l = s1;hti.r = s2; hti.w = hts1.w + hts2.w; return 0; int encode_hftree(htnp htp,int n,hufcode hc) int i,j,p,codelen; unsigned char *co
18、de=(unsigned char*)malloc(n*sizeof(unsigned char); if (code=NULL) return -1; for(i=0;in;i+) for(p=i,codelen=0;p!=2*n-2;p=htpp.p,codelen+) codecodelen=(htphtpp.p.l=p?0:1); if(hci.codestr=(unsigned char *)malloc(codelen)*sizeof(unsigned char)=NULL) return -1; hci.len=codelen; for(j=0;jcodelen;j+) hci.
19、codestrj=codecodelen-j-1; free(code); return 0; unsigned char chars_to_bits(const unsigned char chars8) int i; unsigned char bits=0; bits|=chars0; for(i=1;i8;+i) bits=1; bits|=charsi; return bits; int write_compress_file(FILE *in,FILE *out,htnp ht,hufcode hc,char* source_filename,long source_filesiz
20、e) unsigned int i,read_counter,write_counter,zip_head=0xFFFFFFFF; unsigned char write_char_counter,code_char_counter,copy_char_counter, read_buf256,write_buf256,write_chars8,filename_size=strlen(source_filename); hufcode *cur_hufcode; fseek(in,0L,SEEK_SET); fseek(out,0L,SEEK_SET); fwrite(&zip_head,s
21、izeof(unsigned int),1,out); fwrite(&filename_size,sizeof(unsigned char),1,out); fwrite(source_filename,sizeof(char),filename_size,out); fwrite(&source_filesize,sizeof(long),1,out); for(i=256;i256*2-1;i+) fwrite(&(hti.l),sizeof(hti.l),1,out); fwrite(&(hti.r),sizeof(hti.r),1,out); write_counter=write_
22、char_counter=0; read_counter=256; while(read_counter=256) read_counter=fread(read_buf,1,256,in); for(i=0;ilen) copy_char_counter= (8-write_char_counter cur_hufcode-len-code_char_counter ? cur_hufcode-len-code_char_counter : 8-write_char_counter); memcpy(write_chars+write_char_counter,cur_hufcode-cod
23、estr+code_char_counter,copy_char_counter); write_char_counter+=copy_char_counter; code_char_counter+=copy_char_counter; if(write_char_counter=8) write_char_counter=0; write_bufwrite_counter+=chars_to_bits(write_chars); if(write_counter=256) fwrite(write_buf,1,256,out); write_counter=0; fwrite(write_
24、buf,1,write_counter,out); if(write_char_counter!=0) write_char_counter=chars_to_bits(write_chars); fwrite(&write_char_counter,1,1,out); return 0; void get_mini_huffmantree(FILE* in,short mini_ht2) int i; for(i=0;i=1) cur_pos=(read_bufread_counter&convert_bit)=0?mini_htcur_pos0:mini_htcur_pos1); if(c
25、ur_pos256) write_bufwrite_counter=(unsigned char)cur_pos; if(+write_counter=256) fwrite(write_buf,1,256,out); write_counter=0; cur_pos=256*2-2; if(+cur_size=obj_filesize) break; fwrite(write_buf,1,write_counter,out); return 0; int decompress(char *source_filename,char *obj_filename) int error_code;
26、FILE *in,*out; short mini_ht256*2-12; long obj_filesize; error_code=d_initial_files(source_filename,&in,obj_filename,&out); if(error_code!=0) puts(打開(kāi)文件失敗!請(qǐng)重新輸入文件路徑:); return error_code; fread(&obj_filesize,sizeof(long),1,in); printf(解壓文件大小:%ld字節(jié)n,obj_filesize); get_mini_huffmantree(in,mini_ht); error_code=write_decompress_file(in,out,mini_ht,ftell(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 各地b解備考析數(shù)學(xué)試題分類匯編函數(shù)
- 期貨交易保證擔(dān)保合同范本
- 智能家居產(chǎn)業(yè)股權(quán)代理轉(zhuǎn)讓與物聯(lián)網(wǎng)合作協(xié)議
- 主題餐廳特許經(jīng)營(yíng)授權(quán)合同
- 人教版二下音樂(lè)教學(xué)課件
- 噪音污染對(duì)公共健康的影響研究考核試卷
- 施工進(jìn)度管理體系考核試卷
- 流調(diào)員面試題及答案
- 獸藥不良反應(yīng)監(jiān)測(cè)與獸藥臨床驗(yàn)證研究考核試卷
- 母豬分娩試題及答案
- 運(yùn)輸公司交通安全培訓(xùn)課件
- 2025年陜西省中考數(shù)學(xué)試題(解析版)
- 《康復(fù)治療學(xué)專業(yè)畢業(yè)實(shí)習(xí)》教學(xué)大綱
- 北師大版7年級(jí)數(shù)學(xué)下冊(cè)期末真題專項(xiàng)練習(xí) 03 計(jì)算題(含答案)
- 職業(yè)衛(wèi)生管理制度和操作規(guī)程標(biāo)準(zhǔn)版
- 小學(xué)信息技術(shù)四年級(jí)下冊(cè)教案(全冊(cè))
- 河道保潔船管理制度
- 【增程式電動(dòng)拖拉機(jī)驅(qū)動(dòng)系統(tǒng)總體設(shè)計(jì)方案計(jì)算1900字】
- 2025年重慶市中考物理試卷真題(含標(biāo)準(zhǔn)答案)
- 2025至2030中國(guó)云計(jì)算行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 黨課課件含講稿:《關(guān)于加強(qiáng)黨的作風(fēng)建設(shè)論述摘編》輔導(dǎo)報(bào)告
評(píng)論
0/150
提交評(píng)論