串(从0开始)(有bug)

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAXSIZE 100
using namespace std;
 
#define N 100
 
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
 
typedef struct   //串的堆式顺序存储结构 
{
	char *ch;   //若是非空串,则按串长分配存储区,否则ch为NULL
	int length; //串的当前长度 
}HString; 
//00 初始化 
Status InitString(HString &H)
{
	H.ch=new ElemType [MAXSIZE];
	if(!H.ch)   exit(OVERFLOW);
	H.length=0;
	return OK;
}
//01 创建串 
Status CreateString (HString &H,int len)
{
	char x;
	for(int i=0;i<len;i++)
	{
		cin>>x;
		H.ch[i]=x;
	}
	H.length=len;
	return OK;
 } 
Status DisPlay(HString &H)
{
	printf("打印串:") ; 
	for(int i=0;i<H.length;i++)
	{
		printf("%c",H.ch[i]);
	}
	printf("\n");
	return OK;
}
//02 实现BF模式匹配算法
int Index_BF(HString S,HString T,int &pos) 
{
	//int i=pos;
	//int j=1;  //初始化 
	int i=0,j=0;
	while(i<S.length && j<T.length)//两个串均比较到末尾 
	{
		if(S.ch[i]==T.ch[j])
		{
			++i;++j;//继续比较后继字符 
		}
		else //指针退后重新开始比较 
		{
		//	i=i-(j-1)+1;
		    i=i-j+1;
			j=0;
		}
	}
//   	if(j+1>T.length) 
		if(j>=T.length) 
		{
		   pos=i-T.length+1;
		   return i-T.length+1;//匹配成功
		}
		else return 0;//匹配失败 
}
int Index_KMP(HString S,HString T,int &pos,int next[]) 
{
	//int i=pos;
	//int j=1;  //初始化 
	int i=0;
	int j=0;
	while(i<S.length && j<T.length)//两个串均比较到末尾 
	{
		if(j==-1||S.ch[i]==T.ch[j])
		{
			++i;++j;//继续比较后继字符 
		}
		else
		j=next[j]-1;
	}
	if(j>T.length)  
	{
	    return i-T.length+1;//匹配成功
	    pos=i-T.length+1;
	}
	else return 0;//匹配失败 
}
void get_next(HString T,int next[])
{
	next[1]=0;
	int m,j;
	m=0; //m=next[1],m代表的是前缀结束时的下标,也就是相似度,T1...Tm(m个字符) 
	j=1; //j代表的是后缀末尾的下标,Tj-m+1...Tj(m个字符)  ++j后即所求next[j] 
	while(j<T.length)
	{
		if(m==0||T.ch[m]==T.ch[j])
		{
			++m;++j;
			next[j]=m;
		}
		else //匹配失败,则回溯 
		m=next[m];//若是字符不相同,则m回溯 
	}
}
void get_nextval(HString T,int nextval[])//求模式串T中的next函数修正值,并存入数组nextval 
{
	int i=0,j=0;
	nextval[0]=0;
	while(i<T.length)
	{
		if(j==0||T.ch[i]==T.ch[j])
		{
			++i;++j;
			if(T.ch[i]!=T.ch[j])
			nextval[i]=j;
			else nextval[i]=nextval[j];
		}
		else j=nextval[j];
	 } 
}
 int main()
 {
 	int m,n,pos;
 	HString H,S,T;
 	int next[N];
 	int nextval[N];
 	//00 初始化 
 	InitString(S);
 	InitString(T);
 	//01 创建串S 
 	printf("创建的串长为:"); 
 	scanf("%d",&m);
 	printf("键入串S:"); 
 	CreateString(S,m);
 	DisPlay(S);
 	//01 创建串T 
 	printf("创建的串长为:"); 
 	scanf("%d",&n);
 	printf("键入串T:") ;
 	CreateString(T,n);
 	DisPlay(T);
 	//02 实现BF模式匹配算法
 	Index_BF(S,T,pos);
	printf("BF:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
	//03 实现KMP模式匹配算法 
	get_next(T,next);
	Index_KMP(S,T,pos,next);
	printf("KMP:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
	//04 实现KMP模式匹配  改进算法 
	get_nextval(T,nextval);
	Index_KMP(S,T,pos,nextval);
	printf("KMP(改进):模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值