KMP模式匹配——C语言实现,注意指针传递

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值??路过请赐教~~~~~
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值