资源描述:
《用哈希表判别两个源程序的相似性.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、用哈希表判别两个源程序的相似性以下是应用源程序代码:将以下程序下载后,用C++6.0打开,同时在根目录下新建三个文本文档(.txt格式)。命名分别为keyword,program1,program2;即可运行出结果。#include#include#include#includetypedefstructnode{charc[10];intlen;//记录关键字的长度structnode*q;}keynode;//关键字结点,认为关键字的长度不超
2、过10个字符typedefstructtable{charw;keynode*p;}hash;//定义哈希表类型voidinit_value(hashkey[],charstack[],intinformation1[],intinformation2[])//初始化函数{inti;for(i=0;i<100;i++)key[i].p=NULL;for(i=0;i<10;i++)stack[i]=' ';for(i=0;i<20;i++){information1[i]=0;information2[i]=0;}}v
3、oidcreate_hash(hashkey[])//创建哈希表函数{inti,num=0,k;//num表示关键字的数量,k表示单个关键字的长度charch;FILE*fp;keynode*p1;//p1为指向关键字结点类型的指针hashp2;//p2为指向hash类型的指针for(i=0;i<26;i++)key[i].w='a'+i;//哈希表每个结点的字符域存储26个字母if((fp=fopen("keyword.txt","r"))==NULL)//打开写有关键字的文件,文件存储在C盘上{printf("没有
4、打开文件");exit(0);}while(num<100)//假设关键字的个数少于100{k=0;while(k<10)//假设关键字的长度少于10{ch=fgetc(fp);//从文件中读一个字符,遇空格则退出if(ch==32)break;if(k==0)p1=(keynode*)malloc(sizeof(structnode));//若不是空格,且是关键字的第一个字母,则开辟关键字结点空间(*p1).c[k]=ch;k++;}i=0;while(i<26)//将一个关键字读入关键字结点后,将该结点链接到哈
5、希表上{if((*p1).c[0]!=key[i].w)i++;else{key[i].p=p1;p1->q=NULL;p1->len=k;}}num++;if(feof(fp))//如果该文件已读完,则关闭文件{fclose(fp);break;}}}voidget_compare1(charstack[],hashkey[],intinformation1[])//从给出的一个源程序中读关键字,将该关键字存入字符数组{FILE*fp;charch;inti,j;keynode*q1;fp=fopen("progra
6、m1.txt","r");//打开存储在C盘的源程序do{i=0;while(i<10)//读取时认为关键字的长度小于10{ch=fgetc(fp);//从文件中读取时一个字符一个字符来读,遇到空格则退出if(ch==32)break;stack[i]=ch;i++;//读取下一个字符}i=0;while(i<26)//将该关键字与哈希表中的关键字比较{if(stack[0]!=key[i].w)i++;else{q1=key[i].p;while(q1){if(strcmp(stack,q1->c)!=0)//若待比
7、较的关键字与当前指向的关键字不同,则指向下一个关键字q1=q1->q;else//若待比较的关键字与当前指向的关键字相同,则对应位置的频数加1{j=(*q1).len;information1[j]++;break;}}break;}}}while(ch!=EOF);//若该源程序已读完,则关闭文件fclose(fp);}voidget_compare2(charstack[],hashkey[],intinformation2[])//从给出的另一个源程序中读关键字,将该关键字存入字符数组{FILE*fp;charc
8、h;inti,j;keynode*q1;fp=fopen("program2.txt","r");do{i=0;while(i<10){ch=fgetc(fp);if(ch==32)break;stack[i]=ch;i++;}i=0;while(i<26){if(stack[0]!=key[i].w)i++;else{q1=ke