版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
..数据结构与程序设计专题实验报告______信息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<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>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<n;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<n;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<last>{ 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; intcnt=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;cnt++; } 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<"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年全新车床租赁与操作培训一体化合同3篇
- 2024版电子竞技赛事促销员招募与管理合同3篇
- 2024年度木质装饰材料供应与施工安装合同3篇
- 2024年度商业秘密让与担保合同标准范本3篇
- 2024年济宁铣刨机租赁之设备保养维护合同
- 2024年混纺面料购销合同
- 2024年智能硬件外包项目保密合同3篇
- 2024年版个人租房合同:甲方出租房屋乙方承租居住一年3篇
- 2024年度基础设施土方开挖及运输综合服务合同2篇
- 2024年度学生宿舍租赁合同书(安全监管版)3篇
- JB∕T 4058-2017 汽轮机清洁度
- 保险案件风险排查工作报告总结
- 岗位竞聘课件(完美版)
- 《学校章程》制订工作会议纪要(六)
- 应急管理部宣传教育中心次招聘笔试真题2023
- (2024年)高一家长会课件
- 初中语文名著阅读项目化学习教学设计
- 2024湖南旅游集团总部部分岗位招聘笔试参考题库附带答案详解
- 视网膜病变护理
- 变压器维护培训课件
- 肠梗阻保守治疗
评论
0/150
提交评论