串的存储结构:
(1)顺序存储:
#define MAXSIZE 100//假设串可能的最大长度为100
typedef struct
{
char ch[MAXSIZE];//存放串值
int len;//串的长度
}seqstr;
顺序串的字符被依次存放在一片连续的单元中,由于一个字符占一个字节,所以顺序串中相邻的字符顺序存放在相邻的字节中
(2)链式存储:
typedef struct node
{
char data;
struct node* next;
}linkstr;
linkstr* S;
链串通常是由头指针唯一确定,这种结构便于进行插入和删除运算,但存储空间利用率较低。
(3)索引存储
在索引存储中,除了存放串值外,还要建立一个索引表。
链式存储方式下,索引表中要含有串名和存储串值的链表的头指针;
顺序存储方式下,索引表中要含有串名和指示串存放位置的起始地址的首指针及指示串值存放结束的末地址(末地址可以是串值末尾结束地址、串长等)。
1.带长度的索引表
typedef struct
{
char name[MAXSIZE];//串名
int length;//串长
char* start;//串存放的起始地址
}lenindex;
2.带末指针的索引表
typedef struct
{
char name[MAXSIZE];
char* start, * end;//用末指针end来代替长度length
}endindex;
3.带特征位的索引表
当串值只需要一个指针域的空间就能存储时,可将串值放在一个start域中,这样做的好处是既节约了存储空间,又提高了查找速度。
需要增加一个特征位tag来说明start域中是指针还是串值
typedef struct
{
char name[MAXSIZE];
int tag;//特征位
union {
char* start;
char value[4];
}val;
}tagindex;
索引存储中串的动态存储分配
——一个较大的向量store[MAXSIZE]表示可供动态分配用的连续的存储空间,使用一个指针(free)指示尚未分配的存储空间的起始位置,该指针初值为0;
——程序执行过程中每产生一个新串,就从free指针起进行动态分配,同时在索引表中建立一个相应的结点,在该结点中填入新串的名字、分配到的串值空间的起始位置、串值的长度等信息,随后修改free指针。