c语言的数据结构:写出KMP算法。要求:从键盘输入一个字符串、输出该字符串的next数组和nextval数组。
时间: 2024-12-12 14:28:19 浏览: 10
C语言数据结构之模式匹配字符串定位问题
C语言中的KMP(Knuth-Morris-Pratt)算法用于在文本串中查找模式串的第一次出现位置,它是一种改进的字符串匹配算法,通过构建next数组避免了在每次比较失败后回溯大量字符。以下是KMP算法的基本步骤以及如何编写相关的函数:
首先,我们需要创建两个数组:
1. next数组存储的是模式串的前缀最长公共前后缀长度。
2. nextval数组是一个辅助数组,通常不用直接输出,主要用于计算next数组。
```c
#include <stdio.h>
#include <string.h>
// 计算next数组
void compute_next(char pattern[], int length, int next[]) {
int j = -1; // 指针j初始值为-1
for (int i = 1; i < length; ++i) {
while (j != -1 && pattern[i] != pattern[j + 1]) {
j = next[j]; // 如果当前字符不等于前缀的下一个字符,更新j指针
}
if (pattern[i] == pattern[j + 1]) { // 如果相等,说明找到了新的前后缀
++j;
}
next[i] = j; // 当前字符的next值为j
}
}
// 主函数示例
int main() {
char input[100], pattern[100];
printf("请输入字符串:");
fgets(input, sizeof(input), stdin);
input[strlen(input) - 1] = '\0'; // 去除换行符
printf("请输入模式:");
fgets(pattern, sizeof(pattern), stdin);
pattern[strlen(pattern) - 1] = '\0';
int length_input = strlen(input);
int length_pattern = strlen(pattern);
int next[length_pattern]; // 初始化next数组
compute_next(pattern, length_pattern, next);
// 输出next数组
printf("Next array for pattern '%s':\n", pattern);
for (int i = 0; i < length_pattern; ++i) {
printf("%d ", next[i]);
}
return 0;
}
```
运行此程序时,用户需要输入一个字符串作为主串和一个模式串,然后会打印出模式串的next数组。注意,在实际应用中,你可能还需要处理输入的边界情况和错误检查。
阅读全文