串的存储结构(代码)+算法

本文介绍了字符串的顺序、堆式和链式存储结构,以及BF和KMP两种模式匹配算法,重点讲解了计算next函数的过程。
摘要由CSDN通过智能技术生成

串的顺序存储

//----串的定义顺序储存结构------
#define MAXLEN 255 //串的长度
typedef struct{
	char ch[MAXLEN+1];//存储串的一维数组 
	int length;//串当前长度
} SString;
//----串的堆式顺序储存结构------
typedef struct{
	char *ch;//若是非空串,则按串长分配存储区,否则ch为UNLL
	int length;//串当前长度
} SString;

串的链式存储

//----串的链式储存结构------
#define CHUNKSIZE 80 //可由用户定义的块大小 
typedef struct Chunk{
	char ch[CHUNKSIZE];
	struct Chunk *next;
} Chunk;
typedef struct{
	char *head,*tail;
	int length;
} LString;

串的模式匹配算法

子串的定位运算通常称为串的模式匹配或串匹配

BF算法

int Index_BF(SString s ,SString T,int pos)
{
	//返回模式T在主串S中第po个字符开始第一次出现的位置。若不存在,则返回0
	//其中,T非空,1<<pos<<s.length
	i=pos ;j=1;//初始化 
	while(i<=S.lenght && j<<T.lenght)//两个串均末比较串尾。 
	{
		if (S.ch[i]==T.ch[j]){
			++i;++j;
		}//继续比较后继字符 
		else{
			i=i-j+2;j=1;
		}//指针后退,重新开始匹配 
	}
	if(j>T.length)return i-T.length;//匹配成功
	else return 0; 
}

KMF算法

int Index_KMP(SString s ,SString T,int pos)
{
	//利用模式串T的next函数T在主串S中第po个字符之后的位置 
	//其中,T非空,1<<pos<<s.length
	i=pos ;j=1;//初始化 
	while(i<=S.lenght && j<<T.lenght)//两个串均末比较串尾。 
	{
		if (j==0||S.ch[i]==T.ch[j]){
			++i;++j;
		}//继续比较后继字符 
		else{
		j=next[j];
		}//模式串向右移动 
	}
	if(j>T.length)return i-T.length;//匹配成功
	else return 0; //匹配失败 
}

计算next函数值

viod get_next(SString T ,int next[])
{
	//求模式串T的next函数值并将其存入数组next 
	i=1;next[1]=0;j=0;
	while(i<=T.lenght)
	{
		if (j==0||T.ch[i]==T.ch[j]){
			++i;++j;
			next[i]=j;
		}
		else{
		j=next[j];
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值