ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:27.79KB ,
资源ID:9868525      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9868525.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(用哈夫曼树实现压缩解压.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

用哈夫曼树实现压缩解压.docx

1、用哈夫曼树实现压缩解压用哈夫曼树实现压缩解压程序是用 VC+ 编译完成的,可以完成对任意文件的压缩解压 (为 方便寻找,压缩出的文件与待压缩文件在同一文件夹中) ,但压缩文 件夹还不可以, 另外该程序还能打印出压缩时所建立的哈夫曼树及哈 夫曼编码。源代码如下:#include #include #include #include typedef struct nodelong w;short p,l,r;htnode,*htnp;typedef struct huffman_codeunsigned char len;unsigned char *codestr;hufcode;typedef

2、 char *huffmancode;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

3、*s2);int create_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

4、_filename);void get_mini_huffmantree(FILE* in,short mini_ht2);int write_decompress_file(FILE *in,FILE* mini_ht2,long bits_pos,long obj_filesize);int d_initial_files(char *source_filename,FILE *obj_filename,FILE *outp);main()int s;char filename10;system(color 3F);printf(*n);printf( *n);printf( * 1.ou

5、t,short*inp,char菜单:压缩*n);*n);退出printf( * 0. *n);printf( *n);scanf(%d,&s);while(s!=0)getchar();switch(s)case 1:puts(请输入待压缩文件路径:);gets(filename);compress(filename,NULL);break;case 2:puts(请输入待解压文件路径:);gets(filename);decompress(filename,NULL); break;default :printf( 指令错误!请重新输入指令: n);puts( );printf(*n);p

6、rintf( * 菜单: *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*sizeof(char)=NULL)

7、return -1; create_filename(source_filename,obj_filename);if(strcmp(source_filename,obj_filename)=0)return -1;printf( 待 压 缩 文 件 :%s, 压 缩件:sn,source_file name,obj_file name);if(*outp=fopen(obj_filename,wb)=NULL)return -1;if(*inp=fopen(source_filename,rb)=NULL)return -1;free(obj_filename);return 0;char

8、 *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);elsestrncpy(obj_filename,source_filename,temp-source_filename);obj_filenametemp-source_filename=0;strcat(obj_filename,.zip);

9、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_filename,&out);if(error_code!=0)puts

10、(文件打开失败!请重新输入文件路径:);return error_code;source_filesize=frequency_data(in,frequency); printf( 文件大小 %ld 字节 n,source_filesize); error_code=create_hftree(frequency,256,ht); if(error_code!=0)puts(”建立哈夫曼树失败!);return error_code;error_code=encode_hftree(ht,256,hc);if(error_code!=0)puts(建立哈夫曼编码失败! ”);return e

11、rror_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+=sizeof(unsigned int);compress_rate=(float)obj_fi

12、lesize/source_filesize;printf( 压 缩 文 件 大 小 :%ld 字 节 , 压 缩 比例:.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(写入文件失败!);return error_code;puts(压缩完成!);puts( );puts(”是否打印该文件中字符对应的huffman树及编码? ”);puts( Please input

13、Y OR N);doscanf(%s,&ch);switch(ch)case Y:puts(”以下是哈夫曼树:”);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);break; case N: break;default :n)

14、;printf( 指令错误!请重新输入指令: 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_len=256;while(read_len=256)read_len=frea

15、d(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;in;i+)if(hti.p=-1 & hti.w minValue)minValue = hti.w;m

16、in=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) return -1;for(i=0;in;i+)hti.w=wi;hti.p=hti.l=hti.r=-1;for(;im;i+)hti

17、.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;*code=(unsignedunsigned char char*)malloc(n*sizeof(unsigned char);if (code=NULL) return -1;for(i=0;

18、in;i+)for(p=i,codelen=0;p!=2*n-2;p=htpp.p,codelen+) codecodelen=(htphtpp.p.l=p?0:1);charif(hci.codestr=(unsigned*)malloc(codelen)*sizeof(unsigned char)=NULL)return -1;hci.len=codelen;for(j=0;jcodelen;j+)hci.codestrj=codecodelen-j-1;free(code);return 0; unsigned char chars_to_bits(const unsigned char

19、 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_filesize)unsigned int i,read_counter,write_counter,zip_head=0xFFFFFFFF;unsigned charwrite_char_counter,cod

20、e_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,sizeof(unsigned int),1,out); fwrite(&filename_size,sizeof(unsigned char),1,out); fwrite(source_filename,si

21、zeof(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_char_counter=0;read_counter=256;while(read_counter=256) read_counter=fread(read_buf,1,256,in); for(i=0;ilen)

22、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-codestr+code_char_counter,copy_char_counter);write_char_counter+=copy_char_counter;code_char_counter+=copy_char_coun

23、ter; 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_buf,1,write_counter,out);if(write_char_counter!=0)write_char_counter=chars_to_bits(write_chars); fwrite(&write_char_count

24、er,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(cur_pos256)write_bufwrite_counter=(unsignedchar)cur_pos;if(+write_counter=256)fwrite(write_buf,1,256,out);write_counter=0;cur_pos

25、=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)interror_code;FILE*in,*out;shortmini_ht256*2-12;longobj_filesize;error_code=d_initial_files(source_filename,&in,obj_filename,&out);if(error_code!=0)puts(”打开文件失败!请重新输入文件路径:);return error_code;fread(&obj_filesize,sizeof(long),1,in);printf( 解压文件大小 :%ld 字节 n,obj_filesize);get_mini_huffmantree(in,mini_ht);error_code=write_decompress_file(in,out,mini_ht,ftell(in),obj_filesize);if(error_code!=0)puts(”解压缩失败! ”);return e

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1