数据结构,C语言,模式匹配问题!!!急!!! 求高手帮忙!谢啦!重赏!

//头文件定义为:
#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
//#include <malloc.h>

//宏定义:
#define OVERFLOW -2
#define OK 1
#define MAXSTRLEN 255

typedef char SString[MAXSTRLEN+1];
int strLengh(SString S)
{
int m;
for(m=1;S[m]!='\0';m++);
S[0]=m;
return 0;
}

int Index(SString S,SString T,int pos)
{ //按照普通匹配查找方式查找模式串
int i=pos;
int j=1,k=0;
while(i<=(int)S[0] && j<=(int)T[0])
{
if(S[i]==T[j])
{
++i;
++j;
}
else
{
i=i-j+2;
j=1;
}

}
if(j>T[0])
return i-T[0];
else return 0;
}//Index

void get_next(SString T,int next[])
{ //求KMP算法中的next函数值,并存入数组next[]
int i=1;
next[1]=0;
int j=0;
while(i<(int)T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;

next[i]=j;
}
else j=next[j];
}
}//next

int get_nextval(SString T,int nextval[])
{
int i=1;
nextval[1]=0;
int j=0;
while(i<(int)T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else j=nextval[j];
}
return 0;
}//nextval

int Index_KMP(SString S,SString T,int pos,int next[])
{ //KMP算法的实现过程
int i=pos;
int j=1,k=0;
while(i<=(int)S[0] && j<=(int)T[0])
{
if(j==0 || S[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}

}
if(j>(int)T[0])
return i-T[0];
else return 0;
}//Index_KMP

void main()
{
SString T,S;
int pos;
int k1,k2;
int i,j;
int next[MAXSTRLEN];
int nextval[MAXSTRLEN];
printf("请输入字符串匹配主串:\n");
gets(S);
printf("请输入字符串匹配模式串:\n");
gets(T);

getchar();
printf("您输入的字符串匹配中主串为:\n");
puts(S);

printf("您输入的字符串匹配中模式串为:\n");
puts(T);
getchar();
printf("请您输入起始位置pos:");
scanf("%d",&pos);

strLengh(S);
strLengh(T);

printf("\n----------运用普通算法------------\n");
printf("\n");
if(k1=Index(S,T,pos))
printf("匹配成功!\n普通匹配算法得模式串位置:%d\n",k1);
else
printf("没有找到,匹配失败!\n");
printf("\n----------运用KMP算法------------\n");

get_next(T,next);
printf("得到T的next[]序列为:");
for(i=1;i<=T[0];i++)
printf("%d",next[i]);

get_nextval(T,nextval);
printf("\n得到T的nextval[]序列为:");
for(i=1;i<=T[0];i++)
printf("%d",nextval[i]);
printf("\n");

if(k2=Index_KMP(S,T,pos,next))
printf("匹配成功!\nKMP算法得模式串位置:%d\n",k2);
else
printf("没有找到,匹配失败!");
}
用KMP匹配法
假如我的主串是abcabaasdf
模式串是abcabaa
那么next[j]的值应该是0111232
nextval[j]的值应该是0110132
为什么我的这个程序输出的却是next[j]0111211 nextval[j]0110211
并且用普通匹配法却不能找到匹配
求高手改进啊!!!急啊!谢啦!

第1个回答  推荐于2016-01-19
修改如下 :
//头文件定义为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <malloc.h>

//宏定义:
#define OVERFLOW -2
#define OK 1
#define MAXSTRLEN 255

typedef char SString[MAXSTRLEN+1];
int strLengh(SString S)
{
int m;
for(m=1;S[m]!='\0';m++) ;
S[0]=m-1;;
return 0;
}

int Index(SString S,SString T,int pos)
{ //按照普通匹配查找方式查找模式串
int i=pos;
int j=1;
while(i<=(int)S[0] && j<=(int)T[0])
{
if(S[i]==T[j])
{
++i;
++j;

}
else
{
i=i-j+2;
j=1;
}

}
if(j>T[0])
return i-T[0];
else return 0;
}//Index

void get_next(SString T,int next[])
{ //求KMP算法中的next函数值,并存入数组next[]
int i=1;
next[1]=0;
int j=0;
while(i<(int)T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;

next[i]=j;
}
else j=next[j];
}
}//next

int get_nextval(SString T,int nextval[])
{
int i=1;
nextval[1]=0;
int j=0;
while(i<(int)T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else j=nextval[j];
}
return 0;
}//nextval

