串的模式匹配,用C语言实现的。现在发出来请各位高手点评一下!
这个是用数组实现的,请问如果用
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN+1] //0号单元存放串的长度
这个怎么实现呢?我一直试都不行。希望知道的说一下!呵呵。。先谢谢各位啦!
#include<stdio.h>
int Index(char S[],char T[],int pos){
int i=pos,j=1;
while (i<=S[0]&&j<=T[0]){
if (S[i]==T[j]) {++i;++j;}
else {i=i-j+2;j=1;} //指针回溯
}
if (j>T[0]) return(i-T[0]); //匹配成功,并返回模式串首字符的位置
else return 0; //未匹配成功,返回0
}
void Get_next(char T[],int next[]){ //求匹配失败时,模式串应滑动多远的距离.此时相当于将模式
int i=1,j=0;next[1]=0; //串与自身进行匹配,并将与自身匹配成功的位置存入数组next
while (i<T[0]){
if (T[i]==T[j]||j==0) {++i;++j;next[i]=j;}
else j=next[j];
}
}
int KMP_Index(char S[],char T[],int pos,int next[]){
int i=pos,j=1;
while (i<=S[0]&&j<=T[0]){
if (j==0||S[i]==T[j]) {++i;++j;}
else j=next[j];
}
if (j>T[0]) return(i-T[0]); //匹配成功,并返回模式串首字符的位置
else return 0; //未匹配成功,返回0
}
void Get_nextval(char T[],int nextval[]){
int i=1,j=0;nextval[1]=0; //
while (i<T[0]){
if (T[i]==T[j]||j==0) {
++i;++j;
if(T[i]!=T[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int main( ){
char S[]={13,'a','b','a','b','c','a','b','c','a','c','b','a','b'}; //0位置存放串的长度
char T[]={5,'a','b','c','a','c'};
int loc,n;
int next[5];
int nextval[5];
printf("主串:");
for(n=1;n<=S[0];n++) printf("%c ",S[n]); printf("/n");
printf("模式串:");
for(n=1;n<=T[0];n++) printf("%c ",T[n]);
loc=Index(S,T,1);
printf("/n/n原始算法在第%d个位置发现匹配!/n",loc);
Get_next(T,next);
loc=KMP_Index(S,T,1,next);
printf("/n使用next函数的KMP算法在第%d个位置发现匹配!/n",loc);
Get_nextval(T,nextval);
loc=KMP_Index(S,T,1,nextval);
printf("/n改进next函数的KMP算法在第%d个位置发现匹配!/n/n",loc);
return 0;
}
这边是直接对数组初始化,如果想要自己输入想要匹配的串应该怎么修改呢?