字符串的存储结构

"本文详细介绍了串的两种存储方式:顺序存储和链式存储。顺序存储包括定长顺序存储和动态存储,其中动态存储使用''作为字符串结束标志。链式存储则采用块链式结构,提高存储密度。这两种方式各有优缺点,适用于不同的应用场景。"

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       从逻辑结构上讲,串是一种特殊形式的线性表,区别在于串的数据元素被限定为字符,线性表的存储方式有顺序表和链表,理论上都可以存储串,但是串的应用场景和基本操作与线性表有着很大的区别,决定了串不能照搬线性表的存储方式,它的存储方式结构具有自己的特点。与线性表类似,串也有两种存储方式:顺序串和块链。

1.串的顺序存储

串的顺序存储就是用一段地址连续的存储空间存储串的内容,在高级计算机语言中,实现串时一般采用顺序结构,在这种存储结构中,需要解决的问题主要有三个:

如何记录存储空间的首地址

如何记录串的长度

如何记录存储空间的大小

记录存储空间首地址比较简单,在C/C++语言中,数组的名称就是存储空间的首地址。串的长度可以在存储空间的第0号单元内,串的元素从1号单元开始存放,如下图所示:

由于存储长度为0号的存储单元只有1字节,因此这种存储方式的最大字符串长度只能到255,为方便处理,可以令存储空间的长度固定为255,因此这种存储方式也称为定长顺序存储,串的实际长度可以在这个固定长度的范围内随意设定,超过固定长度的串值被舍去,称为“截断”。

在串的定长顺序表示中,串的长度受到限制,只适合存储长度较短的字符串,为了解决这个问题,将串的长度用一个整型变量存储,如下图所示:

 用代码可表示为:

const int MAXSTRLEN=1024       //存储空间大小
struct SString
{

    unsigned char * cpString;    //存储空间首地址
    int maxStrlen;               //最大字符串长度,即存储空间大小
    int strLen;                  // 字符串长度
};

 但这种存储方式需要单独定义一个变量存储串长,便利性差,所以在C++语言中从用另一种方式,在串尾存储一个串中不会出现的特殊字符‘\0’作为终结符来表示字符串结束,串长是一个隐含值,不再直接存储。

用代码表示为:

const int MAXSTRLEN=1024       //存储空间大小
struct SString
{

    unsigned char * cpString;    //存储空间首地址
    int maxStrlen;               //最大字符串长度,即存储空间大小
};

在实现时需要将符号常量MAXSTRLEN赋值给maxStrlen,cpString用new操作符或者malloc( )函数动态分配内存

2.串的链式存储

作为一种特殊的线性表,串也可以采用链表的方式进行存储,由于串的数据元素是字符,因此在串的链表结构中,数据域data为一个字符。

每个链表结点的数据域为1字符,占用为1字节,而指针域占用内存4字节,链表结点的存储密度 仅为0.2,空间利用率较低。因此用链表存储串时,通常在一个结点中存放的不是一个字符,而是若干字符,这种存储方法称为串的块链式存储结构。

块链中每个结点的数据域用一段地址连续的存储单元存储多个数据元素,具有顺序存储结构的特点(块内),不同结点之间,地址不一定连续,通过指针来指示前驱后继关系,具有链表存储结构的特点(块间),块链的存储密度比串的单链表存储密度高。

参考书籍:《数据结构与算法--C++实现》   慕晨  安毅生 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值