哈弗曼数据结构专题实验报告.docx
- 文档编号:26309893
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:18
- 大小:271.59KB
哈弗曼数据结构专题实验报告.docx
《哈弗曼数据结构专题实验报告.docx》由会员分享,可在线阅读,更多相关《哈弗曼数据结构专题实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
哈弗曼数据结构专题实验报告
数据结构与程序设计专题
实验报告
:
学号:
班级:
信息45班
:
学号:
班级:
信息45班
:
学号:
班级:
信息45班
实验指导老师:
峰
实验地点:
西一楼一层计算机中心机房
实验结束日期:
12月5日
联系:
一.实验任务:
对于给定的源文档SourceDoc.txt,
1)统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数),字符包括字母(区分大小写)、标点符号及格式控制符(空格、回车等)。
2)按频度统计结果构建哈夫曼编码表。
3)基于哈夫曼编码表进行编码,生成对应的二进制码流,并输出到文件Encode.dat,完成信源的编码过程。
4)根据生成的哈夫曼编码表,对二进制码流文件Encode.dat进行解码,把结果输出到文件TargetDoc.txt,完成信源的解码过程。
5)判断TargetDoc.txt与SourceDoc.txt容是否一致,以验证编解码系统的正确性。
二.实验容:
1)线性链表的构建以及排序;
2)哈夫曼树的构建;
3)基于哈夫曼码进行编码;
4)对二进制码进行解码;
5)对生成文件与原文件进行比较;
三.程序的算法描述
四.程序运行结果:
五.源程序代码:
#include
#include
#include
#include
typedefstructaa
{chardata;
doublerate;
intcount;
structaa*next;
structaa*pre;
charhaffmancode[120];
}NODE;
NODE*creat(charb[])
{NODE*h,*p,*s,*death;
inti;
h=(NODE*)malloc(sizeof(NODE));p=(NODE*)malloc(sizeof(NODE));
h->next=p;h->pre=NULL;
p->pre=h;p->next=NULL;
p->data=b[0];p->count=1.0;
for(i=1;b[i]!
='\0';i++)
{s=(NODE*)malloc(sizeof(NODE));
s->data=b[i];s->count=1.0;
s->next=NULL;s->pre=p;
p->next=s;
p=s;
}
returnh;
}
voidfun(NODE*h,intamount)
{NODE*p,*q,*death;
for(p=h->next;p;p=p->next){
for(q=p->next;q;){
if(q->data==p->data){
(p->count)++;
if(q->next==NULL){
q->pre->next=NULL;
free(q);
break;
}
else{q->pre->next=q->next;
q->next->pre=q->pre;
death=q;q=q->next;
free(death);
}
}
elseq=q->next;
}
(p->rate)=1.0*(p->count)/amount;
//printf("%c:
\t%d\t%f\n",p->data,p->count,p->rate);
}puts("构建链表完成\n");
}
voidoutlink(NODE*h,int*n)
{
//printf("%d",amount);
NODE*p=(NODE*)malloc(sizeof(NODE));
NODE*s=(NODE*)malloc(sizeof(NODE));
inti;
charch;
doubler;
for(p=h->next;p;p=p->next)
{
for(s=p->next;s;s=s->next)
{
if(s->count>p->count)
{
i=p->count;
p->count=s->count;
s->count=i;
ch=p->data;
p->data=s->data;
s->data=ch;
r=p->rate;
p->rate=s->rate;
s->rate=r;
}
}
}
p=h->next;
while(p){
//printf("%c:
\t%d\t%f\n",p->data,p->count,p->rate);
(*n)++;
p=p->next;
}puts("排序完成\n");
}
typedefstruct{
NODEbody;
intlchild,rchild,parent;
structTreenode*next;
}HTNode,*Tree;
typedefchar**Huffmancode;
voidselect(Tree&HT,intn,int&s1,int&s2){
inti,j;
for(i=1;i<=n;i++)
if(!
HT[i].parent){s1=i;break;}
for(j=i+1;j<=n;j++)
if(!
HT[j].parent){s2=j;break;}
for(i=1;i<=n;i++)
if((HT[s1].body.rate>HT[i].body.rate)&&(!
HT[i].parent)&&(s2!
=i))
s1=i;
for(j=1;j<=n;j++)
if((HT[s2].body.rate>HT[j].body.rate)&&(!
HT[j].parent)&&(s1!
=j))
s2=j;
}
voidHuffmancoding(Tree&HT,Huffmancode&HC,intn,NODE*head,int*wei){
HTNode*p;
intm=2*n-1,i;
ints1,s2;
NODE*L=head->next;
HT=(Tree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;i++,p++){
p->body=*L;
L=L->next;
p->lchild=0;p->parent=0;p->rchild=0;
}
for(;i<=m;p++,i++){
p->body.rate=0;p->lchild=0;p->parent=0;p->rchild=0;
}
for(i=n+1;i<=m;i++){
select(HT,i-1,s1,s2);
HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;
HT[i].rchild=s2;HT[i].body.rate=HT[s1].body.rate+HT[s2].body.rate;}
for(i=n+1;i<=m;i++){
if(HT[i].parent==0){
*wei=i;}
}
HC=(Huffmancode)malloc((n+1)*sizeof(char*));
char*temp=(char*)malloc(n*sizeof(char));
temp[n-1]='\0';
for(i=0;i intstart=n-1; for(intf=HT[i].parent,h=i;f;h=f,f=HT[f].parent){ if(HT[f].lchild==h){ temp[--start]='0';} else{ temp[--start]='1';} } //HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HT[i].body.haffmancode,&temp[start]); } free(temp); FILE*fw; fw=fopen("Statistic.txt","wt"); for(i=1;i { fprintf(fw,"%c: \t%d\t%f\t%s\n",HT[i].body.data,HT[i].body.count,HT[i].body.rate,HT[i].body.haffmancode); } puts("哈夫曼编码完成,Statistic.txt文件生成完毕\n"); fclose(fw); } voidputdat(NODE*h,FILE*fp,FILE*ft,FILE*fw,Tree&HT,int*wei,int*nc){ charqq[10000]={0}; intt[10000]={0}; inti=0,j=0,n=0,last=*nc; rewind(fp); charpp[10000]={0}; //strcpy(pp,"\0"); NODE*L=h->next; while(L){ i=0; while(i if(L->data==HT[i].body.data)strcpy(L->haffmancode,HT[i].body.haffmancode); i++; } L=L->next; } charcp=fgetc(fp); while(cp! =EOF) { L=h->next; while(cp! =L->data) L=L->next; strcat(pp,L->haffmancode); cp=fgetc(fp); } //printf("%s\n\n",pp); i=0; while(pp[i]! ='\0'){ n=0; while(n<15&&pp[i]! ='\0'){ if(pp[i]=='1'){ t[j]=t[j]|1; } if(n! =14&&pp[i+1]! ='\0'){t[j]=t[j]<<1;} n++; i++; } if(pp[i]=='\0'){t[j+1]=0;last=n;break;} j++; } //for(;t[n]! =0;n++);//itoa(t[0],string,2);printf("string=%s\n",string); fwrite(&t[0],sizeof(char),j-1,fw); i=0;j=0; while(t[j+1]! ='\0'){ n=14; while(n>=0){ doublea=pow(2,n); if((t[j]&(int)a)==(int)a){ qq[i]='1';} else{qq[i]='0';} n--; i++; } j++; } n=last-1; while(n>=0){doublea=pow(2,n); if((t[j]&(int)a)==(int)a) qq[i]='1'; elseqq[i]='0'; n--;i++;}qq[i]='\0'; //printf("%s",qq); introot=*wei; charc; i=0; while(qq[i]! ='\0') {c=qq[i]; if(qq[i]=='0'){ root=HT[root].lchild;} else{ root=HT[root].rchild;} if(HT[root].rchild==0&&HT[root].lchild==0){ fprintf(ft,"%c",HT[root].body.data); root=*wei;} i++; }puts("解码完成,Target.txt文件生成\n"); } boolcompare(FILE*fp,FILE*ft) { rewind(fp); charch1=fgetc(fp); charch2=fgetc(ft); while(ch1! =EOF&&ch2! =EOF) { if(ch1! =ch2) break; ch1=fgetc(fp); ch2=fgetc(ft); } returnch1==ch2&&ch1==EOF? true: false; } intmain() {FILE*fp; charch; intt=0; charb[10000]; if((fp=fopen("source.txt","rt"))==NULL) {printf("\ncannotopenfile"); return0;} ch=fgetc(fp); while(ch! =EOF) {ch=fgetc(fp); b[cnt]=ch; t++; } FILE*fw; fw=fopen("Encode.dat","wb"); if(! fw){ printf("NOSPACE%s\n"); return0; } intamount=strlen(b); intn=0,m=2*n-1,i; NODE*head; head=creat(b); fun(head,amount); outlink(head,&n); TreeHT; char**HC; floattemp; intwei; HT=(Tree)malloc((m+1)*sizeof(HTNode)); HC=(Huffmancode)malloc((n)*sizeof(char*)); Huffmancoding(HT,HC,n,head,&wei); FILE*ft; ft=fopen("Target.txt","wt"); if(! ft){ printf("NOSPACEFORTarget.txt"); return0; } putdat(head,fp,ft,fw,HT,&wei,&n); fclose(ft); fclose(fp); if(! ft){ printf("NOSPACEFORTarget.txt"); return0; } fclose(ft); FILE*ftnew; ftnew=fopen("TargetDoc.txt","rt+"); boolresult=compare(fp,ftnew); if(result==true) { puts("目标文件与原文件一致\n"); } else puts("目标文件与原文件不一致\n"); fclose(ftnew); system("pause"); return0; } 六.实验总结: 从程序的编写来看,感觉这次自己真的学到了好多,特别是对程序的开发流程。 从最初的选定程序,到最终的程序运行成功,其中遇到了很多问题,解决了好多问题,让我感到如果是仅仅掌握课本上的知识是远远不能够很好的应用到实际的编程中去的。 在这个过程中还需要我们更多的去考虑到实际条件的种种限制和约束。 总之,经过本次专业课程设计,让我们对数据结构以及C语言掌握更加深入,让我掌握了开发应用软件的基本流程,运用所学编程技能的基本技巧,也让我初步了解了软件设计的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为以后毕业设计和工程实践等打下良好的基础。 相信通过这次的课程设计,我对所学的《数据结构(C语言版)》和各种编程语言都有了一个全新的认识。 我也会积极吸取本次课程设计的经验,继续研究数据结构和所学的各种编程语言。 七.致词: 值此实验完成之际,首先要感指导教师峰、顿玉洁老师。 老师从一开始就非常耐心的对我们进行指导。 给我提供了大量建议,告诉我应该注意的细节问题,细心的给我指出错误。 他们对数据结构程序设计专题深刻的见解,使我受益匪浅。 峰、顿玉洁老师诲人不倦的工作作风,一丝不苟的工作态度,严肃认真的治学风格给我们留下深刻的影响,值得我们永远学习。 在此,谨向峰、顿玉洁老师致以崇高的敬意和衷心的感! 其次,要感小组其他组员,我们一起解决困难、同舟共济,让我感受到了合作的力量,也让我意识到每一员对小组成功的重要性,你们!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈弗曼 数据结构 专题 实验 报告