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);
}
课程名称:数据结构
实验项目名称:串基本操作的实现
实验目的:
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);
}
相关文章推荐
- kmp算法字符串匹配C语言实现
- 字符串匹配KMP算法的C语言实现
- C语言实现字符串匹配KMP算法
- 数据结构_串_串的模式匹配_KMP算法_C++实现
- 数据结构Java实现——③串--->串的模式匹配:Brute-Force算法和 KMP算法
- 数据结构 模式匹配BF和KMP算法实现
- [数据结构]程杰模式串匹配、KMP算法及其改进(代码)
- 数据结构c语言实现字符串定位(模式匹配)
- C语言实现字符串匹配KMP算法
- 【C语言 数据结构】栈的极简实现
- 数据结构C语言实现之链栈
- 数据结构之---C语言实现共享栈
- 字符串匹配KMP算法实现
- 算法与数据结构-栈的基本操作C语言实现
- 严蔚敏版《数据结构》第二章线性表的算法C语言实现
- C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出
- 数据结构.队列(C语言实现)
- Sunday串匹配算法 C语言实现
- 经典算法研究:模式匹配(子串匹配)之 BM 算法(C语言实现版)初版
- 数据结构---C语言之队列的链式表示和实现(链队列)