int Index_KMP(SString S,SString T,int pos,int next[])
{ //KMP算法的实现过程
int i=pos;
int j=1,k=0;
while(i<=(int)S[0] && j<=(int)T[0])
{
if(j==0 || S[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}

}
if(j>(int)T[0])
return i-T[0];
else return 0;
}//Index_KMP

void main()
{
SString T,S;
char *p;
int pos;
int k1,k2,k;
int i,j;
int next[MAXSTRLEN];
int nextval[MAXSTRLEN];

printf("请输入字符串匹配主串:\n");
p=&S[1];
gets(p);
printf("请输入字符串匹配模式串:\n");
p=&T[1];
gets(p);

printf("您输入的字符串匹配中主串为:\n");
p=&S[1];
puts(p);

printf("您输入的字符串匹配中模式串为:\n");
p=&T[1];
puts(p);

printf("请您输入起始位置pos:");
scanf("%d",&pos);

strLengh(S);
strLengh(T);

printf("\n----------运用普通算法------------\n");
printf("\n");
if(k1=Index(S,T,pos))
printf("匹配成功!\n普通匹配算法得模式串位置:%d\n",k1);
else
printf("没有找到,匹配失败!\n");
printf("\n----------运用KMP算法------------\n");

get_next(T,next);
printf("得到T的next[]序列为:");
for(i=1;i<=T[0];i++)
printf("%d",next[i]);

get_nextval(T,nextval);
printf("\n得到T的nextval[]序列为:");
for(i=1;i<=T[0];i++)
printf("%d",nextval[i]);
printf("\n");

if(k2=Index_KMP(S,T,pos,next))
printf("匹配成功!\nKMP算法得模式串位置:%d\n",k2);
else
printf("没有找到,匹配失败!");
}本回答被提问者采纳

关于数据结构的问题,用C语言描述
1.栈、队列的定义及其相关数据结构的概念,包括:顺序栈,链栈,共享栈,循环队列,链队等。栈与队列存取数据(请注意包括:存和取两部分)的特点。2.递归算法。栈与递归的关系,以及借助栈将递归转向于非递归的经典算法:n!阶乘问题,fib数列问题,hanoi问题,背包问题,二叉树的递归和非递归遍历问题,图的深度遍历与栈的关系...

数据结构(c++)字符串 模式匹配算法问题,对高手来说只要写一点点_百度...
include <string> using namespace std;string s = "zabcdefg";int index1(const string ss, int pos){ if (pos<0 || pos>s.length())printf("pos²»ºÏ·¨£¡");int i = pos, j = 0;while (i < s.length() && j < ss.length()) { if...

数据结构模式匹配的题,求解!
第三个a前面是'ab',从左起最大子串'a'不等于从右起起最大子串'b',所以为0+1=1 第四个a前面是'aba',从左起最大子串'ab'不等于从右起起最大子串'ba',继续往下找'a'='a',所以1+1=2 第五个b前面是'abaa',,'aba'不等于'baa','ab'不等于'aa','a'='a',所以1+1=2 第六个...

数据结构C语言版的图书目录
第1章绪论11.1什么是数据结构11.2基本概念和术语41.3抽象数据类型的表示与实现91.4算法和算法分析131.4.1算法131.4.2算法设计的要求131.4.3算法效率的度量141.4.4算法的存储空间需求17第2章线性表182.1线性表的类型定义182.2线性表的顺序表示和实现212.3线性表的链式表示和实现272.3.1线性...

谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告 ...
数据结构(C语言版)严蔚敏 清华大学出版社 目录 第1章 绪论 1.1 什么是数据结构 1.2 基本概念和术语 1.3 抽象数据类型的表现与实现 1.4 算法和算法分析 第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示及相加 第3章 ...

高分:网络流问题
(1)数据结构 type nwtype=record c,f:integer; {流量上限和实际流量} end; stype=record l,p:integer; {标号(来自哪个点和是否已检查标记)} end; (2)程序 const maxn=100; type nwtype=record c,f:integer; end; stype=record l,p:integer; end; var nw:array[1..maxn,1..maxn] of nwtype...

数据结构的问题~
C 可以链接存储 D 数据元素可以是多个字符 2 下面( )是C语言中“abcd321ABCD”的子串。 A abcd B 321AB C “abcAB” D “21AB” 3 设有两个串p和q,求p和q首次出现的位置的运算称作( ) A 连接 B 模式匹配 C 求子串 D 求串长 4 设有一个字符串S=“windows”,求子串的数目是() A 25 B 26...

求助!!!模式匹配和KMP算法
这个题目最难的是KMP算法和实现。其他的书本上都有的。我自己写的个程序:测试结果如下:113113113113113113113113113113113113113113113111311311311311311311 13113113111 at 37 贴上源代码:include"stdio.h"include "conio.h"include "stdio.h"include "math.h"int result;char pat[]="13113113111";char str...

C语言,以下如何理解,谢谢!
的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。 (3)循环结构: 循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。 四种循环可以用来处理同一问题,一般情况下...

数据结构中严蔚敏第三版中 主串和模式串的匹配KMP算法
首先,可以肯定的是,next是模式串的事,跟主串无关。。。模式串(对齐)abaabcac 下标序号分别为01234567 next[i]的值,为模式串0~i-1的前缀串中,前next[i]个字符,与后next[i]个字符,组成的串完全相等的,最大的值。当然,next[i]是小于整个前缀串长度的。。。我用程序跑出来,这个模式串...

相似回答
大家正在搜