文档介绍:数据结构与程序设计专题实验报告:学号:班级:信息45班:学号:班级:信息45班:学号:班级:信息45班实验指导老师:峰实验地点:西一楼一层计算机中心机房实验结束日期:12月5日联系:**********实验任务:,1)统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数),字符包括字母(区分大小写)、标点符号及格式控制符(空格、回车等)。2)按频度统计结果构建哈夫曼编码表。3)基于哈夫曼编码表进行编码,生成对应的二进制码流,,完成信源的编码过程。4)根据生成的哈夫曼编码表,,,完成信源的解码过程。5),以验证编解码系统的正确性。实验容: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=;for(i=1;b[i]!='\0';i++){s=(NODE*)malloc(sizeof(NODE));s->data=b[i];s->count=;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)=*(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;typ