数据结构(12.2)串之定长顺序串

本文详细介绍了定长顺序串的概念及其在内存中的表示,包括初始化、赋值、比较、连接、插入与删除、定位和替换等基本操作。通过具体的步骤解释了这些操作如何实现,同时讨论了在定长顺序串限制下如何处理特殊情况,如空间不足等。

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

前言

定长顺序串是串顺序存储结构的一种,顺序存储结构意味着它所占的内存空间是一块连续的,而定长意味着空间大小在串创建之初就确定了,无法动态分配内存,如果有超过的部分只能舍去。在这里我们使用尾部加“ \0 ”的方法来表示串结束,因此实际要开辟的空间是 MAXSTRLEN + 1。

定长顺序串的初始化

我们使用数组来保存串,因此直接定义一个字符数组作为串。

#define u_char unsigned char
typedef u_char SString[MAXSTRLEN+1];

串的初始化就是将这个字符数组初始化为空串,在数组首位添加" \0 "即可

void InitString(SString s){
   
   
    s[0] = '\0';
}

定长顺序串的赋值

在这里赋值的意思是,我们有一个char *类型的字符串,将它转化为我们自定义的SString类型,就是给SString进行赋值。

因此赋值包括三个步骤:

1.计算出char *类型的字符串的长度

2.判断长度是否超出定义的最大长度,如果超出则需要截断超出的部分

3.依次取出char *中的每一个字符,然后保存到SString数组中

void StrAssign(SString s,char *str){
   
   
    //1.求要赋值的字符串的长度
    int len = (int)strlen(str);
    
    //2.比较是否超出最大长度
    if (len > MAXSTRLEN) {
   
   
        //超出,只能赋值到最大长度的位置
        len = MAXSTRLEN;
    }
    
    //3.依次赋值
    for (int i = 0; i < len; i ++) {
   
   
        s[i] = str[i];
    }
    //标记字符串结束
    s[len] = '\0';
}

在最后不要忘记添加“ \0 ”表示字符串结束

定长顺序串的比较

比较的意思是,将两个字符串对应位置的字符的ASCII码依次进行比较,假如一致则继续比较,不一致则直接输出结果。例如字符串abc和字符串acb,先将a与a比,一样则b与c比,因为c的ASCII码比b大,认为acb大于abc,输出结果。只有每个字符都相等时,才意味着两个字符串相等。

因为是直接比较ASCII码,我们也可以这样设计:定义result等于0,然后依次取出字符直接相减,假如a字符大于b字符,则结果大于0;若小于则小于0,一致则等于0。在大于或小于0时直接退出循环,等于0时则继续取下一个字符,直到两个字符串都结束为止。

int StrCompare(SString s,SString t){
   
   
    int result = 0;
    //判断字符串是否结束
    while (*s != '\0' || *t != '\0') {
   
   
        result = *s - *t;
        if (result != 0) {
   
   
          //如果有结果则直接退出循环
            break;
        }
        s ++;
        t ++;
    }
    return result;
}

定长顺序串的连接

连接是指将串s2接到串s1的尾部,用串t来保存。由于是定长顺序串,需要考虑到串t能否装得下的问题。

一共有三种情况:

1.s1和s2都装得下,直接装即可

2.只装得下s1和s2的一部分,s2需要截断

3.只装得下s1(s1的长度等于MAXSTRLEN),只存s1即可

需要针对不同的情况进行不同处理。

void StrConcar(SString t,SString s1,SString s2){
   
   
    int len1 = StrLength(s1);
    int len2 = StrLength(s2);
    
    if (len1 + len2 <= MAXSTRLEN) {
   
   
        //装得下两个子串->直接装入
        for (int i = 0; i < len1; i ++) {
   
   
            t[i] = s1[i];
        }
        for (int j = 0; j < len2; j ++) {
   
   
            t[len1+j] = s2[j];
        }
        t[len1+len2] = '\0';
    }else if(len1 < MAXSTRLEN){
   
   
        //只装得下s1和部分s2->s2需要截断
        for (int i = 0; i < len1; i ++) {
   
   
            t[i] = s1[i];
        }
        for (int j = 0; j < MAXSTRLEN - len1; j ++) {
   
   
            t[len1+j] = s2[j];
        }
        //最后一个位置设为'\0'表示结束
        t[MAXSTRLEN] = '\0';
    }else{
   
   
        //只装得下s1
        for (int i = 0; i < len1; i ++) {
   
   
            t[i] = s1[i];
        }
        t[MAXSTRLEN] = '\0';
    }
}

当然还有另一种写法:先将s1存入t中,然后判断t剩余空间的情况,如果能存下s2则直接存入,否则将s2截断后存入。

定长顺序串的插入与删除

定长顺序串的插入指的是,将串t从pos的位置插入到串s中。这同样要考虑s串能否装得下的问题,假如装不下则需要截断串t,然后从pos位置起的字符往后挪t_len(实际能插入的长度)位,再将t插入。

img_1

删除指的是,在串s中从pos的位置开始删除长度为len的子串。首先需要判断是否越界的问题,然后直接从pos位置起将len长度后的字符直接往前挪即可。

img_2

定长顺序串的定位

定位指的是,在串s中从pos位置起寻找子串t,如果找到则返回其第一个字符在s串的位置。这个方法返回的是第一个子串t的位置,假如后续还有其他子串t是无法找到的。

这其中涉及到字符串的匹配算法,比较复杂,为了实现的方便我们直接使用BF算法:从pos位置起遍历串s,与串t的首个字符开始比较,假如一致则串s和串t都移到下一位,继续比较下一个字符。当有不一致时,串t需要回溯到起始位置,而串s要回溯到与串t开始相等的位置,并且移到下一位,继续和串t的首个字符比较。

int StrIndex(SString s,SString t,int pos){
   
   
    //标记s串的位置
    int i = pos;
    //标记t串的位置
    int j = 0;
    
    while 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值