KMP—分别了利用数组和结构体String实现,pos为从主串后的pos位置开始查找是否有子串,并返回子串的位置position
利用数组实现
#include<stdio.h>
#include<malloc.h>
void create(char s[]) //创建字符串
{
int i;
printf("number of chars:\n");
scanf("%d",&s[0]);
getchar();
printf("enter chars:\n");
for(i = 1; i < s[0] + 1;i++)
{
scanf("%c",&s[i]);
}
getchar();
printf("\n");
}
void show_array(char s[]) //输出字符串
{
int i = 1;
printf("%d ",s[0]);
for(;i<s[0] + 1;i++)
{
printf("%c ",s[i]);
}
printf("\n\n");
}
void next_array(char *a,int *b) //构造next数组
{
int i,j;
b[0] = -1;
b[1] = 0;
i = 0;
j = 1;
while(j < a[0])
{
if(i == 0||a[i] == a[j])
{
++i;
++j;
b[j] = i;
}
else
i = b[i];
}
}
int kmp(char *S,char *T,int pos) //kmp主体
{
int i,j;
int next[255]; //t串next数组
i = pos;
j = 1;
next_array(T,next); //构造next数组
for(int l = 0;l<T[0]+1;l++)
printf("%d ",next[l]);
while(i <=S[0]&&j<=T[0])
{
if(S[i] == T[j] || j == 0) //匹配字符串
{
++i;
++j;
}
else
j = next[j];
}
if (j>T[0])
{
return i-T[0];
}
else
return 0;
}
int main()
{
char S[255]; //s串
int pos; //存放多个匹配串位置
int position;
char T[255]; //t串
printf("array S\n");
create(S); //创建s串
printf("array T\n");
create(T); //创建t串
printf("char array S\n\n");
show_array(S);
printf("char array T\n\n");
show_array(T);
printf("input the position start!\n");
scanf("%d",&pos);
position=kmp(S,T,pos); //KMP
printf("the position is %d\n",position);
return 0;
}
利用结构体String,内部为数组的方式实现
#include<stdio.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 255
typedef int Status;
typedef char ElemType;
//定义模式串的顺序表
typedef struct
{
char ch[MAXSIZE+1];
int length;
}String;
//定义主串的顺序表
//初始化模式串
Status Init_S1(String *S1)
{
S1->length=0;
return OK;
}
//初始化主串
Status Init_S2(String *S2)
{
S2->length=0;
return OK;
}
//
void next_array(String T,int *b) //构造next数组
{
int i,j;
b[0] = -1;
b[1] = 0;
i = 0;
j = 1;
while(j <T.ch[0])
{
if(i == 0||T.ch[i] == T.ch[j])
{
++i;
++j;
b[j] = i;
}
else
i = b[i];
}
}
//进行比较求出结果
Status kmp(String S,String T,int pos) //kmp主体
{
int i,j;
int next[255]; //t串next数组
i = pos;
j = 1;
next_array(T,next); //构造next数组
for(int l = 0;l<T.ch[0]+1;l++)
printf("%d ",next[l]);
while(i <=S.ch[0] && j<=T.ch[0])
{
if(S.ch[i] == T.ch[j] || j == 0) //匹配字符串
{
++i;
++j;
}
else
j = next[j];
}
if (j>T.ch[0])
{
return i-T.ch[0];
}
else
return 0;
}
int main()
{
char s1[255];
char s2[255];
int pos;
int position;
String S1;
String S2;
Init_S1(&S1);
Init_S2(&S2);
printf("请输入主串:");
scanf("%s",&s1);
printf("请输入子串:");
scanf("%s",&s2);
//字符数组进入主串和模式串
S1.ch[0]=(int)strlen(s1);
S2.ch[0]=(int)strlen(s2);
for(int i=0;i<=(int)strlen(s1)-1;i++)
{
S1.ch[i+1]=s1[i];
S1.length++;
}
for(int j=0;j<=(int)strlen(s2)-1;j++)
{
S2.ch[j+1]=s2[j];
S2.length++;
}
//求结果
printf("input the position start!\n");
scanf("%d",&pos);
position=kmp(S1,S2,pos); //KMP
printf("the position is %d\n",position);
return 0;
}
利用指针传递参数。
#include<stdio.h>
#include<string.h>
void swap(int &i,int &j){
int temp;
temp=i;
i=j;
j=temp;
}
int main(){
int i=10;
int j=20;
swap(i,j);
printf("i=%5d j=%5d\n",i,j);
return 0;
}
上述同样改变i.j值??路过请赐教~~~~~