用哈夫曼树实现压缩解压Word下载.docx
- 文档编号:20757651
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:19
- 大小:235.76KB
用哈夫曼树实现压缩解压Word下载.docx
《用哈夫曼树实现压缩解压Word下载.docx》由会员分享,可在线阅读,更多相关《用哈夫曼树实现压缩解压Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
charfilename[10];
system("
color3F"
);
printf("
***************************************\n"
*菜单:
*\n"
*1.——————压缩——————*\n"
*2.—————-解压缩—————-*\n"
*0.——————退出——————*\n"
scanf("
%d"
&
s);
while(s!
=0)
{
getchar();
switch(s)
{
case1:
puts("
请输入待压缩文件路径:
"
gets(filename);
compress(filename,NULL);
break;
case2:
请输入待解压文件路径:
decompress(filename,NULL);
default:
printf("
指令错误!
请重新输入指令:
\n"
}
puts("
"
printf("
scanf("
}
}
intinitial_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)
create_filename(source_filename,obj_filename);
if(strcmp(source_filename,obj_filename)==0)
待压缩文件:
%s,压缩文件:
%s\n"
source_filename,obj_filename);
if((*outp=fopen(obj_filename,"
wb"
))==NULL)
if((*inp=fopen(source_filename,"
free(obj_filename);
return0;
}
char*create_filename(char*source_filename,char*obj_filename)
char*temp;
if((temp=strrchr(source_filename,'
.'
strcpy(obj_filename,source_filename);
strcat(obj_filename,"
.zip"
else
strncpy(obj_filename,source_filename,temp-source_filename);
obj_filename[temp-source_filename]='
\0'
;
returnobj_filename;
intcompress(char*source_filename,char*obj_filename)
FILE*in,*out;
charch;
interror_code,i,j;
floatcompress_rate;
hufcodehc[256];
htnodeht[256*2-1];
longfrequency[256],source_filesize,obj_filesize=0;
error_code=initial_files(source_filename,&
in,obj_filename,&
out);
if(error_code!
=0)
文件打开失败!
请重新输入文件路径:
returnerror_code;
source_filesize=frequency_data(in,frequency);
文件大小%ld字节\n"
source_filesize);
error_code=create_hftree(frequency,256,ht);
建立哈夫曼树失败!
error_code=encode_hftree(ht,256,hc);
建立哈夫曼编码失败!
for(i=0;
i<
256;
i++)
obj_filesize+=frequency[i]*hc[i].len;
obj_filesize=obj_filesize%8==0?
obj_filesize/8:
obj_filesize/8+1;
256-1;
obj_filesize+=2*sizeof(short);
obj_filesize+=strlen(source_filename)+1;
obj_filesize+=sizeof(long);
obj_filesize+=sizeof(unsignedint);
compress_rate=(float)obj_filesize/source_filesize;
压缩文件大小:
%ld字节,压缩比例:
%.2lf%%\n"
obj_filesize,compress_rate*100);
error_code=write_compress_file(in,out,ht,hc,source_filename,source_filesize);
写入文件失败!
puts("
压缩完成!
是否打印该文件中字符对应的huffman树及编码?
PleaseinputYORN"
do{
%s"
ch);
switch(ch)
case'
Y'
:
以下是哈夫曼树:
for(i=256;
256*2-2;
i++)
{
if(ht[i].w>
0)
printf("
%-10d%-10d%-10d%-10d%-10d\n"
i,ht[i].w,ht[i].p,ht[i].l,ht[i].r);
}
以下是哈夫曼编码:
for(i=0;
if(frequency[i]==0)
i++;
else
{
%d\t"
frequency[i]);
for(j=0;
j<
hc[i].len;
j++)
printf("
%d"
hc[i].codestr[j]);
}
N'
break;
}while(ch!
='
&
ch!
fclose(in);
fclose(out);
free(hc[i].codestr);
longfrequency_data(FILE*in,longfrequency[])
inti,read_len;
unsignedcharbuf[256];
longfilesize;
frequency[i]=0;
fseek(in,0L,SEEK_SET);
read_len=256;
while(read_len==256)
read_len=fread(buf,1,256,in);
read_len;
frequency[*(buf+i)]++;
for(i=0,filesize=0;
filesize+=frequency[i];
returnfilesize;
intsearch_set(htnpht,intn,int*s1,int*s2)
inti,x;
longminValue=1000000,min=0;
for(x=0;
x<
n;
x++)
if(ht[x].p==-1)break;
if(ht[i].p==-1&
ht[i].w<
minValue)
minValue=ht[i].w;
min=i;
*s1=min;
minValue=1000000,min=0;
minValue&
i!
=*s1)
minValue=ht[i].w;
*s2=min;
return1;
intcreate_hftree(longw[],intn,htnodeht[])
intm,i,s1,s2;
if(n<
1)return-1;
m=2*n-1;
if(ht==NULL)return-1;
ht[i].w=w[i];
ht[i].p=ht[i].l=ht[i].r=-1;
for(;
m;
ht[i].w=ht[i].p=ht[i].l=ht[i].r=-1;
for(i=n;
search_set(ht,i,&
s1,&
s2);
ht[s1].p=ht[s2].p=i;
ht[i].l=s1;
ht[i].r=s2;
ht[i].w=ht[s1].w+ht[s2].w;
intencode_hftree(htnphtp,intn,hufcodehc[])
inti,j,p,codelen;
unsignedchar*code=(unsignedchar*)malloc(n*sizeof(unsignedchar));
if(code==NULL)return-1;
for(p=i,codelen=0;
p!
=2*n-2;
p=htp[p].p,codelen++)
code[codelen]=(htp[htp[p].p].l==p?
0:
1);
if((hc[i].codestr=(unsignedchar*)malloc((codelen)*sizeof(unsignedchar)))==NULL)
hc[i].len=codelen;
for(j=0;
codelen;
j++)
hc[i].codestr[j]=code[codelen-j-1];
free(code);
unsignedcharchars_to_bits(constunsignedcharchars[8])
inti;
unsignedcharbits=0;
bits|=chars[0];
for(i=1;
8;
++i)
bits<
<
=1;
bits|=chars[i];
returnbits;
intwrite_compress_file(FILE*in,FILE*out,htnpht,hufcodehc[],char*source_filename,longsource_filesize)
unsignedinti,read_counter,write_counter,zip_head=0xFFFFFFFF;
unsignedcharwrite_char_counter,code_char_counter,copy_char_counter,
read_buf[256],write_buf[256],write_chars[8],filename_size=strlen(source_filename);
hufcode*cur_hufcode;
fseek(out,0L,SEEK_SET);
fwrite(&
zip_head,sizeof(unsignedint),1,out);
filename_size,sizeof(unsignedchar),1,out);
fwrite(source_filename,sizeof(char),filename_size,out);
source_filesize,sizeof(long),1,out);
for(i=256;
256*2-1;
(ht[i].l),sizeof(ht[i].l),1,out);
(ht[i].r),sizeof(ht[i].r),1,out);
write_counter=write_char_counter=0;
read_counter=256;
while(read_counter==256)
read_counter=fread(read_buf,1,256,in);
read_counter;
cur_hufcode=&
hc[read_buf[i]];
code_char_counter=0;
while(code_char_counter!
=cur_hufcode->
len)
copy_char_counter=(8-write_char_counter>
cur_hufcode->
len-code_char_counter?
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_counter;
if(write_char_counter==8)
write_char_counter=0;
write_buf[write_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!
write_char_counter=chars_to_bits(write_chars);
write_char_counter,1,1,out);
voidget_mini_huffmantree(FILE*in,shortmini_ht[][2])
mini_ht[i][0]=mini_ht[i][1]=-1;
fread(mini_ht[i],sizeof(short),2*(256-1),in);
intwrite_decompress_file(FILE*in,FILE*out,shortmini_ht[][2],longbits_pos,longobj_filesize)
longcur_size;
unsignedcharread_buf[256],write_buf[256],convert_bit;
unsignedintread_counter,write_counter,cur_pos;
fseek(in,bits_pos,SEEK_SET);
read_counter=256-1;
cur_size=write_counter=0;
cur_pos=256*2-2;
while(cur_size!
=obj_filesize)
if(++read_counter==256)
fread(read_buf,1,256,in);
read_counter=0;
for(convert_bit=128;
convert_bit!
=0;
convert_bit>
>
=1)
cur_pos=((read_buf[read_counter]&
convert_bit)==0?
mini_ht[cur_pos][0]:
mini_ht[cur_pos
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用哈夫曼树 实现 压缩 解压