文件加密源代码-赫夫曼算法-数据结构课程设计_第1页
文件加密源代码-赫夫曼算法-数据结构课程设计_第2页
文件加密源代码-赫夫曼算法-数据结构课程设计_第3页
文件加密源代码-赫夫曼算法-数据结构课程设计_第4页
文件加密源代码-赫夫曼算法-数据结构课程设计_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、精品与精品数据结构课程设计-文件加密-赫夫曼算法详细设计报告下载链接(如下):源代码: 注: 编辑器:vc 6.0 #include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <string.h>typedef struct int weight;int parent,lchild,rchild;HTNode; /构造赫夫曼树结点的结构体typedef struct HTNode *HTN; /存储编码的各个字符int length; /需编码字符个数int size; /

2、赫夫曼编码总容量HuffmanTree; /构造赫夫曼树的结构体typedef struct char *ch; /存放需要编码的原始字码 int *in; /存放各个字码的权值Weight; char Code2726; /存放各个字符的赫夫曼编码01int Code_N30; /存放各个字符对应编码01的个数,用于输出控制/输出菜单列表void showMenu();/对赫夫曼树结构初始化void Init_HuffmanTree(HuffmanTree &H,Weight S);/对编码个数和权值的结构初始化void Init_Weight(Weight &S,int m

3、size,int msize1);/求出输入字符串各个字符的权值void WeightNumber(Weight &S);/选择parent=0且权值较小的两个HTnodevoid select(HuffmanTree H,int j,int a);/创建赫夫曼树void creat_HuffmanTree(HuffmanTree &H);/赫夫曼编码void creat_HTCode(HuffmanTree H,Weight S);/赫夫曼解码void explain_HTCode(HuffmanTree H,Weight S);/*对指定文件进行加密*/void encry

4、ptFile(Weight S);/*对指定文件进行解密*/void deencryptFile(HuffmanTree H,Weight S);/*用于读出文件中所储存的全部信息*/void my_readFile();/主函数实现赫夫曼树void main()HuffmanTree h;Weight s; Init_Weight(s,50,50);char choose='0',yes_no='0',ch; do showMenu();printf(" 选择: ");cin>>choose;switch(choose) cas

5、e'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_readFil

6、e();break;case'8': exit(0); break; case'0': /对26个字符设置给定的权值 s.ch1='e's.ch2='a's.ch3='r's.ch4='i's.ch5='o' s.ch6='t's.ch7='n's.ch8='s's.ch9='l's.ch10='c' s.ch11='u's.ch12='d's.ch13='p

7、9;s.ch14='m's.ch15='h' s.ch16='g's.ch17='b's.ch18='f's.ch19='y's.ch20='w' s.ch21='k's.ch22='v's.ch23='x's.ch24='z's.ch25='j' s.ch26='q' s.in1=57;s.in2=43;s.in3=39;s.in4=38;s.in5=37; s.in6=35;s.in7

8、=34;s.in8=29;s.in9=28;s.in10=23; s.in11=19;s.in12=17;s.in13=16;s.in14=15;s.in15=15; s.in16=13;s.in17=11;s.in18=9;s.in19=9;s.in20=7; s.in21=6;s.in22=5;s.in23=1;s.in24=1;s.in25=1; s.in26=1;s.in0=26; FILE *fp; if(fp=fopen("original.txt","w")=NULL) /打开文件 printf("文件不能打开"); e

9、xit(1); for(int i=1;i<=26;i+) fprintf(fp,"%c %d ",s.chi,s.ini); fclose(fp); break; cout<<"nnnttt确定退出(Y|N)" cin>>ch; if(ch='Y'|ch='y') exit(0);default:printf("n %c 没有此选项! 错误! n ",choose); printf("nn 继续? 回到主菜单 (Y&y|N&n) t请选择:&qu

10、ot;); 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);/输出菜单列表void showMenu() cout<<"tt-文件加密-"<<"n" <<"ttt* 0、根据给定的

11、字符权值"<<"n" <<"ttt 1、输入需要编码的字符串"<<"n" <<"ttt* 2、创建赫夫曼树"<<"n" <<"ttt* 3、对各字符进行赫夫曼编码"<<"n" <<"ttt 4、输入01串进行赫夫曼解码"<<"n" <<"ttt* 5、对文件进行加密"&

12、lt;<"n" <<"ttt* 6、对文件进行解密"<<"n" <<"ttt 7、读取文件内容"<<"n" <<"ttt 8、退出"<<"n" <<"tt-"<<endl;/对赫夫曼树结构初始化void Init_HuffmanTree(HuffmanTree &H,Weight S) H.HTN=new HTNodeS.in0

13、*2-1; for(int i=1;i<=S.in0*2-1;i+) /将H.HTNi权值、父亲节点、左右孩子都设置为0 H.HTNi.weight=0;H.HTNi.parent=0;H.HTNi.lchild=0;H.HTNi.rchild=0; for(int j=1;j<=S.in0;j+) H.HTNj.weight=S.inj; H.length=S.in0; /需要编码的字符个数H.size=S.in0*2-1; /赫夫曼编码容量为2*n-1,n为编码字符个数/对编码个数和权值的结构初始化void Init_Weight(Weight &S,int msize

14、,int msize1) S.ch=new charmsize; S.in=new intmsize1; if(!S.ch&&!S.in) cout<<"未能分配空间!"<<endl; getchar();exit(0); /求出输入字符串各个字符的权值void WeightNumber(Weight &S) char s50; int i=0,j=1,k=1; for(i=0;i<50;i+) S.ini=0; printf("请输入要编码的字符串(0-50):n"); gets(s); /输入字符

