文件加密源代码赫夫曼算法数据结构课程设计.docx
- 文档编号:30768010
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:17
- 大小:23.70KB
文件加密源代码赫夫曼算法数据结构课程设计.docx
《文件加密源代码赫夫曼算法数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《文件加密源代码赫夫曼算法数据结构课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
文件加密源代码赫夫曼算法数据结构课程设计
数据结构课程设计-文件加密-赫夫曼算法详细设计报告下载链接(如下):
源代码:
注:
编辑器:
VC6.0
#include
#include
#inelude
#inelude
intweight;
intparent,lchild,rchild;
}HTNode;//构造赫夫曼树结点的结构体
存储编码的各个字符
typedefstruct{
HTNode*HTN;//
intlength;//需编码字符个数
intsize;//赫夫曼编码总容量
typedefstruct{
char*ch;//存放需要编码的原始字码
int*in;//存放各个字码的权值
}Weight;
charCode[27][26];//存放各个字符的赫夫曼编码01
intCode_N[30];//存放各个字符对应编码01的个数,用于输出控制
//输出菜单列表
voidshowMenu();
//对赫夫曼树结构初始化
voidInit_HuffmanTree(HuffmanTree&H,WeightS);
//对编码个数和权值的结构初始化
voidInit_Weight(Weight&S,intmsize,intmsizel);
//求出输入字符串各个字符的权值
voidWeightNumber(Weight&S);
//选择parent=0且权值较小的两个HTnode
voidselect(HuffmanTreeH,intj,inta[]);
//创建赫夫曼树
voidcreat_HuffmanTree(HuffmanTree&H);
//赫夫曼编码
voidcreat_HTCode(HuffmanTreeH,WeightS);
//赫夫曼解码
voidexplain_HTCode(HuffmanTreeH,WeightS);
/*对指定文件进行加密*/
voidencryptFile(WeightS);
/*对指定文件进行解密*/
voiddeencryptFile(HuffmanTreeH,WeightS);
/*用于读出文件中所储存的全部信息*/
voidmy_readFile();
//主函数实现赫夫曼树
voidmain()
{
HuffmanTreeh;
Weights;
Init_Weight(s,50,50);
charchoose='\0',yes_no='\0',ch;
do
{
showMenu();
选择:
”);
printf("
cin>>choose;
switch(choose)
{
case'1':
{WeightNumber(s);
}break;
case'2':
{Init_HuffmanTree(h,s);creat_HuffmanTree(h);
}break;
case'3':
{creat_HTCode(h,s);
}break;
case'4':
{explain_HTCode(h,s);
}break;
case'5':
{encryptFile(s);
}break;
case'6':
{deencryptFile(h,s);
}break;
case'7':
{my_readFile();
}break;
case'8':
{exit(0);
}break;
case'0':
{
//对26个字符设置给定的权值
s.ch[1]='e';s.ch[2]='a';s.ch[3]='r';s.ch[4]='i';s.ch[5]='o:
s.ch[6]='t';s.ch[7]='n';s.ch[8]='s';s.ch[9]=T;s.ch[10]='c:
s.ch[11]='u';s.ch[12]='d';s.ch[13]='p';s.ch[14]='m';s.ch[15]='h:
s.ch[16]='g';s.ch[17]='b';s.ch[18]='f;s.ch[19]='y';s.ch[20]='w:
s.ch[21]='k';s.ch[22]='v';s.ch[23]='x';s.ch[24]='z';s.ch[25]='j';
s.ch[26]='q';
s.in[1]=57;s.in[2]=43;s.in[3]=39;s.in[4]=38;s.in[5]=37;
s.in[6]=35;s.in[7]=34;s.in[8]=29;s.in[9]=28;s.in[10]=23;
s.in[11]=19;s.in[12]=17;s.in[13]=16;s.in[14]=15;s.in[15]=15;
s.in[16]=13;s.in[17]=11;s.in[18]=9;s.in[19]=9;s.in[20]=7;
s.in[21]=6;s.in[22]=5;s.in[23]=1;s.in[24]=1;s.in[25]=1;
s.in[26]=1;s.in[0]=26;
FILE*fp;
if((fp=fopen("original.txt","w"))==NULL){
//打开文件
printf(”文件不能打开");
exit
(1);
}
for(inti=1;i<=26;i++){
fprintf(fp,"%c%d",s.ch[i],s.in[i]);}
fclose(fp);
}break;
cout<<"\n\n\n\t\t\t
cin>>ch;
确定退出(Y||N)";
if(ch=='Y'||ch=='y')
exit(0);
default:
printf("\n%c没有此选项!
错误!
\n”,choose);
}
printf("\n\n继续?
回到主菜单(Y&y||N&n)\t请选择:
");
do
{
cin>>yes_no;
}while(yes_no!
='Y'&&yes_no!
='y'&&yes_no!
='N'&&yes_no!
='n');
}while(yes_no=='Y'||yes_no=='y');
exit(0);
}
//输出菜单列表
voidshowMenu(){
cout<<"\t\t文件加密"<<"\n"
<<"\t\t\t*0、根据给定的字符权值"<<"\n"
<<"\t\t\t1、输入需要编码的字符串"<<"\n"
<<"\t\t\t*2、创建赫夫曼树"<<"\n"
<<"\t\t\t*3、对各字符进行赫夫曼编码"<<"\n"
<<"\t\t\t4、输入01串进行赫夫曼解码"<<"\n"
<<"\t\t\t*5、对文件进行加密"<<"\n"
<<"\t\t\t*6、对文件进行解密"<<"\n"
<<"\t\t\t7、读取文件内容"<<"\n"<<"\t\t\t8、退出"<<"\n"
<<"\t\t"< } //对赫夫曼树结构初始化voidInit_HuffmanTree(HuffmanTree&H,WeightS){ 将H.HTN[i]权值、父亲节点、左右孩子都设置为0 需要编码的字符个数 赫夫曼编码容量为2*n-1,n为编码字符个数 H.HTN=newHTNode[S.in[0]*2-1];for(inti=1;i<=S.in[0]*2-1;i++){// H.HTN[i].weight=0; H.HTN[i].parent=0; H.HTN[i].lchild=0; H.HTN[i].rchild=0; } for(intj=1;j<=S.in[0];j++){H.HTN[j].weight=S.in[j]; } H.length=S.in[0];// H.size=S.in[0]*2-1;// //对编码个数和权值的结构初始化 voidInit_Weight(Weight&S,intmsize,intmsize1){ S.ch=newchar[msize]; S.in=newint[msize1]; if(! S.ch&&! S.in){ cout<<"未能分配空间! "< getchar(); exit(0); } } //求出输入字符串各个字符的权值 voidWeightNumber(Weight&S){ chars[50]; inti=O,j=1,k=1; for(i=0;i<50;i++) S.in[i]=0; printf(”请输入要编码的字符串(0-50): \n"); gets(s);//输入字符串 while(s[i]! ='\0'){ S.ch中 j=1; while(S.ch[j]! ='\0'){//统计字符串中各字符存入 if(S.ch[j]==s[i]){ j=1; i++; continue; }elsej++; } S.ch[k]=s[i]; k++; i++; } S.ch[k]='\0'; i=1; while(S.ch[i]! ='\0') i++; S.in[0]=i-1; for(i=1;S.ch[i]! ='\0';){//统计字符串中各字符的个数 for(j=0;s[j]! ='\0';){ if(S.ch[i]==s[j]){ S.in[i]++; } j++; } i++; } } //选择parent=O且权值较小的两个HTnode voidselect(HuffmanTreeH,intj,inta[]){ a[1]=a[2]=0; H.HTN[0].weight=1000; for(inti=1;i<=j;i++){ if(H.HTN[i].parent==O){//parent为0,则为未插入树的结 占 八、、 if(H.HTN[i].weight a[2]=a[1]; a[1]=i; } elseif(H.HTN[i].weight a[2]=i; } } } } //创建赫夫曼树 voidcreat_HuffmanTree(HuffmanTree&H){ inti=H.length; intnode[3]; node[1]=i;node[2]=i; HTNodeh1,h2; h1.weight=h2.weight=H.HTN[0].weight; for(intk=i+1;k<=H.size;k++){ select(H,k-1,node);//选择出两个权值较小的两个结点,node存有两 个结点的值 H.HTN[node[1]].parent=k;//构造出父亲结点 H.HTN[node[2]].parent=k; H.HTN[k].lchild=node[1]; H.HTN[k].rchild=node[2]; H.HTN[k].weight=H.HTN[node[1]].weight+H.HTN[node[2]].weight; } } //赫夫曼编码 voidcreat_HTCode(HuffmanTreeH,WeightS){ inti,j,n,k=25; for(i=0;i<30;i++) //Code_N用于计数,初始化为0,为计数准备 Code_N[i]=0; for(i=1;i<=H」ength;i++){ // 对每个字符进行编码 k=25; // 编码不会超过25个字符 //将各个字符编码存入到 Code中 for(j=i,n=H.HTN[i].parent;j! =0;j=n,n=H.HTN[n].parent){ if(H.HTN[n].lchild==j){ Code[i][k--]='0: Code_N[i]++; }else{ Code[i][k--]='1: Code_N[i]++; } if(H.HTN[n].parent==O) break; } } for(i=1;i<=H.length;i++)//循环输出各个字符的编码 { printf("%c编码为: ”,S.ch[i]); for(k=25-Code_N[i]+1;k<=25;k++){ printf("%c",Code[i][k]); } printf("\n"); } } //赫夫曼解码 voidexplain_HTCode(HuffmanTreeH,WeightS){ chara[50],b[30]; intn=O,i,j,l=O,k=O; printf("请输入需要解码的字符串(0—49例子: 01010)\n”); gets(a); while(a[n]! ='\0') n++; for(j=H.size,i=0;i j=H.size; while(H.HTN[j].lchild! =0&&H.HTN[j].rchild! =0&&a[i]! ='\0'){ if(a[i]=='0'){ j=H.HTN[j]」child;i++; } else{ j=H.HTN[j].rchild;i++; } } if(j<=H.length){//控制当剩余一部分01却无法解码 b[l++]=S.ch[j];II将对应解码的字符存放到b中用于输出 k=i;II记录无法解码01的个数用于输 出 } if(a[i]=='\0') break; } for(i=0;i printf("%c",a[i]); printf("序列解码后代码为: "); for(i=0;i printf("%c",b[i]); printf("\n无法解码序列为: "); for(i=k;i printf("%c",a[i]); } I*对指定文件进行加密*I voidencryptFile(WeightS){ FILE*fp1,*fp2; charch; intk=25,i; charming[]="D: \\",wen[20]; charfileName[]=""; printf("\n请输入读取的文件的名称(例: outfile1.txt): "); do { scanf("%s",wen); if(strlen(wen)>20) printf(”文件字符过长,(0~20)"); }while(strlen(wen)>20); strcat(ming,wen); strcpy(fileName,ming); if((fp仁fopen(ming,"L))==NULL){//打开方式为读取方式 printf("%s文件无法打开! ",fileName); exit (1); } if((fp2=fopen("D: \\outFile.txt","w+"))==NULL){//打开方式为写入方式 printf("D: \\outFile.txt%s文件无法打开! "); exit (1); } while((ch=fgetc(fp1))! =EOF){ for(i=1;i<=S.in[0];i++){ if(ch==S.ch[i]){ for(k=25-Code_N[i]+1;k<=25;k++){//原理同赫夫曼 编码 printf("%c",Code[i][k]); fputc(Code[i][k],fp2); } } } } fclose(fpl); fclose(fp2);//关闭文件,对文件进行保存 fp仁fopen(fileName,"w");//打开方式为写入方式 fp2=fopen("D: \\outFile.txt","r");//打开方式为读取方式 while((ch=getc(fp2))! =EOF){ fputc(ch,fp1); } fclose(fpl); fclose(fp2);//关闭文件 } /*对指定文件进行解密*/ voiddeencryptFile(HuffmanTreeH,WeightS){ FILE*fp1,*fp2; charch; charming[]="D: \\",wen[20]; charfileName[]=""; inti; printf("\n请输入读取的文件的名称(例: outfile1.txt): "); do { scanf("%s",wen); if(strlen(wen)>20) printf("文件字符过长,(0~20)"); }while(strlen(wen)>20); strcat(ming,wen); strcpy(fileName,wen); if((fp仁fopen(ming,"L))==NULL){//打开方式为读取方式 printf("%s文件无法打开! ",ming); exit (1); } if((fp2=fopen("D: \\outFile.txt","w+"))==NULL){//打开方式为写入方式 printf("D: \\outFile.txt%s文件无法打开! "); exit (1); } ch=getc(fp1); while(ch! =EOF){//原理同赫夫曼解码 i=H.size; while(H.HTN[i].lchild! =0&&H.HTN[i].rchild! =O&&ch! =EOF){ if(ch=='0'){ i=H.HTN[i].lchild;ch=getc(fp1); } else{ i=H.HTN[i].rchild;ch=getc(fp1); } } if(i<=H.length){ printf("%c",S.ch[i]); fputc(S.ch[i],fp2); } if(ch==EOF) break; } fclose(fpl); fclose(fp2);//关闭文件,对文件进行保存 fp仁fopen(fileName,"w");//打开方式为写入方式 fp2=fopen("D: \\outFile.txt","r");//打开方式为读取方式 while((ch=getc(fp2))! =EOF){ fputc(ch,fp1); } fclose(fp1); fclose(fp2);//关闭文件 } /*用于读出文件中所储存的全部信息*/ voidmy_readFile(){ FILE*fp; charch; charming[]="D: \\",wen[20]; printf("\n请输入读取的文件的名称(例: outfile1.txt): "); do { scanf("%s",wen); if(strlen(wen)>20) printf("文件字符过长,(0~20)"); }while(strlen(wen)>20); strcat(ming,wen);II将路径和文件名称连接形成一个字符串 if((fp=fopen(ming,"L))==NULL){//打开方式为追加方式 printf("%s文件无法打开! ",ming); exit (1); } printf("文件内容为: \n"); while((ch=fgetc(fp))! =EOF) fputc(ch,stdout); fclose(fp); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 加密 源代码 赫夫曼 算法 数据结构 课程设计