kmp.h
文件的建立
typedef int Status;
#define MAXSTRLEN 255
typedef struct
{
char data[MAXSTRLEN+1];
int length;
}HString;
Status Concat(HString &T,HString S1,HString S2);
void StrAssign(HString &S,char cstr[]);
Status StrCopy(HString &T,HString S);
Status StrEmpty(HString S);
Status StrCompare(HString S,HString T);
Status StrLength(HString S);
Status ClearString(HString &S);
Status Concat(HString &S);
Status SubString(HString &Sub,HString S,int pos,int len);
int Index(HString S,HString T);
Status Replace(HString &S,HString T,HString V);
Status StrInsert(HString &S,int pos,HString T);
Status StrDelete(HString &S,int pos,int len);
Status DestroyString(HString &S);
Status Index_KMP(HString S,HString T);
void get_nextval(HString T,int nextval[]);
void DispStr(HString s);
void get_next(HString T,int next[]);
Status Index_KMP1(HString S,HString T);
KMPS.cpp 文件的建立
#include "stdafx.h"
#include "kmp.h"
Status Concat(HString &T,HString S1,HString S2)
{
int i,uncut;
if(S1.length+S2.length<=MAXSTRLEN)
{
T.length=S1.length+S2.length;
for(i=1;i<=S1.length;i++)
T.data[i]=S1.data[i];
for(i=S1.length+1;i<=S1.length+S2.length;i++)
T.data[i]=S2.data[i-S1.length];
uncut=TRUE;
}
else if(S1.length<MAXSTRLEN)
{
for(i=1;i<=S1.length;i++)
T.data[i]=S1.data[i];
for(i=S1.length+1;i<=MAXSTRLEN;i++)
T.data[i]=S2.data[i-S1.length];
T.length=MAXSTRLEN;
uncut=FALSE;
}
else
{
for(i=1;i<=MAXSTRLEN;i++)
T.data[i]=S1.data[i];
uncut=FALSE;
}
return uncut;
}
void StrAssign(HString &S,char cstr[])
{
int i;
for (i=1;cstr[i-1]!='\0';i++)
S.data[i]=cstr[i-1];
S.length=i-1;
}
Status StrCopy(HString &T,HString S)
{
int i=0;
T.length=S.length;
while(S.data[i]!='\0')
{
T.data[i]=S.data[i];
}
return OK;
}
Status StrEmpty(HString S)
{
if(S.length==0&&S.data[1]=='\0')
return TRUE;
else
return FALSE;
}
Status StrCompare(HString S,HString T)
{
return OK;
}
Status StrLength(HString S)
{
return S.length;
}
Status ClearString(HString &S)
{
int i;
for(i=1;i<=S.length;i++)
S.data[i]='\0';
S.length=0;
return OK;
}
Status Concat(HString T,HString S1,HString S2)
{
int i;
T.length=S1.length+S2.length;
for(i=1;i<=S1.length;i++)
T.data[i]=S1.data[i];
for(i=S1.length+1;i<=S1.length+S2.length;i++)
T.data[i]=S2.data[i-S1.length];
return OK;
}
Status SubString(HString &Sub,HString S,int pos,int len)
{
int i;
for(i=pos;i<=len;i++)
Sub.data[i-pos-1]=S.data[i];
Sub.data[0]=len;
return OK;
}
int Index(HString S,HString T)
{
int i=1,j=0;
while (i<=S.length && j<T.length)
{ if (S.data[i]==T.data[j])
{ i++;
j++;
}
else
{ i=i-j+1;
j=0;
}
}
if (j>=T.length)
return(i-T.length-1);
else
return(-1);
}
Status Replace(HString &S,HString T,HString V)
{
return OK;
}
Status StrInsert(HString &S,int pos,HString T)
{
int i;
HString P;
P.length=S.length+T.length;
for(i=1;i<=pos-1;i++)
P.data[i]=S.data[i];
for(i=pos;i<=T.length;i++)
P.data[i]=T.data[i-pos+1];
for(i=pos;i<=S.length;i++)
P.data[i+T.length]=S.data[i];
for(i=1;i<=P.length;i++)
S.data[i]=P.data[i];
S.length=P.length;
return OK;
}
Status StrDelete(HString &S,int pos,int len)
{
HString P;
int i;
P.length=S.length-len;
for(i=1;i<=pos-1;i++)
P.data[i]=S.data[i];
for(i=pos+len;i<=S.length;i++)
P.data[i-len]=S.data[i];
return OK;
}
Status DestroyString(HString &S)
{
free(S.data);
return OK;
}
Status Index_KMP(HString S,HString T)
{
int nextval[MAXSTRLEN+1];
get_nextval(T,nextval);
int i,j;
j=1;
i=1;
while(i<=S.length&&j<=T.length)
{
if(j==0||S.data[i]==T.data[j])
{
++i;
++j;
}
else
{
j=nextval[j];
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
void get_nextval(HString T,int nextval[])
{
int i,j;
i=1;
nextval[1]=0;
j=0;
while(i<T.length)
{
if(j==0||T.data[i]==T.data[j])
{
++i;
++j;
if(T.data[i]!=T.data[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
void DispStr(HString s)
{ int i;
if (s.length>0)
{ for (i=1;i<=s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
void get_next(HString T,int next[])
{
int i,j;
i=1;
next[1]=0;
j=0;
while(i<T.length)
{
if(j==0||T.data[i]==T.data[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
Status Index_KMP1(HString S,HString T)
{
int next[MAXSTRLEN+1];
get_next(T,next);
int i,j;
j=1;
i=1;
while(i<=S.length&&j<=T.length)
{
if(j==0||S.data[i]==T.data[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
主函数所在的文件
#include "stdafx.h"
#include "kmp.h"
int main(int argc, char* argv[])
{
//printf("Hello World!\n");
int j,a;
int nextval[MAXSTRLEN+1],next[MAXSTRLEN+1];
HString s,t;
StrAssign(s,"abcabcdabcdeabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
printf("串s:");DispStr(s);
printf("串t:");DispStr(t);
get_nextval(t,nextval); //由模式串t求出nextval值
get_next(t,next);
printf(" j ");
for (j=1;j<=t.length;j++)
printf("%4d",j);
printf("\n");
printf(" t[j] ");
for (j=1;j<=t.length;j++)
printf("%4c",t.data[j]);
printf("\n");
printf("\n");
printf(" nextval");
for (j=1;j<=t.length;j++)
printf("%4d",nextval[j]);
printf("\n");
printf("改进的KMP算法:\n");
a=Index_KMP(s,t);
printf(" t在s中的位置=%d\n",a);
printf("<------------------------------------------------------------>\n");
printf(" j ");
for (j=1;j<=t.length;j++)
printf("%4d",j);
printf("\n");
printf(" t[j] ");
for (j=1;j<=t.length;j++)
printf("%4c",t.data[j]);
printf("\n");
printf(" next ");
for (j=1;j<=t.length;j++)
printf("%4d",next[j]);
printf("\n");
printf("旧版的KMP算法:\n");
a=Index_KMP1(s,t);
printf(" t在s中的位置=%d\n",a);
system("pause");
return 0;
}