KMP算法的C语言程序

Python016

KMP算法的C语言程序,第1张

#include "iostream"

#include "stdlib.h"

#include "stdio.h"

#include "malloc.h"

#define MAXSTRLEN 100

#define OK 1

#define NULL 0

using namespace std

typedef char SString[MAXSTRLEN+1]

SString T,S

int next[MAXSTRLEN],c[MAXSTRLEN]

int i,j

void get_next(SString &T,int next[MAXSTRLEN]){

i=1next[1]=0j=0

while(i<T[0]){

if(j==0||T[i]==T[j]){++i++jnext[i]=j}

else j=next[j]

}

}

int KMP(SString &S,SString &T){

i=1j=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

}

void main(){

int k,p=1

int i=1,j=1

printf("输入主串:")

gets(&M[1])

printf("输入模式串:")

gets(&N[1])

while(M[i]!=NULL)

{

i++

M[0]=i-1

}

puts(&M[1])

while(N[j]!=NULL)

{

j++

N[0]=j-1

}

puts(&N[1])

if(M[0]>N[0])

{

printf("error!")

exit(0)

}

get_next(T,next)

for(i=1i<=T[0]i++)printf("%d",next[i])

printf("\n")

k=KMP(S,T)

printf("模式串从主串第%d个开始匹配!",k)

}

KMP算法的C语言实现2007-12-10 23:33

基本思想:

这种算法是D.E.Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称为KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。

其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。

#include <stdio.h>

#include <string.h>

int index_KMP(char *s,char *t,int pos)

void get_next(char *t,int *)

char s[10]="abcacbcba"

char t[4]="bca"

int next[4]

int pos=0

int main()

{

int n

get_next(t,next)

n=index_KMP(s,t,pos)

printf("%d",n)

return 0

}

int index_KMP(char *s,char *t,int pos)

{

int i=pos,j=1

while (i<=(int)strlen(s)&&j<=(int)strlen(t))

{

if (j==0||s[i]==t[j-1])

{

i++

j++

}

else j=next[j]

}

if (j>(int)strlen(t))

return i-strlen(t)+1

else

return 0

}

void get_next(char *t,int *next)

{

int i=1,j=0

next[0]=next[1]=0

while (i<(int)strlen(t))

{

if (j==0||t[i]==t[j])

{

i++

j++

next[i]=j

}

else j=next[j]

}

}

问题出在void StrCreate(Sqstring *s)这个函数中,

你在函数内给形参malloc内存,这些内存在函数返回时会被回收,因此相当于你没有分配内存。

解决的方法就是在main中分配内存,而不是在create中,或者也可以将create函数改一下:

Sqstring *StrCreate()

{

int i

s=(Sqstring*)malloc(sizeof(Sqstring))

printf("请输入字符串(长度不超过%d)!\n",Maxsize)

for(i=0i<Maxsizei++)

{

scanf("%c",s->data[i])

if(s->data[i]=='1')

break

}

s->length=i

return s

}

调用时先声明一个串指针

Sqstring *s

s = StrCreate()

这样就可以了