串是一种特殊的线性表,所以先得搞清楚线性表的顺序、链式存储,在其基础上便可以清楚分析特殊线性表的存储结构:栈、队列、串
顺序:结构体里面定义一个数组+长度等辅助信息
链式:结构体里面定义一个元素数据类型+结构体指针
顺序串和链串没什么分析的,仅给出定义,主要分析索引存储下的串
顺序串:
typedef struct {
char ch[MAX];
int len;
}seqSting;
链串:
typedef struct linkNode {
char data;
linkNode *next;
}linkString;
linkString *s;
索引串:
链式:串名+头指针
顺序:串名+头指针+末地址
末地址:串值末尾结束地址 or 串长
下面的都是基于顺序的索引串定义
注意区分索引与链串的区别:
链串:指针类型linkNode *next
,代表这个指针类型是结构体node型,可以连接两个linkNode
,它不可以直接找到内存中的串值,而是顺着链条,一个一个的往下才可以找到
索引:指针类型char *stadr
,其实这个可以不看作指针,而直接是取字符char
地址,根据这个地址就可以找到串值在内存中的地址
还有这里的第三个带标志位的索引串,它的前提是串值空间大小=指针域空间大小,所以可以使用union
来定义
// 带长度的索引串
typedef struct {
char name[MAX];
int length;
char *stadr; // 串第一个字符地址
}lenNode;
// 带末地址的索引串
typedef struct{
char name[MAX];
char *stadr, *enadr; // 串第一个和最后一个字符地址
}eNode;
// 带特征位的索引串
typedef struct {
char name[MAX];
int tag; // 标志位,区分当前是指针or串值
union
{
char *stadr; // 指针
char value[4]; // 串值,4代表串大小就为4,而指针空间也是4
};
};