当前位置:文档之家› 串的模式匹配

串的模式匹配

#include
#include
#define MAXSTRING 255
int next[MAXSTRING+1];
int nextval[MAXSTRING+1];


typedef struct {
char data[MAXSTRING+1];//0号单元储存其长度
}SString;//串结构体说明

int Createstr(SString &L){
int i,m;
char flag;
i=1;
printf("请依次输入各个字符");
while(1){
scanf("%c",&flag);
if(flag!='#')
{ L.data[i]=flag;++i;
L.data[0]=i-1;}
else break;
}
printf("您输入了以下字符!");
for(m=1;m}

int Indexstr_kmp(SString &L,SString &T,int pos){
int i,j;
i=pos;j=1;
while(i<=L.data[0]&&j<=T.data[0]){
if(j==0||L.data[i]==T.data[j]){i++;j++;}
else j=next[j];
}
if(j>T.data[0]) return(i-T.data[0]);
}

int get_next(SString &T){
int i,j;
i=1;next[1]=0;j=0;next[0]=T.data[0];
while(iif(j==0||T.data[i]==T.data[j])
{++i;++j;next[i]=j;}
else
j=next[j];

}

}

int get_nextval(SString &T){
int i,j;
i=1;nextval[1]=0;j=0;nextval[0]=T.data[0];
while(iif(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=next[j];}

}



void pain3(){
system("cls");/*清屏命令*/
printf(" 1.输入主串\n\n\n");
printf(" 2.输入模式串\n\n\n");
printf(" 3.输出模式串的next[]值\n\n\n");
printf(" 4.输出模式串的nextval[]值\n\n\n");
printf(" 5.进行模式匹配\n\n\n");
printf(" 6.输入0退出\n\n\n");
}


main(){
SString S1,S2;
loop:pain3();
int flag;
scanf("%d",&flag);
while(flag){
switch(flag){
case 1:{getchar();//消除回车影响
Createstr(S1);
getchar();
getchar(); break;}
case 2:{
getchar();
Createstr(S2);
getchar();
getchar();
break;}
case 3:{
getchar();
get_next(S2);
int i;i=1;
while(igetchar();
break;
}
case 4:{
getchar();
get_nextval(S2);
int i;i=1;
while(igetchar();

break;
}
case 5:{getchar();
int pos1,a;
printf("请输入pos的值");
scanf("%d",&pos1);
a=Indexstr_kmp(S1,S2,pos1);
printf("%d",a);
getchar(); getchar();
break;
}
}//switch
goto loop;
}//while
}//main

相关主题
文本预览
相关文档 最新文档