C语言实现串的基本操作
导读
大家好!很高兴又和大家见面啦!!!
在上一篇内容中,我们详细介绍了串的一些基本概念与重要术语,并提到了串的三要素——逻辑结构、存储结构和数据的运算。从这个介绍中,我们对串有了更加深刻的认知——串也是一种线性表。
在上一篇的末尾,我们还简单介绍了一下串的一些基本操作:赋值、复制、判空、比较、求串长、求子串、串联接、定位、清空和销毁。为了能够更加深刻的理解串和对应的基本操作的同时还能提高自身编程能力,我们将会在今天的内容中通过C语言来逐一实现这些基本操作。下面我们就来进入今天的正题吧……
一、串的存储结构
串作为一种线性表,它的存储结构同样是有顺序存储和链式存储两种存储方式。为了更好的理解串的不同存储方式,我们首先来复习一下内存分区的相关内容;
1.1 内存区域的划分
在内存空间中有三个存储区域的划分——栈区、堆区和静态区。如下所示:
我们之前介绍的静态顺序表它在内存空间中申请的实际上是栈区上的空间,而动态顺序表和链表申请的则是堆区上的空间。堆区的内容空间有一个特点——内存需要手动分配,且手动释放,或者等程序结束时操作系统自动回收。
串在内存中同样也能够向栈区和堆区申请空间,如果对其进行细致的划分,我们可以将串的存储结构分为三类:
- 在栈区的顺序存储:定长顺序存储
- 在堆区的顺序存储:堆分配存储
- 在堆区的链式存储:块链存储
下面我们就来分别介绍一下这三类存储。
1.2 定长顺序存储
定长顺序存储类似于线性表的顺序存储,都是在栈区申请一块连续的存储单元存储串中的字符。它对应的数据类型我们则可以参照静态顺序表的数据类型进行定义,如下所示:
代码语言:javascript复制//定长顺序存储表示
#define MAXSIZE 255//串的最大长度
typedef struct StackString {
char ch[MAXSIZE];//存储字符的字符数组
int length;//串的实际长度
}SString;//重命名后的数据类型名
和顺序表一样,在定长顺序存储中,串的实际长度只能小于或等于串的最大长度,且在创建完定长顺序存储的串后,串的最大长度不能被修改。当串的实际长度超过串的最大长度时,超过预定义长度的串值会被舍去,这个过程称为截断。如下所示:
1.2.1 串长的表示方式
在串中,串长的表示有两种方式:
- 通过整型变量
length
来记录串长。
- 优点:我们可以在创建字符串的同时能够明确知道当前字符串的长度;
- 缺点:在输出字符串时我们需要通过串长对串中的元素进行依次输出;
- 通过在串的末尾添加字符串结束标志
'