[一]传统匹配模式
//-----头文件------
#include<stdio.h>
#include<stdlib.h>
//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0
//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;
//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index(SString *S,SString *T,int pos);
void StrOutput(SString S);
//-----主函数做替换测试------
void main()
{
SString t,*T=&t,s,*S=&s;
int i;
StrAssign(T,"abaabcac");
StrAssign(S,"acabaabaabcacaabc");
i=Index(S,T,1);
//StrOutput(s);
printf("%d\n",i);
getchar();
getchar();
}
//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
int i;
for(i=0;'\0'!=*s;s++,i++)
{
(*T)[i+1]=*s;
}
(*T)[0]=i;
return TURE;
}
//-----输出串-----
void StrOutput(SString S)
{
int i;
for(i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
}
int Index(SString *S,SString *T,int pos)
{
if (1>pos||pos>(*S)[0])
{
exit(OVERFLOW);
}
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;
}
}
return j>(*T)[0]?i-(*T)[0]:0;
}
[2]KMP匹配模式
//-----头文件------
#include<stdio.h>
#include<stdlib.h>
//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0
//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;
//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index_KMP(SString *S,SString *T,int pos);
void get_next(SString *T,int next[]);
void StrOutput(SString S);
//-----主函数做替换测试------
void main()
{
SString t,*T=&t,s,*S=&s;
int i;
StrAssign(T,"abaabcac");
StrAssign(S,"acabaabaabcacaabc");
i=Index_KMP(S,T,1);
//StrOutput(s);
printf("%d\n",i);
getchar();
getchar();
}
//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
int i;
for(i=0;'\0'!=*s;s++,i++)
{
(*T)[i+1]=*s;
}
(*T)[0]=i;
return TURE;
}
//-----输出串-----
void StrOutput(SString S)
{
int i;
for(i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
}
int Index_KMP(SString *S,SString *T,int pos)
{
int i=pos,j=1,*next;
if (1>pos||pos>(*S)[0])
{
exit(OVERFLOW);
}
if (!(next=(int*)malloc((*T)[0]*sizeof(int))))
{
exit(OVERFLOW);
}
get_next(T,next);
while(i<=(*S)[0]&&j<=(*T)[0])
{
if((*S)[i]==(*T)[j]||0==j)
{
++i;
++j;
}
else
{
j=next[j];
}
}
return j>(*T)[0]?i-(*T)[0]:0;
}
void get_next(SString *T,int next[])
{
int i=1,j=0;
next[1]=0;
while (i<(*T)[0])
{
if (0==j||(*T)[i]==(*T)[j])
{
++i;
++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
[3]KMP匹配模式的get_next函数改进
//-----头文件------
#include<stdio.h>
#include<stdlib.h>
//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0
//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;
//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index_KMP(SString *S,SString *T,int pos);
void get_nextval(SString *T,int nextval[]);
void StrOutput(SString S);
//-----主函数做替换测试------
void main()
{
SString t,*T=&t,s,*S=&s;
int i;
StrAssign(T,"abaabcac");
StrAssign(S,"acabaabaabcacaabc");
i=Index_KMP(S,T,1);
printf("主串:");
StrOutput(s);
printf("\n子串:");
StrOutput(t);
printf("\n子串在主串的位置:%d\n",i);
getchar();
getchar();
}
//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
int i;
for(i=0;'\0'!=*s;s++,i++)
{
(*T)[i+1]=*s;
}
(*T)[0]=i;
return TURE;
}
//-----输出串-----
void StrOutput(SString S)
{
int i;
for(i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
}
int Index_KMP(SString *S,SString *T,int pos)
{
int i=pos,j=1,*nextval;
if (1>pos||pos>(*S)[0])
{
exit(OVERFLOW);
}
if (!(nextval=(int*)malloc(((*T)[0]+1)*sizeof(int))))
{
exit(OVERFLOW);
}
get_nextval(T,nextval);
while(i<=(*S)[0]&&j<=(*T)[0])
{
if((*S)[i]==(*T)[j]||0==j)
{
++i;
++j;
}
else
{
j=nextval[j];
}
}
return j>(*T)[0]?i-(*T)[0]:0;
}
void get_nextval(SString *T,int nextval[])
{
int i=1,j=0;
nextval[1]=0;
while (i<(*T)[0])
{
if (0==j||(*T)[i]==(*T)[j])
{
++i;
++j;
if ((*T)[i]!=(*T)[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
{
j=nextval[j];
}
}
}