数据结构实验报告赫夫曼编码算法Word格式文档下载.docx
- 文档编号:22572845
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:873.46KB
数据结构实验报告赫夫曼编码算法Word格式文档下载.docx
《数据结构实验报告赫夫曼编码算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告赫夫曼编码算法Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
可以证明霍夫曼树的WPL是最小的。
五、实验目的:
本实验通过编程实现赫夫曼编码算法,使学生掌握赫夫曼树的构造方法,理解树这种数据结构的应用价值,并能熟练运用C语言的指针实现构建赫夫曼二叉树,培养理论联系实际和自主学习的能力,加强对数据结构的原理理解,提高编程水平。
六、实验内容:
(1)实现输入的英文字符串输入,并设计算法分别统计不同字符在该字符串中出现的次数,字符要区分大小写;
(2)实现赫夫曼树的构建算法;
(3)遍历赫夫曼生成每个字符的二进制编码;
(4)显示输出每个字母的编码。
七、实验器材(设备、元器件):
PC机一台,装有C或C++语言集成开发环境。
八、数据结构与程序:
#include<
stdio.h>
stdlib.h>
string.h>
#defineBUFFERSIZE6000
#defineVERBAL0
#defineDEBUG1
#defineMAXVALUE6000
typedefstructhnode{
intweight;
intlchild,rchild,parent;
}THNode,*TpHTree;
typedefstructhuffman_code
{
char*pcode;
}THCode,*TpHcodeTab;
voidselect_subtree(TpHTreehuffman,intn,int*subA,int*subB){
inti,suba=-1,subb=-1,a=MAXVALUE,b=MAXVALUE;
for(i=0;
i<
=n;
i++){
if(huffman[i].parent==-1){
if(huffman[i].weight<
a){
a=huffman[i].weight;
subb=suba;
suba=i;
}
elseif(huffman[i].weight<
b){
b=huffman[i].weight;
subb=i;
*subA=suba;
*subB=subb;
return;
}
TpHTreecreate_huffman_tree(intweights[],intn){
TpHTreepht;
intsubA,subB,i,num=(2*n)-1;
pht=(TpHTree)malloc(sizeof(THNode)*num);
for(i=0;
num;
++i){
pht[i].weight=weights[i];
pht[i].lchild=-1;
pht[i].rchild=-1;
pht[i].parent=-1;
for(i=n;
select_subtree(pht,i-1,&
subA,&
subB);
pht[subA].parent=i;
pht[subB].parent=i;
pht[i].lchild=subA;
pht[i].rchild=subB;
pht[i].weight=pht[subA].weight+pht[subB].weight;
returnpht;
voidoutput_huffman_tree(TpHTreepht,intn){
inti;
for(i=n+1;
i<
=2*n-1;
i++){
printf("
%d"
pht[pht[i].lchild].weight);
pht[i].weight);
%d\n"
pht[pht[i].rchild].weight);
TpHcodeTabbuild_huffman_code_table(TpHTreepht,intn){
inti,j,k,m,len;
TpHcodeTabtable=(TpHcodeTab)malloc(sizeof(THCode)*n);
char*pch=(char*)malloc(n+1);
n;
m=n;
j=i;
k=pht[j].parent;
table[i].weight=pht[i].weight;
while(k!
=-1){
if(pht[k].lchild==j)
pch[--m]='
0'
;
else
1'
j=k;
len=n-m+1;
table[i].pcode=(char*)malloc(len);
strncpy(table[i].pcode,&
pch[m],strlen(&
pch[m]));
returntable;
char*encode_huffman(TpHcodeTabpht,char*msg,char*dict,intn){
inti,j;
longm,len,offset=0;
char*pch;
pch=(char*)malloc(BUFFERSIZE+1);
m=strlen(msg);
m;
++i){
for(j=1;
j<
++j){
if(msg[i]==dict[j]){
len=strlen(pht[j].pcode);
strncpy(&
pch[offset],pht[j].pcode,len);
offset+=len;
break;
returnpch;
char*decode_huffman(TpHTreepht,char*msg,char*dict,intn){
inti,pos=0,idx=0;
longlen;
len=strlen(msg);
len;
){
idx=(2*n)-2;
while(idx>
=n){
if(msg[i]=='
){
idx=pht[idx].lchild;
++i;
else{
idx=pht[idx].rchild;
pch[pos]=dict[idx];
pos++;
voiddestroy_hctable(TpHcodeTabhcode_table,intn){
++i)
if(hcode_table[i].pcode)
free(hcode_table[i].pcode);
free(hcode_table);
longread_file(char*filename,char*message){
longslen;
FILE*pFile=NULL;
pFile=fopen(filename,"
r"
);
if(!
pFile){
printf("
read_file():
打开文件%s失败!
\n"
filename);
exit(0);
成功打开文件%s!
memset(message,0,BUFFERSIZE);
if(fgets(message,BUFFERSIZE-1,pFile)==NULL){
printf("
fgetserror\n"
);
%s"
message);
slen=strlen(message);
fclose(pFile);
成功读入文件%s!
returnslen;
//统计字符串text中字符出现的频率
intcalc_freq(chartext[],int**freq,char**dict,longn)
inti,k,nchar=0;
int*pwght;
inttokens[128]={0};
tokens[text[i]]++;
128;
if(tokens[i]>
0){
nchar++;
}
pwght=(int*)malloc(sizeof(int)*nchar);
if(!
pwght){
为权重数组分配空间失败!
pch=(char*)malloc(nchar);
pch){
为字符数组(字典)分配空间失败!
k=0;
pwght[k]=tokens[i];
pch[k]=(char)i;
//强制类型转换
k++;
*freq=pwght;
*dict=pch;
returnnchar;
intmain(intargc,char*argv[])
inti,nleaves=0;
longnmsg;
char*filename="
/Users/pro/Desktop/数据结构实验/src/debug/love_letter.txt"
TpHTreepht=NULL;
TpHcodeTabhcode_table;
charmsg[BUFFERSIZE];
int*weights=NULL;
char*dict=NULL;
char*pcode=NULL;
char*ptxt=NULL;
nmsg=read_file(filename,msg);
%s\n"
msg);
nleaves=calc_freq(msg,&
weights,&
dict,nmsg);
nleaves;
%d%c:
i,dict[i],weights[i]);
pht=create_huffman_tree(weights,nleaves);
output_huffman_tree(pht,nleaves);
hcode_table=build_huffman_code_table(pht,nleaves);
\nHuffman编码表如下:
pcode=encode_huffman(hcode_table,msg,dict,nleaves);
\nHuffman编码为:
\n%s\n"
pcode);
ptxt=decode_huffman(pht,pcode,dict,nleaves);
\n编码的解码为:
\n%s\n"
ptxt);
destroy_hctable(hcode_table,nleaves);
if(pht){
free(pht);
if(pcode){
free(pcode);
if(ptxt){
free(ptxt);
if(dict){
free(dict);
if(weights){
free(weights);
return0;
}九、程序运行结果:
运行程序:
成功打开文件:
各个字符的权重:
构建出二叉树:
实验成功
十、实验结论:
哈夫曼树编码可以很好的压缩编码,在通信工程学有非常大的意义。
十一、总结及心得体会:
本实验较其他实验难度较大,但只要用于迎难而上,多Debug,适当的参考一些写得好的代码,还是可以很好的完成的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 赫夫曼 编码 算法