利用串的堆顺序存储,
typedef struct{
char *ch; //若串非空,则按串长分配存储区,
//否则ch为NULL
int length; //串长度
}HString;
1)编写完成下列功能的函数:(1)创建一个串;(2)实现BF模式匹配算法;(3)实现KMP模式匹配算法;(4)调用创建串函数创建主串和模式串;(5)调用BF算法输出匹配结果;(6)调用KMP算法输出匹配结果;
2)用主函数调用你所编写的函数,并在每一步后有适当的输出,以验证你编程序的正确性。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *ch; // 若串非空,则按串长分配存储区, 否则ch为NULL
int length; // 串长度
} HString;
// 创建一个串
void createString(HString *s, const char *str) {
s->length = strlen(str);
s->ch = (char *)malloc((s->length + 1) * sizeof(char));
strcpy(s->ch, str);
}
// 释放串的内存
void destroyString(HString *s) {
if (s->ch != NULL) {
free(s->ch);
s->ch = NULL;
}
s->length = 0;
}
// 实现BF模式匹配算法
int BFMatch(const HString *mainStr, const HString *pattern) {
int i = 0, j = 0;
while (i < mainStr->length && j < pattern->length) {
if (mainStr->ch[i] == pattern->ch[j]) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}
if (j >= pattern->length) {
return i - pattern->length; // 返回匹配的起始位置
} else {
return -1; // 未找到匹配
}
}
// 实现KMP模式匹配算法(构建部分匹配表)
void getNext(const HString *pattern, int next[]) {
int i = 0, j = -1;
next[0] = -1;
while (i < pattern->length - 1) {
if (j == -1 || pattern->ch[i] == pattern->ch[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}
// 实现KMP模式匹配算法
int KMPMatch(const HString *mainStr, const HString *pattern) {
int i = 0, j = 0;
int next[pattern->length];
getNext(pattern, next);
while (i < mainStr->length && j < pattern->length) {
if (j == -1 || mainStr->ch[i] == pattern->ch[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j >= pattern->length) {
return i - j; // 返回匹配的起始位置
} else {
return -1; // 未找到匹配
}
}
int main() {
HString mainString, patternString;
createString(&mainString, "ABABCABAB");
createString(&patternString, "ABAB");
printf("主串: %s\n", mainString.ch);
printf("模式串: %s\n", patternString.ch);
// 使用BF算法查找匹配
int bfMatchPos = BFMatch(&mainString, &patternString);
if (bfMatchPos != -1) {
printf("BF算法:匹配成功,位置:%d\n", bfMatchPos);
} else {
printf("BF算法:未找到匹配\n");
}
// 使用KMP算法查找匹配
int kmpMatchPos = KMPMatch(&mainString, &patternString);
if (kmpMatchPos != -1) {
printf("KMP算法:匹配成功,位置:%d\n", kmpMatchPos);
} else {
printf("KMP算法:未找到匹配\n");
}
destroyString(&mainString);
destroyString(&patternString);
return 0;
}
此代码包括创建串、BF模式匹配算法和KMP模式匹配算法的实现。在主函数中,我们创建了主串和模式串,然后使用BF算法和KMP算法查找匹配,并输出结果。确保在使用完字符串后释放内存以防止内存泄漏。