以下代码由C编写,VS调试:
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
//串的定义
typedef struct
{
char *ch;
int length;
}HString;
//生成一个其值等于串常量chars的串T
Status StrAssign(HString * T,char * chars)
{
int i;char *c;
for(i=0,c=chars;*c!='\0';++i){++c;} //求出字符串chars的长度
if(!i){T->ch=NULL;T->length =0; }
else{
if(!(T->ch=(char*)malloc(i*sizeof(char)))) //分配字符串长度的单元
exit(OVERFLOW);
T->length =i;
for(;i>=0;i--)
{T->ch [i-1]=*(--c);}
}
return OK;
} //StrAssign
//返回S的元素个数,称为串的长度
int StrLength(HString S)
{
return S.length ;
} //StrLength
//若S>T返回值>0;等于就是0;
int StrCompare(HString S,HString T)
{
int i;
for(i=0;i<S.length &&i<T.length ;++i)
if(S.ch [i]!=T.ch [i]) return S.ch [i]-T.ch [i];
return S.length -T.length ;
} //StrCompare
//将S清为空串.
Status ClearString(HString S)
{
if(S.ch ) {free(S.ch );S.ch =NULL;}
S.length =0;
return OK;
} //ClearString
//用T返回由S1和S2链接而成的新串
Status Concat(HString *T,HString S1,HString S2)
{
char *p,*p1,*p2;int i; char s;
if(!(T->ch=(char*)malloc(S1.length +S2.length *sizeof(char)))) //分配字符串长度的单元
exit(OVERFLOW);
p=T->ch ;
p1=S1.ch ;
p2=S2.ch ;
for(i=0;i<S1.length ;i++){
*p++=*p1++;}
for(i=0;i<S2.length;i++,p++ ){
*p=*p2++;
}
T->length =S1.length +S2.length ;
return OK;
} //Concat
//用Sub返回串S的第pos个字符起长度为 len的字符串,其中,1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1.
Status SubString(HString *Sub,HString S,int pos,int len)
{
char *p;int i;
if(pos<1||pos>S.length ||len<0||len>S.length -pos+1)
return ERROR;
if(!len){Sub->ch =NULL;Sub->length =0;}
else{
Sub->ch =(char *)malloc(len * sizeof(char));
p=&S.ch[pos-1];
for(i=0;i<len;i++)
{Sub->ch [i]=*p++;}
Sub->length =len;
}
return OK;
} //SubString
//求模式串T的next函数值并存入数组next.
void Get_next(HString T,int *p)
{
int i=1,j=0;*(p+1)=0;
while(i<T.length){
if(j==0||T.ch [i-1]==T.ch [j-1]){++i;++j;*(p+i)=j;}
else j=*(p+j);
}
}//Get_next
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法。其中,T非空
int Index_KMP(HString S,HString T,int pos)
{
int next[15];
int i=pos;int j=1;
Get_next(T,&next);
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]){++i;++j;}
else j=next[j];
}
if(j>T.length) return i-T.length ;
else return 0;
} //Index_KMP

运行结果如下: