1. 串的基本概念
字符串(String)是由零个或多个字符组成的有限序列。记为 S = ‘a1a2…an’(n>0)
其中,S是串的名字,用单引号括起来的字符序列是串的值,每个 ai(1<=i<=n)可以是字母、数字或其它字符。n是串中字符的个数,称为串的长度,n=0时的串称为空串。
子串:串中任意个连续的字符组成的子序列称为该串的子串。
主串:包含子串的串称为主串。
子串在主串中的位置:通常将字符在串中的序号称为该字符在串中的位置。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
串相等:当且仅当两个串的值相等时,称这两个串是相等的,即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。
串是一种特定的线性表,串的逻辑结构和线性表极为相似,其特定性仅在于串的数据对象限定为字符集。常用的实现方法有定长顺序串、堆串和块链串。
串的模式匹配(简单模式匹配算法、KMP算法)见:https://blog.csdn.net/weixin_51450101/article/details/122684649
2. 定长顺序串
定长顺序串是将串设计成一种静态结构类型,用一组地址连续的存储单元来存储串的字符序列。
2.1 代码+注释
# include<stdio.h>
# define MAXLEN 40
# define TRUE 1
# define FALSE 0
/*定长顺序串*/
/*定长顺序串的存储结构*/
typedef struct {
char ch[MAXLEN];
int len; //字符串长度
}SString;
/*定长顺序串初始化*/
void StrInit(SString* S) {
S->len = 0;
}
/*定长顺序串的创建*/
void StrCreate(SString* S) {
int n, i;
printf("字符串长度为:");
scanf("%d", &n);
printf("请输入字符串:");
for (i = 0; i < n; i++) {
scanf(" %c", &(S->ch[i]));
}
S->len = n;
}
/*插入*/
int StrInsert(SString* S, int pos, SString *t) {
//在串S中下标为pos的字符之前插入串t
int i;
if (pos < 0 || pos > S->len) //插入位置不合法
return FALSE;
if (S->len + t->len <= MAXLEN) {
//插入后串长<=MAXLEN
for (i = S->len + t->len - 1; i >= t->len + pos; i--)
S->ch[i] = S->ch[i - t->len]; //位置pos后的字符串后移
for (i = 0; i < t->len; i++)
S->ch[i + pos] = t->ch[i]; //将t串插入
S->len = S->len + t->len;
}
else if (pos + t->len <= MAXLEN) {
//插入后串长大于MAXLEN,但串t的字符序列可以全部插入
for (i = MAXLEN - 1; i > t->len + pos - 1; i--)
S->ch[i] = S->ch[i - t->len];
for (i = 0; i
本文介绍了串的基本概念,包括串的定义、子串、主串和相等的概念。接着详细讨论了三种串的存储结构:定长顺序串、堆串和块链串,分别给出了代码实现和运行结果。堆串通过动态分配内存存储串值,而块链串利用链表结构,以块的形式存储字符,实现了灵活的存储密度调整。
最低0.47元/天 解锁文章
的存储结构及基本运算(C语言)&spm=1001.2101.3001.5002&articleId=122668121&d=1&t=3&u=b218e4135b3f48508a8c066ae42ed5b2)
9732

被折叠的 条评论
为什么被折叠?



