数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。

  严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有一对一的逻辑关系,只不过,与之前所学的线性存储结构不同,串结构只用于存储字符类型的数据。

====串存储结构的具体实现

  存储一个字符串,数据结构包含以下3中具体存储结构;

    1.定长顺序存储:实际上就是用普通数组(又称静态数组)存储。

    2. 堆分配存储:用动态数组存储字符串。

    3.块链存储:用链表存储字符串。

===

  静态数组:长度是固定的。

  动态数组:使用malloc 和free函数动态申请和释放空间,动态数组的长度是可变的。

  串的定长顺序存储结构:可以简单地理解为采用固定长度的顺序存储结构来存储字符串,因此限定了其底层实现只能使用静态数组。

===

  串的堆分配存储,其具体实现方式是采用动态数组存储字符串。

  通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类存储到对应的区域。拿C语言来说,程序会将内存分为4个区域,分别为堆区,栈区、数据区、代码区。

  与其他区域不同,堆区的内存空间需要程序员手动使用malloc 函数申请,并且在不用后要手动通过free 函数将其释放。

  C语言中使用malloc 函数最多的场景是给数组分配空间,这类数组称为动态数组。

  例如:char *a = (char*) malloc(5*sizeof(char));

  此行代码创建了一个动态数组a,通过malloc 申请了5个char 类型大小的堆存储空间。

  动态数组相比普通数组(静态数组)的优势是长度可变,换句话说,根据需要动态数组可额外申请更多的堆空间。

===串的块链存储结构===

  串的块链存储,指的是使用链表结构存储字符串。

  本节实现串的块链存储使用的是无头节点的单链表。我们知道,单链表中的单强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。

  使用链表存储字符串,其最后一个节点的数据域不一定会被字符串全部占满,对于这种情况,通常会用‘#’或其他特殊字符将最后一个节点填满。