哈夫曼编码系统课程设计报告-源代码_第1页
哈夫曼编码系统课程设计报告-源代码_第2页
哈夫曼编码系统课程设计报告-源代码_第3页
哈夫曼编码系统课程设计报告-源代码_第4页
哈夫曼编码系统课程设计报告-源代码_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

〃说明:请在该代码的所在文件夹下面创建一个原文,默认的文件夹名称问yuanwen.txt#include"stdlib.h"#include"stdio.h"#include"string.h"#defineN128〃字符个数#defineM2*N-1〃所有节点个数的最大值typedefstruct// 结点结构体(chardata;intweight;//权值intparent;intLChild;intRChild;}HTNode;HTNodeHTTree[M+1];//下标为0的位置不存放元素typedefstructCod// 每个字符对应的编码(chardata;//字符charcode[10];//字符对应的哈夫曼编码}Code;CodeHCode[25];intnumArray[N];//存放字符出现的次数//初始化numArrayvoidFoundNumArray()(inti=0;for(;i<N;i++)numArray[i]=0;}////统计文档中字符以及字符权重voidStatistics(char*p)(charch;FILE*fp;fp=fopen(p,"r");if((fp==NULL))(printf("文件打开失败!!");exit(0);)do(ch=fgetc(fp);numArray[ch]=numArray[ch]+1;}while(ch!=EOF);printf("\n");}〃哈夫曼结点初始化intFoundHTTree()〃S回哈夫曼字符结点的数量(inti=0,j=1;while(i<128)(if(numArray[i]==0)(i++;continue;}while(j<M)(HTTree[j].data=i;HTTree[j].weight=numArray[i];HTTree[j].parent=0;HTTree[j].LChild=0;HTTree[j].RChild=0;j++;break;}i++;for(i=j;i<M;i++)(HTTree[i].data='0';HTTree[i].weight=0;//权值HTTree[i].parent=0;HTTree[i].LChild=0;HTTree[i].RChild=0;)returnj;//哈夫曼结点数量)〃选取最小的两个节点值voidSelect(intnum,int*l,int*r)(inti,a,b;i=1;do(if(HTTree[i].parent==0)(b=i;break;)i++;}while(i<=num);do(if((HTTree[i].weight!=0)&&(HTTree[i].parent==0)&&(i!=b))(a=i;break;}i++;}while(i<=num);i=1;doif((HTTree[i].weight!=0)&&(HTTree[i].parent==0)&&(HTTree[a].weight>HTTree[i].weight))a=i;)i++;}while(i<=num);if(a==b)b++;i=1;do(if((HTTree[i].parent==0)&&(i!=a)&&(HTTree[b].weight>HTTree[i].weight))(b=i;}i++;}while(i<=num);(*l)=a;(*r)=b;}〃哈夫曼树创建voidHfmTree()(inti,j,l,r;i=FoundHTTree();j=i;for(;j<=(2*(i-1)-1);j++)(Select(j-1,&l,&r);HTTree[j].weight=HTTree[l].weight+HTTree[r].weight;HTTree[l].parent=j;HTTree[r].parent=j;HTTree[j].LChild=l;HTTree[j].RChild=r;}}〃声明:左子树为0,右子树为1〃递归--获得每个字符对应的哈弗曼编码voidPreOder(char*p,inti,intj,int*z,intx)//i是数组p的下标,j是存储结点HTTree数组的下标(左右孩子的下标),z为HCode数组的下标(charb[10]="777777777”;ints=0;while(s<i)(b[s]=p[s];s++;)if(x==0)b[i]='0';elseb[i]='1';if((HTTree[j].LChild==0)&&(HTTree[j].RChild==0))(strcpy(HCode[*z].code,b);HCode[*z].data=HTTree[j].data;(*z)=(*z)+1;return;)PreOder(b,i+1,HTTree[j].LChild,z,0);PreOder(b,i+1,HTTree[j].RChild,z,1);)〃哈夫曼编码生成voidHfmCode()(inti,j,x;intz;charp[10];ints=0;for(;s<10;s++)p[s]='7';i=0;z=0;for(x=1;x<=M+1;x++)(if((HTTree[x].parent==0)&&(HTTree[x].LChild!=0)&&(HTTree[x].RChild!=0)&&(HTTree[x].weight!=0))j=x;break;))PreOder(p,i,HTTree[j].LChild,&z,0);PreOder(p,i,HTTree[j].RChild,&z,1);)〃哈夫曼编码存储数组的初始化voidFoundHCode()(intj=0;for(j=0;j<25;j++)(HCode[j].data='6';strcpy(HCode[j].code,"777777777");))〃输出函数,验证结果voidPrin()(inti;printf("字符统计\n");for(i=0;i<N;i++)〃字符统计printf(''%d-%d,'',i,numArray[i]);printf("\n");printf("哈夫曼树结点\n");for(i=1;HTTree[i].weight!=0;i++)//哈夫曼树(printf("%d,%c-%d-%d-%d-%d",i,HTTree[i].data,HTTree[i].weight,HTTree[i].parent,HTTree[i].LChild,HTTree[i].RChild);)printf('\n');printf("哈弗曼编码\n");for(i=0;strcmp(HCode[i].code,''777777777'')!=0;i++)//哈弗曼编码printf("%d,%c-%s”,i,HCode[i].data,HCode[i].code);)printf("\n");)〃字符写入文件函数voidWrite(chars,char*wp)//s为要写入的字符,wp是写入文档的名称(FILE*fp;charch;charpCoding[60]="yiwen.txt";charpDecoding[60]="textfile.txt";if(strcmp(pCoding,wp)==0||strcmp(pDecoding,wp))fp=fopen(wp,"a");elsefp=fopen(wp,"w");if((fp==NULL))(printf("文件yuanwen打开失败!!\n");exit(0);)ch=s;fputc(ch,fp);fclose(fp);return;)//译码。将相对应的哈弗曼编码译码为字符voidDecompile(char*rp,char*wp)//----rp--译文文档路径 wp--反编译文档路径(charch;charp[10]="777777777'1;//初始化盛放读取yiwen中某个哈弗曼编码的pFILE*fp;inti=0,j=0;fp=fopen(rp,"r");if((fp==NULL))printf("文件打开失败!!\n");exit(0);)//printf("文件打开成功!!\n");do(ch=fgetc(fp);if(ch=='&')//&字符以后,是另一个字符(j=0;for(j=0;HCode[j].data!='6';j++)//遍历HCode中的哈夫曼编码,找到指定的字符(if(strcmp(HCode[j].code,p)==0)//找到对应的哈弗曼编码(Write(HCode[j].data,wp);/^^相应字符写入textfile.text中break;//退出循环))strcpyg,"????????711);//重新初始化盛放读取yiwen中某个哈弗曼编码的pi=0;continue;)p[i]=ch;i++;}while(ch!=EOF);printf("译码成功,请到该程序文件夹中的''%s、'1查看\n\n",wp);printf("\n");}〃编码处理。将字符编码为对应的哈夫曼编码voidTranslate(char*rp,char*wp)(charch;inti,j,c=1;//缺少一个判断,判断该原文文档是否存在FILE*fp;fp=fopen(rp,"r");if(fp==NULL)(printf("文件打开失败!!\n");exit(0);)do(ch=fgetc(fp);for(i=0;HCode[i].data!='6';i++)(if(ch==HCode[i].data)(for(j=0;HCode[i].code[j]!='7';j++)(Write(HCode[i].code[j],wp);)Write('&',wp);))}while(ch!=EOF);printf("编码成功,请到该程序文件夹中的、,皈、,1查看\n\n”,wp);printf("\n");}〃获取编码后内容存放文档的名称voidMenuCoding2(char*pp)//pp来盛放(intch;charp1[20];charp2[20]="yiwen.txt";printf(" \n");printf("| 1、指定编码文档的名称 |\n");printf("| 2、选择默认yiwen.txt文档|\n");printf(" \n");printf("****请输入选择(1或2):");scanf("%d",&ch);switch(ch)((printf("请输入编码文档的名称(包括文档的后缀名):");scanf("%s",&p1);strcpy(pp,p1);break;)(strcpy(pp,p2);break;)default:(printf(,l输入错误,请重新输入!\n");break;)))〃编码处理--将指定的要编码的文档并指定的文档来盛放voidMenuCoding1()(intch;charp11[20];〃盛放自定义的编码文档名称charp22[20];charp1[20];charp2[20]="yuanwen.txt";printf(" \n");printf("| 1、指定需要编码文档的名称|\n");printf("| 2、选择默认yuanwen.txt文档 |\n");printf(" \n");printf("****请输入选择(1或2):");scanf("%d",&ch);switch(ch)((printf("请输入被编码的文档名称(包括文档的后缀名):");scanf("%s",&p1);MenuCoding2(p11);Translate(p1,p11);break;)(MenuCoding2(p22);Translate(p2,p22);break;)default:(printf(,l输入错误,请重新输入!\n");break;)))voidMenuDecoding2(char*pp)〃译码--反编译文档名称(intch;charp1[20];charp2[20]="textfile.txt";printf(" \n");printf("| 1、指定反编译文档的名称|\n");printf("| 2、选择默认textfile.txt文档|\n");printf(" \n");printf("****请输入选择(1或2):");scanf("%d",&ch);switch(ch)((printf("请输入编码文档的名称(包括文档的后缀名):");scanf("%s",&p1);strcpy(pp,p1);break;)(strcpy(pp,p2);break;)default:(printf(,l输入错误,请重新输入!\n");break;)〃译码处理--将指定的要译码的文档并指定的文档来盛放voidMenuDecoding1()(intch;charp11[20];charp22[20];charp1[20];charp2[20]="yiwen.txt";printf(" \n");printf("| 1、指定需要译码文档的名称|\n");printf("| 2、选择默认yiwen.txt文档|\n");printf(" \n");printf("****请输入选择(1或2):");scanf("%d",&ch);switch(ch)((printf("请输入被编码的文档名称(包括文档的后缀名):");scanf("%s",&p1);MenuDecoding2(p11);Decompile(p1,p11);break;)(MenuDecoding2(p22);Decompile(p2,p22);break;)default:(printf(,l输入错误,请重新输入!\n");break;)〃菜单选择voidMenu()(intch;printf("**********

温馨提示

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

评论

0/150

提交评论