数据结构课程设计哈夫曼编码译码器_第1页
数据结构课程设计哈夫曼编码译码器_第2页
数据结构课程设计哈夫曼编码译码器_第3页
数据结构课程设计哈夫曼编码译码器_第4页
数据结构课程设计哈夫曼编码译码器_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目一:哈夫曼编码与译码一、任务设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。要求:1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中);2) 初始化:键盘输入字符集统计字符权值、自定义26个字符和26个权值、统计文件中一篇英文文章中26个字母,建立哈夫曼树;3) 编码:利用建好的哈夫曼树生成哈夫曼编码;4) 输出编码(首先实现屏幕输出,然后实现文件输出);5) 译码(键盘接收编码进行译码、文件读入编码进行译码);6)界面优化设计。、流程图三、代码分解〃头文件#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#defineN1000#defineM2*N-1#defineMAXcode6000〃函数声明voidcount(CHar&ch,HTNodeht[]);voideditHCode(HTNodeht[],HCodehcd[],CHar&ch,intn,charbianma[]); 〃编码函数voidprintyima(HTNodeht[],HCodehcd[],intn,charbianma[]);〃译码函数voidcreatHT(HTNodeht[],intn);voidCreateHCode(HTNodeht[],HCodehcd[],intn);voidDispHCode(HTNodeht[],HCodehcd[],intn);voidinput_key(CHar&ch);voidinput_file(CHar&ch);voidinput_cw(HTNodeht[]);voidbianma1(HTNodeht[],HCodehcd[],CHar&ch,intn,charbianma[]);voidbianma2(HTNodeht[],HCodehcd[],CHar&ch,intn,charbianma[]);voidyima1(HTNodeht[],HCodehcd[],intn,charbianma[]);voidyima2(HTNodeht[],HCodehcd[],intn,charbianma[]);voidcreat_cw();voidbianmacaidan();voidyimacaidan();voidbianmayima();intcaidan();〃结构体typedefstruct{

chardata;intparent;intweight;intIchild;intrchild;}HTNode;typedefstruct{charcd[N];intstart;}HCode;typedefstruct{chars[N];intnum;}CHar;CHarch;HTNodeht[M];HCodehcd[N];〃主函数intmain(){intxh;while(1){〃操作菜单背景颜色〃调用菜单函数〃操作菜单背景颜色〃调用菜单函数//switch语句xh=caidan();switch(xh){case1:system("cls");creat_cw();break;case2:system("cls");creatHT(ht,n);break;case3:system("cls");CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);break;case4:system("cls");bianmayima();break;case0:system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\t\t感使用本系统!\n\n\n\n\n\n\n\t\t\t");exit(0);default:system("cls");putchar('\a');printf("\n\t\t输入有误,请重新输入:\n");break;}}return0;}〃菜单函数intcaidan() 〃菜单函数模块〃{intxh;printf("\n\n\n");printf("\t\t欢迎使用哈夫曼编码译码系统\n");printf("\t\t\n");printf("\t\t*=*=*=*__小__小__小__小__小__小__小__小__小__小__小__小__小__小__小__小_=*_*_*\n");printf("\t\t*=_*\n");printf("\t\t*=»•!-»»•!-»»•!-»»•!-»»•!-»»•!-»“““““*_*_*_*_*_*_*_*_*_*_*__*\n");printf("\t\t*=1.建立字符权值_*\n");printf("\t\t*=“““““““““““*_*_*_*_*_*_*_*_*_*_*__*\n");printf("\t\t*=2.建立并输出哈夫曼树_*\n");printf("\t\t*=“““““““““““*_*_*_*_*_*_*_*_*_*_*__*\n");printf("\t\t*=3.生成并查看哈夫曼编码_*\n");printf("\t\t*=“““““““““““*_*_*_*_*_*_*_*_*_*_*__*\n");printf("\t\t*=4.编码与译码_*\n");printf("\t\t*=“““““““““““*_*_*_*_*_*_*_*_*_*_*__*\n");printf("\t\t*=0.退出系统_*\n");printf("\t\t*=_*\n");printf("\t\t*=*=*=*__小__小__小__小__小__小__小__小__小__小__小__小__小__小__小__小_=*_*_*\n");printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);returnxh;〃返回从键盘接收的选项}voidbianmayima()

intxh;while(1)printf("\n\n\n\n\n");printf("\t\t编码与译码printf("\t\tprintf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*printf("\t\t*=1.编码printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*printf("\t\t*=2.译码printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*printf("\t\t*=0.返回上级菜单printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*{\n");\n");=*\n");=*\n");=*\n");=*\n");=*\n");=*\n");=*\n");printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case1:system("cls");bianmacaidan();break;case2:system("cls");yimacaidan();break;case0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误,请重新输入:\n");break;}}}voidyimacaidan(){intxh;while(1){printf("\n\n\n\n\n");译码\n");\n");译码\n");\n");printf("\t\tprintf("\t\t*=printf("\t\t*=printf("\t\t*=printf("\t\t*=printf("\t\t*=printf("\t\t*=printf("\t\t*=1.键盘输入编码进行译码“““““““““““““““小一小一小一小一小一小一小一小一小一小一小一小一小一小一小2.文件读入编码进行译码“““““““““““““““小一小一小一小一小一小一小一小一小一小一小一小一小一小一小0.返回上级菜单*J* *J* *J* *J* *J* *J* *J* *J* *J* *J* *J* *J* *J* *J* *1*小一小一小一小一小一小一小一小一小一小一小一小一小一小一小=*\n");=*\n");=*\n");=*\n");=*\n");=*\n");=*\n");printf("\n\t\t请输入序号进行选择:");//switch语句//switch语句switch(xh){case1:system("cls");yima1(ht,hcd,n,bianma);break;case2:system("cls");yima2(ht,hcd,n,bianma);break;case0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误,请重新输入:\n");break;}}}voidbianmacaidan(){intxh;while(1){printf("\n\n\n\n\n");printf("\t\t编码\n");printf("\t\t\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=1.键盘输入字符集编码=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=2.文件读入文章编码=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=0.返回上级菜单=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case1:system("cls");bianma1(ht,hcd,ch,n,bianma);break;case2:system("cls");bianma2(ht,hcd,ch,n,bianma);break;case0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误,请重新输入:\n");break;}}}voidcreat_cw(){intxh2;while(1)printf("\n\n\n\n\n");printf("\t\t建立字符权值\n");printf("\t\t\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=1.从键盘输入字符集进行统计=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=2.从文件读入字符集统计=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=3.自定义字符权值=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*=0.返回上级菜单=*\n");printf("\t\t*=“““““““““““““““*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh2);switch(xh2)//switch语句case1:system("cls");input_key(ch);break;case2:system("cls");input_file(ch);break;case3:system("cls");input_cw(ht);break;case0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误,请重新输入:\n");break;}}}〃建立字符权值模块voidinput_key(CHar&ch){inti,j=0;charst[N];printf(-请输入字符集(以#结束):\n");for(i=0;i<N;i++){scanf("%c”,&st[i]);if(st[i]=='#'){st[i]='\0';break;}}strcpy(ch.s,st);ch.num=strlen(st);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}voidinput_file(CHar&ch){inti;FILE*fp;charfilename[20];printf("请输入要打开的文件名(*.txt):");scanf("%s”,&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文件打开失败!!!");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}ch.num=strlen(ch.s);printf("读入成功!\n");printf("文件中的字符集为:%s\n",ch.s);fclose(fp);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}voidinput_cw(HTNodeht[]){inti,w,s,j;chara;printf(-要输入的字符总个数是?:,scanf("%d”,&s);n=s;printf(-请输入字符及其权值:\n");for(i=0;i<s;i++){printf("请输入第%d个字母:",i+1);scanf("%s”,&a);ht[i].data=a;printf("请输入其权值:");scanf("%d",&w);ht[i].weight=w;}FILE*fp;if((fp=fopen("data.txt","w"))==0){printf("\n\t\t文件打开失败!!!");return;}printf("\n定义权值成功!\n\n");printf(-各字符及其权值为:\n\n");fprintf(fp,"各字符及其权值为:\n");printf("字符\t权值");fprintf(fp,"字符\t权值");for(j=0;j<i;j++){printf("\n");fprintf(fp,"\n");printf("%-8c%-8d”,ht[j].data,ht[j].weight);fprintf(fp,”%-8c%-8d%”,ht[j].data,ht[j].weight);}printf("\n");printf("\n字符权值已输出至文件"data.txt”!");fclose(fp);printf("输入完成,按任意键返回!”);getch();system("cls");return;}〃统计字符权值函数voidcount(CHar&ch,HTNodeht[]){inti,j,m=0;charc[N];intsum[N]={0};for(i=0;ch.s[i]!='\0';i++){for(j=0;j<m;j++)if(ch.s[i]==c[j]ll(c[j]>='a'&&c[j]<='z'&&ch.s[i]+32==c[j]))break;if(j<m)sum[j]++;else{if(ch.s[i]>='A'&&ch.s[i]<='Z')c[j]=ch.s[i]+32;elsec[j]=ch.s[i];sum[j]++;m++;}}for(i=0;i<m;i++){ht[i].data=c[i];ht[i].weight=sum[i];}n=m;FILE*fp;if((fp=fopen("data.txt","w"))==0){printf("\n\t\t文件打开失败!!!");return;}printf("\n统计权值成功!\n\n");printf(-各字符及其权值为:\n\n");fprintf(fp,"各字符及其权值为:\n");printf("字符\t权值");fprintf(fp,"字符\t权值");for(j=0;j<m;j++){printf("\n");fprintf(fp,"\n");printf("%-8c%-8d”,ht[j].data,ht[j].weight);fprintf(fp,”%-8c%-8d%”,ht[j].data,ht[j].weight);}printf("\n");printf("\n字符权值已输出至文件"data.txt”!");fclose(fp);}〃构造哈夫曼树voidcreatHT(HTNodeht[],intn){FILE*fp;if((fp=fopen("哈夫曼树.txt","w"))=0){printf("\n\t\t文件打开失败!!!");return;}inti,j,k,lnode,rnode;intmin1,min2;for(i=0;i<2*n-1;i++)ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for(i=n;i<2*n-1;i++){min1=min2=32767;lnode=rnode=-1;for(k=0;k<=i-1;k++)if(ht[k].parent==-1){if(ht[k].weight<min1){min2=min1;rnode=lnode;min1=ht[k].weight;lnode=k;}elseif(ht[k].weight<min2)min2=ht[k].weight;rnode=k;}}ht[lnode].parent=i;ht[rnode].parent=i;ht[i].weight=ht[lnode].weight+ht[rnode].weight;ht[i].lchild=lnode;ht[i].rchild=rnode;}printf("建立huffman树成功!\n");printf("输出huffman树:\n");fprintf(fp,"输出huffman树:\n");printf("\t字符\t权值\t父节点\t左子节点\t右子节点");fprintf(fp,"\t字符\t权值\t父节点\t左子节点\t右子节点”);for(j=1;j<i;j++){printf("\n");fprintf(fp,"\n");printf("\t%-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,ht[i].lchild,ht[j].rchild);fprintf(fp,"\t%-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,ht[i].lchild,ht[j].rchild);}printf("\n");printf("哈夫曼树已输出至文件"哈夫曼树.txt”!按任意键返回!");fclose(fp);getch();system("cls");return;}〃生成哈夫曼编码voidCreateHCode(HTNodeht[],HCodehcd[],intn){inti,f,c,j=0;HCodehc;for(i=0;i<n;i++){hc.start=n;c=i;hc.cd[hc.start--]='0';f=ht[i].parent;while(f!=-1){if(ht[f].lchild=c)hc.cd[hc.start--]='0';elsehc.cd[hc.start--]='1';c=f;f=ht[f].parent;}hc.start++;for(j=0;j<hc.start;j++)hc.cd[j]='';hcd[i]=hc;}}voidDispHCode(HTNodeht[],HCodehcd[],intn){FILE*fp;if((fp=fopen("哈夫曼编码.txt","w"))=0){printf("\n\t\t文件打开失败!!!");return;}inti,k;intsum=0,m=0,j;printf("输出字符哈夫曼编码:\n");fputs("输出字符哈夫曼编码:\n”,fp);for(i=0;i<n;i++)j=0;printf("%c:\t”,ht[i].data);fprintf(fp,"\n%c:\t”,ht[i].data);for(k=hcd[i].start;k<=n;k++){printf("%c",hcd[i].cd[k]);j++;fprintf(fp,"%c",hcd[i].cd[k]);}m+=ht[i].weight;sum+=ht[i].weight*j;printf("\n");}printf("\n哈夫曼编码已保存至文件"哈夫曼编码.txt!按任意键返回!");fclose(fp);getch();system("cls");}〃编码函数voidbianma1(HTNodeht[],HCodehcd[],CHar&ch,intn,charbianma[]){inti;charstr[N];printf(-请输入要编码的字符集(以#结束):\n");for(i=0;i<N;i++){scanf("%c”,&str[i]);if(str[i]=='#'){str[i]='\0';break;}}strcpy(ch.s,str);ch.num=strlen(str);editHCode(ht,hcd,ch,n,bianma);getch();system("cls");return;}voidbianma2(HTNodeht[],HCodehcd[],CHar&ch,intn,charbianma[]){inti;FILE*fp;charfilename[20];printf("请输入要打开的文件名(*.txt):");scanf("%s”,&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文件打开失败!!!");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}ch.num=strlen(ch.s);printf("\n读入成功!\n");printf("文件中的字符集为:\n%s",ch.s);fclose(fp);editHCode(ht,hcd,ch,n,bianma);getch();system("cls");return;}〃译码函数voidyima1(HTNodeht[],HCodehcd[],intn,charbianma[]){inti;charcode[MAXcode];printf("请输入编码进行译码(以#结束):\n");for(i=0;i<MAXcode;i++){scanf("%c”,&code[i]);if(code[i]=='#'){code[i]='\0';break;}}strcpy(bianma,code);printyima(ht,hcd,n,bianma);printf(-\n译码完成!按任意键返回!");getch();system("cls");return;}voidyima2(HTNodeht[],HCodehcd[],intn,charbianma[]){inti;FILE*fp;charfilename[20];printf("请输入要打开的文件名(*.txt):");scanf("%s”,&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文件打开失败!!!");return;}for(i=0;!feof(fp);i++){fread(&bianma[i],sizeof(char),1,fp);}printf("读入成功!\n");printf("文件中的编码是:%s\n",bianma);printyima(ht,hcd,n,bianma);printf(-\n译码完成!按任意键返回!");getch();system("cls");}四、调试结果主菜单建立字符权值选择2.从文件读入字符进行统计输入测试文件名"cs.txt”输出个字符权值"C:\Users\xuchao\Deski。pk.诔圜就h.Debug'\吟大晏裁砖与译玛器,exe';件点的岸符集为:alieshiyipi.anceshiuendanq?统计权值成功T各字符及其权值为:宇符权隹宇符13□7211111输己至文件七拓任意世返回,Vhuffnan-;矿成功1输出Huffman^ij:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论