C语言数据结构代码——串的KMP匹配算法实现

Head.H

#define MAXSIZE 30

typedef struct _str
{
	char data[MAXSIZE];
	int len;
}Str, *str;

str InitString(void);
void PrintStr(str s);
void StrAssign(str s, char *ch);
void GetNextArray(str T, int *next);
int FindStringIndex_KMP(str s, str t);
int FindStringIndex(str s, str t);

 

 

Function.C

str InitString(void)
{
	str s = (str)malloc(sizeof(Str));
	return s;
}


void PrintStr(str s)
{
	if (s->len == 0)
	{
		printf("This String is empty ! \n");
		return;
	}

	for (int i = 0; i < s->len; i++)
	{
		printf("%c", s->data[i]);
	}
	printf("\n");
}


void StrAssign(str s, char *ch)
{
	int i;
	for (i = 0; ch[i] != '\0'; i++)
	{
		if (i < MAXSIZE - 1)
		{
			s->data[i] = ch[i];
		}
	}
	s->len = i;
}


void GetNextArray(str S, int *next)
{
	next[0] = 0;
	int k = 0;    //前缀的长度

	for (int i = 1; i < S->len; i++)
	{
		while (k > 0 && S->data[k] != S->data[i])
		{
			k = next[k - 1];
		}
		if (S->data[k] == S->data[i])//说明p[0...k-1]共k个都匹配了
		{
			k = k + 1;
		}
		next[i] = k;
	}
}


int FindStringIndex_KMP(str s, str t)
{
	if (t->len > s->len)
	{
		printf("The string be found should shorter ! \n");
		return -1;
	}

	int *nextarray = (int*)malloc(sizeof(int)*t->len);
	GetNextArray(t, nextarray);

	int i = 0;
	int matchlen = 0;
	while ((i < s->len) && (s->len - i >= t->len))
	{
		if (s->data[i] == t->data[0]) //如果开头匹配
		{
			for (int j = 0; j < t->len; j++)
			{
				if (s->data[i + j] != t->data[j])
				{
					i = i + (matchlen - nextarray[matchlen - 1]);   //根据next数组移动距离 ¥¥¥¥¥
					matchlen = 0;
					break;
				}
				else
				{
					matchlen++;
				}

				if (matchlen == t->len)
				{
					return i;
				}
			}
		}
		else  //不匹配
		{
			i++;
		}
	}

	return -1;
}


int FindStringIndex(str s, str t)
{
	if (t->len > s->len)
	{
		printf("The string be found should shorter ! \n");
		return -1;
	}

	int i = 0;
	int matchlen = 0;
	while ((i < s->len) && (s->len - i >= t->len))
	{
		if (s->data[i] == t->data[0])
		{
			for (int j = 0; j < t->len; j++)
			{
				if (s->data[i + j] != t->data[j])
				{
					i++;
					matchlen = 0;
					break;
				}
				else
				{
					matchlen++;
				}

				if (matchlen == t->len)
				{
					return i;
				}
			}
		}
		else
		{
			i++;
		}
	}

	return -1;
}

 

 

Main.C

void main(void)
{
	char a[] = "BBC ABCDAB ABCDABCDABDE";
	char b[] = "ABCDABD";

	str S1 = InitString();
	str S2 = InitString();
	StrAssign(S1, a);
	StrAssign(S2, b);
	PrintStr(S1);       //BBC ABCDAB ABCDABCDABDE
	PrintStr(S2);       //ABCDABD


	int *next = (int*)malloc(sizeof(int)*S2->len);
	GetNextArray(S2, next);
	for (int i = 0; i < S2->len; i++)
	{
		printf("%d ", next[i]);
	}
	printf("\n");


	int index = FindStringIndex_KMP(S1, S2);
	printf("Find index: %d \n", index);


	printf("\n");
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值