1.首先获得我们的next数组的值。
#include <stdio.h>typedef struct{int Length; // 长度char* data; // 数据}Com;void get_next( Com T, int *next ){int j = -1;int i = 0;next[0] = -1;//不会有next[T.Length]while( i < T.Length - 1 ){if(-1 == j || T.data[i] == T.data[j] ){i++;j++;next[i] = j;}else{j = next[j];}}}int main(){Com T;T.Length = 9;T.data = "ababaaaba";int next[255];get_next( T, next );return 0;}

typedef struct { int Length; // 长度 char* data; // 数据 }Com;
void get_next( Com T, int *next ) { int j = -1; int i = 0; next[0] = -1;
//不会有next[T.Length]
while( i < T.Length - 1 ){if(-1 == j || T.data[i] == T.data[j] ){i++;j++;next[i] = j;}else{j = next[j];}}
}
// 返回子串T在主串S第pos个字符之后的位置 // 若不存在,则返回0 int Index_KMP( Com S, Com T) { int i = 0; int j = -1; int next[255];
get_next( T , next );while( i < S.Length && j < T.Length ) //T.Length = 4;{if( -1 == j || S.data[i] == T.data[j] ) //S.data[5] = T.data[0] 61 72 83{i++;j++;}else{j = next[j];//如果不相等就回到那个被匹配的位置}}if( j >= T.Length ){return i - T.Length;}else{return -1;}
}
int main()
{ Com S; Com T;
S.data = "0123456yu815"; //返回7 0123456 (包括0的) 也就是第八个位置S.Length = strlen(S.data);T.data = "yu";T.Length = strlen(T.data);int a;a = Index_KMP(S,T);printf("%d",a);return 0;
}
<br />3.还是有一些不太好的地方<br />比如:<br />```c//改进next数组运算void get_next( Com T, int *next ){int j = -1;int i = 0;next[0] = -1;//不会有next[T.Length]while( i < T.Length - 1 ){if(-1 == j || T.data[i] == T.data[j] ){i++;j++;if(T.data[i] != T.data[j]){next[i] = j;}else{next[i] = next[j];}}else{j = next[j];}}}
