#define MaxLen <最大串长>; /*定义能处理的最大的串长度*/ typedef struct { char str[MaxLen]; /*定义可容纳MaxLen个字符的字符数组*/ int curlen; /*定义当前实际串长度*/ } SString; int StrIndex (SString s, SString t, int pos) /* t为非空串。若主串s中第pos个字符之后存在与t相等的子串,则返回第一个这样的子串在s中的位置,否则返回-1。*/ { if (pos> 0) { SString sub; n = StrLength(s); m = StrLength(t); i = pos; while ( i <= n-m+1) { sub=SubStr (s, i, m); if (StrCompare (sub,t) != 0) ++i ; else return i ; /* 返回子串在主串中的位置*/ } } return -1; /* s中不存在与t相等的子串*/ }
时间: 2024-02-10 15:30:16 浏览: 89
这段代码是一个 C 语言程序,主要实现了一个字符串匹配的算法。具体来说,代码中定义了一个结构体 SString,包含一个字符数组 str 和一个整数 curlen,用于表示一个字符串及其长度。然后定义了一个函数 StrIndex,该函数接受三个参数:主串 s、子串 t、和起始位置 pos,返回子串在主串中的位置。如果主串中不存在与子串相等的子串,则返回 -1。
函数的实现过程是,从主串的 pos 位置开始,逐一取出长度为子串 t 长度的子串,与子串 t 进行比较,如果相等则返回该子串在主串中的位置,否则继续向后移动一个位置,直到主串子串比较完为止。
相关问题
#define _CRT_SECURE_NO_WARNINGS //顺序存储的栈 实现文件 ///////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct SeqStack { int* data; // 数据元素指针 int top; // 栈顶元素编号 int max; // 最大节点数 }SeqStack; /*创建一个栈*/ SeqStack* SS_Create(int maxlen) { SeqStack* ss = (SeqStack*)malloc(sizeof(SeqStack)); ss->data = (int*)malloc(maxlen * sizeof(int)); ss->top = -1; ss->max = maxlen; return ss; } /*释放一个栈*/ void SS_Free(SeqStack* ss) { free(ss->data); free(ss); } /*清空一个栈*/ void SS_MakeEmpty(SeqStack* ss) { ss->top = -1; } /*判断栈是否为满*/ int SS_IsFull(SeqStack* ss) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ if (ss->top == ss->max - 1) return 1; return 0; /******END******/ } /*判断栈是否为空*/ int SS_IsEmpty(SeqStack* ss) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ if (ss->top == -1) return 1; return 0; /******END******/ } /*将x进栈,满栈则无法进栈(返回0,否则返回1)*/ int SS_Push(SeqStack* ss, int x) { //务必看清楚使用的是C语言还是C++喔 /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ /******END******/ } /*出栈,出栈的元素放入item,空栈则返回0,否则返回1*/ int SS_Pop(SeqStack* ss, int* item) { /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ /******END******/ } /*从栈底到栈顶打印出所有元素*/ void SS_Print(SeqStack* ss) { if (SS_IsEmpty(ss)) { printf("stack data: Empty!\n"); return; } printf("stack data (from bottom to top):"); int curr = 0; while (curr <= ss->top) { printf(" %d", ss->data[curr]); curr++; } //printf("\n"); } int main() { int max; scanf("%d", &max); SeqStack* ss = SS_Create(max); char dowhat[100]; while (1) { scanf("%s", dowhat); if (!strcmp(dowhat, "push")) { int x; scanf("%d", &x); SS_Push(ss, x); } else if (!strcmp(dowhat, "pop")) { int item; SS_Pop(ss, &item); } else { break; } } SS_Print(ss); SS_Free(ss); }
这是一个顺序存储的栈的实现文件,其中包含了常用的栈操作函数。下面是缺失的两个函数的实现:
1. SS_Push:将元素x进栈,满栈则无法进栈(返回0,否则返回1)
```c
int SS_Push(SeqStack* ss, int x) {
if (SS_IsFull(ss)) {
return 0; // 栈已满,无法进栈
}
ss->top++;
ss->data[ss->top] = x;
return 1;
}
```
2. SS_Pop:出栈,出栈的元素放入item,空栈则返回0,否则返回1
```c
int SS_Pop(SeqStack* ss, int* item) {
if (SS_IsEmpty(ss)) {
return 0; // 栈为空,无法出栈
}
*item = ss->data[ss->top];
ss->top--;
return 1;
}
```
此外,程序中还包含了主函数,可以读入用户输入的命令并进行相应的操作。最后,调用 SS_Print 函数将栈中的元素从底部到顶部打印出来。
改进一下#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);
}
```
阅读全文