C语言数据结构中KMP算法编程中的问题

Python020

C语言数据结构中KMP算法编程中的问题,第1张

问题出在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()

这样就可以了

#include <cstring>

#include <iostream>

using namespace std

//修正后的求next数组各值的函数代码

void get_nextval(char const* ptrn, int plen, int* nextval)

{

int i = 0 //i是从0开始的

nextval[i] = -1

int j = -1

while( i <plen-1 )

{

if( j == -1 || ptrn[i] == ptrn[j] ) //循环的if部分

{

++i

++j

if( ptrn[i] != ptrn[j] ) //++i,++j之后,再次判断ptrn[i]与ptrn[j]的关系

nextval[i] = j

else

nextval[i] = nextval[j]

}

else //循环的else部分

j = nextval[j]

}

}

void print_progress(char const* src, int src_index, char const* pstr, int pstr_index)

{

cout<<src_index<<"\t"<<src<<endl

cout<<pstr_index<<"\t"

for( int i = 0i <src_index-pstr_index++i )

cout<<" "

cout<<pstr<<endl

cout<<endl

}

//int kmp_seach(char const*, int, char const*, int, int const*, int pos) KMP模式匹配函数

//输入:src, slen主串

//输入:patn, plen模式串

//输入:nextval KMP算法中的next函数值数组

int kmp_search(char const* src, int slen, char const* patn, int plen, int const* nextval, int pos)

{

int i = pos

int j = 0

while ( i <slen &&j <plen )

{

if( j == -1 || src[i] == patn[j] )

{

++i

++j

}

else

{

j = nextval[j]

//当匹配失败的时候直接用p[j_next]与s[i]比较,

//下面阐述怎么求这个值,即匹配失效后下一次匹配的位置

}

}

if( j >= plen )

return i-plen

else

return -1

}

int main()

{

std::string src = "aabcabcebafabcabceabcaefabcacdabcab"

std::string prn = "abac"

int* nextval = new int[prn.size()]

//int* next = new int[prn.size()]

get_nextval(prn.data(), prn.size(), nextval)

//get_next(prn.data(), prn.size(), next)

for( int i = 0i <prn.size()++i )

cout<<nextval[i]<<"\t"

cout<<endl

cout<<"result sub str: "<<src.substr( kmp_search(src.data(), src.size(), prn.data(), prn.size(), nextval, 0) )<<endl

system("pause")

delete[] nextval

return 0

}

望楼主采纳!