15、串 while(si!='0') j=1; while(S.chj!='0') /统计字符串中各字符存入S.ch中 if(S.chj=si) j=1; i+; continue; else j+; S.chk=si; k+; i+; S.chk='0' i=1; while(S.chi!='0') i+; S.in0=i-1; for(i=1;S.chi!='0') /统计字符串中各字符的个数 for(j=0;sj!='0') if(S.chi=sj) S.ini+; j+; i+; /选择pare

16、nt=0且权值较小的两个HTnodevoid select(HuffmanTree H,int j,int a) a1=a2=0; H.HTN0.weight=1000; for(int i=1;i<=j;i+) if(H.HTNi.parent=0) /parent为0,则为未插入树的结点 if(H.HTNi.weight<H.HTNa1.weight) a2=a1; a1=i; else if(H.HTNi.weight<H.HTNa2.weight) a2=i; /创建赫夫曼树void creat_HuffmanTree(HuffmanTree &H) int

17、i=H.length; int node3; node1=i;node2=i; HTNode h1,h2; h1.weight=h2.weight=H.HTN0.weight; for(int k=i+1;k<=H.size;k+) select(H,k-1,node); /选择出两个权值较小的两个结点,node存有两个结点的值 H.HTNnode1.parent=k; /构造出父亲结点 H.HTNnode2.parent=k; H.HTNk.lchild=node1; H.HTNk.rchild=node2; H.HTNk.weight=H.HTNnode1.weight+H.HTNn

18、ode2.weight; /赫夫曼编码void creat_HTCode(HuffmanTree H,Weight S) int i,j,n,k=25; for(i=0;i<30;i+) /Code_N用于计数,初始化为0,为计数准备 Code_Ni=0; for(i=1;i<=H.length;i+) /对每个字符进行编码 k=25; /编码不会超过25个字符 /将各个字符编码存入到Code中 for(j=i,n=H.HTNi.parent;j!=0;j=n,n=H.HTNn.parent) if(H.HTNn.lchild=j) Codeik-='0' Code

19、_Ni+; else Codeik-='1' Code_Ni+; if(H.HTNn.parent=0) break; for(i=1;i<=H.length;i+) /循环输出各个字符的编码 printf("%c编码为:",S.chi); for(k=25-Code_Ni+1;k<=25;k+) printf("%c",Codeik); printf("n"); /赫夫曼解码void explain_HTCode(HuffmanTree H,Weight S) char a50,b30; int n=0,

20、i,j,l=0,k=0; printf("请输入需要解码的字符串(049例子:01010)n"); gets(a); while(an!='0') n+; for(j=H.size,i=0;i<n;) /结束控制为01字符个数的限制 j=H.size; while(H.HTNj.lchild!=0&&H.HTNj.rchild!=0&&ai!='0') if(ai='0') j=H.HTNj.lchild; i+; else j=H.HTNj.rchild; i+; if(j<=H.

21、length) /控制当剩余一部分01却无法解码 bl+=S.chj; /将对应解码的字符存放到b中用于输出 k=i; /记录无法解码01的个数用于输出 if(ai='0') break; for(i=0;i<k;i+) printf("%c",ai); printf("序列解码后代码为:"); for(i=0;i<l;i+) printf("%c",bi); printf("n无法解码序列为:"); for(i=k;i<n;i+) printf("%c",ai

22、);/*对指定文件进行加密*/void encryptFile(Weight S) FILE *fp1,*fp2; char ch; int k=25,i; char ming="D:",wen20; char fileName="" printf("n请输入读取的文件的名称(例:outfile1.txt): "); do scanf("%s",wen); if(strlen(wen)>20) printf("文件字符过长,(020)");while(strlen(wen)>20);

23、 strcat(ming,wen); strcpy(fileName,ming); if(fp1=fopen(ming,"r")=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;

24、i<=S.in0;i+) if(ch=S.chi)for(k=25-Code_Ni+1;k<=25;k+) /原理同赫夫曼编码 printf("%c",Codeik); fputc(Codeik,fp2); fclose(fp1); fclose(fp2); /关闭文件,对文件进行保存fp1=fopen(fileName,"w"); /打开方式为写入方式fp2=fopen("D:outFile.txt","r"); /打开方式为读取方式while(ch=getc(fp2)!=EOF) fputc(ch,

25、fp1); fclose(fp1); fclose(fp2); /关闭文件/*对指定文件进行解密*/void deencryptFile(HuffmanTree H,Weight S) FILE *fp1,*fp2; char ch; char ming="D:",wen20; char fileName="" int i; printf("n请输入读取的文件的名称(例:outfile1.txt): "); do scanf("%s",wen); if(strlen(wen)>20) printf("

26、;文件字符过长,(020)");while(strlen(wen)>20); strcat(ming,wen); strcpy(fileName,wen); if(fp1=fopen(ming,"r")=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.HTNi.lchild!=0&&H.HTNi.rchild!=

温馨提示

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

评论

0/150

提交评论