您的位置:首页 > 理论基础 > 数据结构算法

C语言数据结构KMP算法实现模式串主串匹配(数据结构第三次试验)

2017-12-06 11:06 344 查看
KMP算法中虽然计算了nextval的值,但我在此次并没有用到。

课程名称:数据结构
实验项目名称:串基本操作的实现
实验目的:
1.掌握串的模式匹配操作。
实验要求:
1、    分别使用BF和KMP算法完成串的模式匹配。
实验过程:
1、    设计完成next值的计算函数;
2、    设计完成修正next值的函数;
3、    KMP算法代码;
4、    输入子串(abbc)和主串(abbabbcad)
5、    输出子串在主串中开始的位置。
实验报告中给出next,修正next,KMP及主函数的代码。
实验结果:
输入: 子串:abbc; 主串:abbabbcad
输出:4
实验分析:
1.普通next和修正next的区别;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为Stringindex.cpp。

#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 next[MAXSIZE+1];
int nextval[MAXSIZE+1];
int length;
}S1String;
//定义主串的顺序表
typedef struct
{
char ch[MAXSIZE+1];
int length;
}S2String;
//初始化模式串
Status Init_S1(S1String &S1)
{
S1.length=0;
return OK;
}
//初始化主串
Status Init_S2(S2String &S2)
{
S2.length=0;
return OK;
}
//求的模式串的next
Status Get_S1_next(S1String &S1)
{
int i=1;
S1.next[1]=0;
int j=0;
while(i<S1.length)
{
if(j==0||S1.ch[i]==S1.ch[j])
{
i++;
j++;
S1.next[i]=j;
}
else
{
j=S1.next[j];
}
}
return OK;
}
//求得模式串的nextval
Status Get_S1_nextval(S1String &S1)
{
int i=1;
S1.nextval[1]=0;
int j=0;
while(i<S1.length)
{
if(j==0||S1.ch[i]==S1.ch[j])
{
i++;
j++;
if(S1.ch[i]!=S1.ch[j])
{
S1.nextval[i]=j;
}
else
{
S1.nextval[i]=S1.nextval[j];
}
}
else
{
j=S1.nextval[j];
}
}
return OK;
}
//进行比较求出结果
Status Compare(S1String &S1,S2String &S2)
{
int i=1;
int j=1;
int result;
result=1;
while(1)
{
if(S1.next[i]==0&&S1.ch[i]!=S2.ch[j])
{
j++;
result=j;
}
else
{
if(S1.ch[i]==S2.ch[j])
{
i++;
j++;
}
else
{
i=S1.next[i];
result=j-i+1;
}
if(i>S1.length)
{
return result;
}
}
}
}
int main()
{
char s1[255];
char s2[255];
int result;
S1String S1;
S2String S2;
Init_S1(S1);
Init_S2(S2);
printf("请输入模式串:");
scanf("%s",&s1);
printf("请输入主串:");
scanf("%s",&s2);
//字符数组进入主串和模式串
for(int i=0;i<=strlen(s1)-1;i++)
{
S1.ch[i+1]=s1[i];
S1.length++;
}
for(int j=0;j<=strlen(s2)-1;j++)
{
S2.ch[j+1]=s2[j];
S2.length++;
}
//求结果
Get_S1_next(S1);
Get_S1_nextval(S1);
result=Compare(S1,S2);
printf("结果是:%d",result);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: