1.前情回顾:
2.串的定义
注意这里的字符是任意字符:包括特殊字符和空格
2.1串的相关术语
2.2分析如下:
- 子串与主串 可以类比 子集与集合的关系
且空串也是子串的一种
-
注意空格串与空串的区别
-
位置是从1开始设定的(第一个位置开始)
-
案例剖析
2.3串相等
注意:
3. 串的类型定义
- 1.这里注意:index:即字符串的定位操作十分重要
(若主串S存在与串T值相同的子串,则返回它在主串S中第一次出现的位置)
4.串的 顺序存储 与 链式存储
4.1串的顺序存储
一般分为静态数组存储,动态数组存储;两者都可以,但静态数组更加常见,所以本篇着重介绍静态数组的存储方式。
4.1.1三种顺序存储的方法:
- 由于一个char类型8bit,如果使用一个char变量来表示数组长度,则只能表示0~256这个区间
方案四较为常用
代码如下:
//1.串的顺序存储:
#define MAXSIZE 255//预定义最大串长为255
//1.串类型定义(静态数组)
typedef struct
{
char ch[MAXSIZE+1];//每个空间存储一个字符
//这里加1的目的是,串的有效元素要从下标1开始存起,方便管理,长度最大仍然为255
int length;//串的实际长度
}sstring;
//sstring:结构体别名,用来定义串
4.2串的链式存储
- 第一种方案:每个结点存1个字符,不建议使用,存储密度太低
//2.串的链式存储(每个结点存1个字符)
//存储密度低,不建议使用
typedef struct StringNode
{
char ch;//每个数据域存储一个字符
struct StringNode * next;//串的指针域
}stringNode,*string;
//stringNode:结构体别名,用来定义串结点
//string:结构体指针别名,用来定义串结点指针
- 优化后的方案:块链结构,即一个数据域可以存储多个字符,其中块的大小可以自己定义,提高了存储密度
//2.串的链式存储(每个结点存多个字符)
#define CHUNKSIZE 80//块的大小可由用户定义
//<1>串的结点结构定义
typedef struct Chunk
{
char ch[CHUNKSIZE];//块中存储的字符数组
struct Chunk* next;
}Chunk;
//<2>串的定义
typedef struct
{
Chunk* head, * tail; //串的头指针和尾指针
int curlen; //串的当前长度
}LString; // 字符串的块链结构
//LString:用来定义一个整串
由于80个空间的块链不好表示,故以四个char来表示: