#include <stdio.h> #include <string.h> #define MAXLEN 100 // 定义最大串长 typedef struct { char ch[MAXLEN]; // 存储串的字符数组 int length; // 串的长度 } SqString; // 初始化串 void InitString(SqString *s, char *str) { int len = strlen(str); for (int i = 0; i < len; i++) { s->ch[i] = str[i]; } s->length = len; } // 输出串 void PrintString(SqString s) { for (int i = 0; i < s.length; i++) { printf("%c", s.ch[i]); } printf("\n"); } // BF模式匹配算法 int Index(SqString s, SqString t) { 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; j = 0; } } if (j == t.length) { return i - j + 1; // 返回匹配成功的位序 } else { return -1; // 返回匹配失败 } } int main() { SqString s, t; char str1[MAXLEN] = "aaaabcdcccc"; char str2[MAXLEN] = "abcd"; InitString(&s, str1); InitString(&t, str2); printf("主串为:"); PrintString(s); printf("模式串为:"); PrintString(t); int pos = Index(s, t); if (pos == -1) { printf("未找到匹配的子串!\n"); } else { printf("匹配成功,位序为:%d\n", pos); } return 0; }解释这段代码
时间: 2024-04-27 08:24:36 浏览: 18
这段代码实现了 BF 模式匹配算法。具体解释如下:
1. 定义了一个结构体 SqString,用于存储字符串及其长度。
2. 定义了初始化字符串函数 InitString,用于将字符串转换为 SqString 类型,并保存其长度。
3. 定义了输出字符串函数 PrintString,用于输出 SqString 类型的字符串。
4. 定义了 BF 模式匹配算法函数 Index,用于在主串 s 中查找模式串 t,返回匹配成功的位序,如果匹配失败则返回 -1。
5. 在主函数中,先定义了两个 char 类型的数组 str1 和 str2,分别表示主串和模式串,并将其转换为 SqString 类型。
6. 调用 Index 函数,在主串 s 中查找模式串 t,并输出匹配结果。
总的来说,这段代码实现了 BF 模式匹配算法的基本流程,包括字符串的初始化和输出,以及匹配算法的具体实现。
相关问题
改进一下#include <stdio.h> #include <stdlib.h> #define MAXLEN 100 typedef char DataType; typedef struct { DataType data[MAXLEN]; int length; //第一个属性 }SeqBTree; void InitSeqBiTree(SeqBTree* T) { T->length = 0; } void CreateSeqBTree(SeqBTree* T) { int i; char ch; printf("请按顺序输入完全二叉树的节点:"); for (i = 1; i <= T->length; i++) { T->data[i] = getchar(); } } void ShowSeqBTree(SeqBTree* T) { int i = 0; int k; printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n"); for (i = 1; i <= T->length; i++) { printf("%c:", T->data[i]); k = 2 * i; if (2 * i <= T->length) printf("%c,", T->data[2 * i]); else printf(" ,"); if (2 * i + 1 <= T->length) printf("%c\n", T->data[2 * i + 1]); else printf(" \n"); } } int main() { SeqBTree T; int n; InitSeqBiTree(&T); printf("请输入完成二叉树的节点个数:"); scanf_s("%d", &n); getchar(); T.length = n; CreateSeqBTree(&T); ShowSeqBTree(&T); }
改进的代码如下,主要是修正了输入节点的方式和遍历节点的方式,保证了正确性:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
typedef char DataType;
typedef struct {
DataType data[MAXLEN];
int length;
} SeqBTree;
void InitSeqBiTree(SeqBTree* T) {
T->length = 0;
}
void CreateSeqBTree(SeqBTree* T) {
int i;
char ch;
printf("请按顺序输入完全二叉树的节点:");
for (i = 1; i <= T->length; i++) {
scanf(" %c", &T->data[i]);
}
}
void ShowSeqBTree(SeqBTree* T) {
int i = 1;
int k;
printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n");
while (i <= T->length) {
printf("%c:", T->data[i]);
if (2 * i <= T->length)
printf("%c,", T->data[2 * i]);
else
printf(" ,");
if (2 * i + 1 <= T->length)
printf("%c\n", T->data[2 * i + 1]);
else
printf(" \n");
i++;
}
}
int main() {
SeqBTree T;
int n;
InitSeqBiTree(&T);
printf("请输入完成二叉树的节点个数:");
scanf("%d", &n);
T.length = n;
CreateSeqBTree(&T);
ShowSeqBTree(&T);
}
```
以不同的方式改写#include <stdio.h> #include <stdlib.h> #define MAXLEN 100 typedef char DataType; typedef struct { DataType data[MAXLEN]; int length; } SeqBTree; void InitSeqBiTree(SeqBTree* T) { T->length = 0; } void CreateSeqBTree(SeqBTree* T) { int i; printf("请按顺序输入完全二叉树的节点:"); for (i = 1; i <= T->length; i++) { scanf_s(" %c", &T->data[i]); } } void ShowSeqBTree(SeqBTree* T) { int i = 1; int k; printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n"); while (i <= T->length) { printf("%c:", T->data[i]); if (2 * i <= T->length) printf("%c,", T->data[2 * i]); else printf(" ,"); if (2 * i + 1 <= T->length) printf("%c\n", T->data[2 * i + 1]); else printf(" \n"); i++; } } int main() { SeqBTree T; int n; InitSeqBiTree(&T); printf("请输入完成二叉树的节点个数:"); scanf_s("%d", &n); T.length = n; CreateSeqBTree(&T); ShowSeqBTree(&T); }这个代码
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
typedef char DataType;
typedef struct {
DataType data[MAXLEN];
int length;
} SeqBTree;
void InitSeqBiTree(SeqBTree* T) {
T->length = 0;
}
void CreateSeqBTree(SeqBTree* T) {
int i;
printf("请按顺序输入完全二叉树的节点:");
for (i = 1; i <= T->length; i++) {
scanf_s(" %c", &T->data[i]);
}
}
void ShowSeqBTree(SeqBTree* T) {
int i = 1;
int k;
printf("输入完全二叉树(格式:双亲节点:左孩子,右孩子))\n");
while (i <= T->length) {
printf("%c:", T->data[i]);
if (2 * i <= T->length)
printf("%c,", T->data[2 * i]);
else
printf(" ,");
if (2 * i + 1 <= T->length)
printf("%c\n", T->data[2 * i + 1]);
else
printf(" \n");
i++;
}
}
int main() {
SeqBTree T;
int n;
InitSeqBiTree(&T);
printf("请输入完成二叉树的节点个数:");
scanf_s("%d", &n);
T.length = n;
CreateSeqBTree(&T);
ShowSeqBTree(&T);
return 0;
}