严蔚敏《数据结构》(C语言版)【教材精讲+考研真题解析】讲义与视频课程【36小时高清视频】
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.2 串的表示和实现

视频二维码(扫码观看)

串是一种特殊的线性表,其存储表示和线性表类似,但又不完全相同。串的存储方式取决于将要对串所进行的操作。串在计算机中有3种表示方式:

定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。

堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分配的。

块链存储方式:是一种链式存储结构表示。

一、串的定长顺序存储表示

定长顺序存储结构:直接使用定长且存储单元地址连续的字符数组来定义,数组的上界预先确定。

定长顺序存储结构定义为:

串的实际长度可在预定义长度的范围内随意,超过预定义长度的串值则被舍去,称之为“截断”。

串长表示方法:

以下标为0的数组分量存放串的实际长度;

在串值后面加一个不计入串长的结束标记字符,如C语言中以“\0”表示串值的终结。

顺序存储结构的弊病:

实现串操作的时间复杂度取决于参与操作的字符序列的长度。

如果在操作中出现串值序列的长度超过上界时,用约定的截尾法处理,输出结果错误。

二、堆分配存储表示

系统在程序执行过程中动态分配地址连续的存储空间供串使用。C语言中,这个存储空间称为“堆”,通过动态存储分配函数malloc()和free()来管理。

特点是:仍然以一组地址连续的存储空间来存储字符串值,但其所需的存储空间是在程序执行过程中动态分配,故是动态的,变长的。

串的堆式存储结构的类型定义:

堆分配存储结构特点:

顺序存储处理方便

操作中对串长又没有任何限制

应用程序处理串时常使用。

三、串的块链存储表示

串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结点的构成是:

data域:存放字符,data域可存放的字符个数称为结点的大小;

next域:存放指向下一结点的指针。

若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每个结点存放若干个字符,这种结构称为块链结构。如图4-1是块大小为3的串的块链式存储结构示意图。

图4-1 串的块链存储结构示意图

串的块链式存储的类型定义:

#define BLOCK_SIZE 4//可由用户定义的大小
typedef struct Chunk
{
    char ch[BLOCK_SIZE];
    struct Chunk *next;
}Chunk;
typedef struct
{
    Chunk *head,*tail;/*头、尾指针*/
    int Strlen;/*当前长度*/
}LString;

块链式存储特点:

对串进行操作时,只需要从头向尾顺序扫描即可,则对串值不必建立双向链表。设尾指针的目的是为了便于进行联结操作,但应注意联结时需处理第一个串尾的无效字符。

结点大小的选择直接影响着串处理的效率。

不如前两种存储结构灵活,它占用存储量大且操作复杂。