Files
2022-WangDao-CS-DS-Notes/4.2串的存储结构.md
2022-03-28 16:49:12 +08:00

2.8 KiB
Raw Blame History

串的存储结构

一、串的存储结构

顺序存储链式存储

二、串的顺序存储的实现方式

实现方式:静态分配动态分配,一般用动态分配

串的类型描述:

静态分配SString
#define MAXLEN 255;			 //定义最大长度
typedef struct{
    char ch[MAXLEN];         //“静态”的数组存数据,存字符
    int length;              //串的实际长度
}SString;
动态分配HString
typedef struct{
    char *ch;                //指向“动态”分配的串的基地址
    int length;              //顺序表的当前长度
}HString;

静态分配的顺序存储的串的优缺点

缺点:串的顺序存储的表长确定后无法修改,存满了就存不了了

动态分配的顺序表的优缺点:

优点:可以动态增加长度

缺点:动态增加长度中的迁移工作时间开销大

三、串的链式存储的实现方式

实现方式:不带头结点带头结点,一般用带头结点

不带头结点带头结点的类型描述相同,初始化和判空不同

串的类型描述:

分为:单个分配堆分配,一般用堆分配

单个分配存储密度低,堆分配存储密度高

单个分配:
typedef struct StringNode{
    char ch;                  //每个结点存1个字符
    struct StringNode *next;
}StringNode, *String;
堆分配:
typedef struct StringNode{
    char ch[4];                  //每个结点存4个字符
    struct StringNode *next;
}StringNode, *String;

四、串的上的操作

以静态分配的顺序串为主

求子串

//求子串
bool SubString(SString &Sub, SString S, int pos, int len){
    //子串范围越界
    if(pos+len-1 >S.length) return false;
    for(int i=pos; i<pos+len; i++){
        Sub.ch[i-pos+1] =S.ch[i];
    }
    Sub.length = len;
    return true;
}

字符串比较

//字符串比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。
int StrCompare(SString S, SString T){
    for(int i=1; i<S.length && T.length; i++){
        if(S.ch[i]!=T.ch[i]) return S.ch[i]-T[i];
    }
    //扫描过所有字符都相等,则长度更长的串更大
    return S.length-T.length;
}

定位操作

方法在S中依次按顺序取m长子串判断是否与T相同

//定位操作
int Index(SString S,SString T){
    int i = 1, n = StrLength(S), m = StrLength(T);
    SString sub;
    while(i < n-m+1){
        SubString(sub, S, i, m);
        if(StrCompare(sub, T) != 0) ++i;
        else return i; //返回子串在主串中的位置
    }
    return 0;          //S中不存在与T相同的子串
}