1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-07 04:44:02 +08:00
Files
CS408/Code/sequence_string.h
Didnelpsun ae6008c306 更新串
2021-04-23 23:17:50 +08:00

62 lines
1.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "head.h"
// 静态顺序串
typedef struct {
char data[MAXSIZE];
// 串长
int length;
} StaticSequenceString;
// 动态顺序串
typedef struct {
char* data;
int length;
} DynamicSequenceString;
// 求静态顺序子串
int SubStaticSequenceString(StaticSequenceString string, StaticSequenceString *substring, int index, int length) {
// 如果子串越界
if (index + length > string.length) {
printf("StaticSequenceString:子串范围越界!");
return 1;
}
for (int i = 0; i < length; i++) {
substring->data[i] = string.data[index + i];
}
substring->length = length;
return 0;
}
// 对比静态顺序字符串
int CompareStaticSequenceString(StaticSequenceString string1, StaticSequenceString string2) {
for (int i = 0; i <= string1.length && i <= string2.length; i++) {
if (string1.data[i] != string2.data[i]) {
return string1.data[i] - string2.data[i];
}
}
// 如果扫描过的所有字符都相同,则长度长的字符串更长
return string1.length - string2.length;
}
// 在静态顺序字符串中定位子串
// 如果主串中存在与子串相同的子串,则返回在主串中第一次出现的位置,否则返回-1
int LocateStaticSequenceString(StaticSequenceString mainstring, StaticSequenceString substring) {
int i = 0;
// 用于暂存子串
StaticSequenceString temp;
while (i < mainstring.length - substring.length + 1) {
// 从主串切割下来与子串相同长度的子串
SubStaticSequenceString(mainstring, &temp, i, substring.length);
// 如果切割下来的子串与子串不相等就后移一位再切割子串
if (CompareStaticSequenceString(substring, temp) != 0) {
i++;
}
// 否则返回当前的索引
else {
return i;
}
}
return -1;
}