顺序串的插入和删除

字符串:由零个或多个字符组成的有限序列

1.顺序串

用一组地址连续的储存单元来储存串的字符序列

1.1数据结构

typedef struct {
    char ch[MaxSize];
    int len;//字符串的长度
}SString;

2.插入

问题:在串S中第pos位置前插入串T

2.1算法思想

  1. 判断插入位置pos是否正确

  2. 判断插入之后的总长度是否小于 MaxSize-1 (字符串最后一位是\0)

  3. 如果总长度小于MaxSize-1

    1. 在串S中腾出T.len的空间 方便插入操作

    2. 插入串T

    3. 改变S.len

  4. 如果总长度大于MaxSize-1

    1. 情况一:总长度大于MaxSize-1,且T全部插入到S中

      1. 让字符串数组最后一个元素为\0

      2. 在串S中腾出空间

      3. 插入串T

      4. 改变S.len

    2. 情况二:总长度大于MaxSize-1,但T有部分字符要被舍弃

      1. 让字符串数组最后一个元素为\0

      2. 直接从插入位置开始插入串T,直到将S的剩余空间占满

  5. 改变S.len

2.2算法设计

//在S的第i个位置后面插入T
bool StrInsert(SString &S,int pos,SString &T) 
{
    int i, j, k;
    if (pos < 1||pos > S.len) //插入位置pos不对
    {
        return false;
    }
​
    if (S.len + T.len <= MaxSize - 1) //插入之后总长度小于 maxsize-1
    {
        for ( i = S.len; i > pos - 2; i--) //为插入串 腾空间
        {
            S.ch[i + T.len] = S.ch[i];
        }
        
        for (i  = 0; i < T.len; i++) //插入串
        {
            S.ch[i+pos-1] = T.ch[i];
        }
        S.len = S.len+T.len;
    }
    
    else if (pos + T.len <= MaxSize - 1) //插入后 总长度大于maxsize-1 但T全部插入
    {
        S.ch[MaxSize - 1] = '\0';
​
        for (i = MaxSize - 2; i > pos + T.len - 2; i--) 
        {
            S.ch[i] = S.ch[i-T.len];
        }
​
        for (i = 0; i < T.len; i++)
        {
            S.ch[i + pos - 1] = T.ch[i];
        }
​
        S.len = MaxSize - 1;
    }
    
    else //插入后串长大于maxsize 且T中部分字符要舍弃
    {
        S.ch[MaxSize - 1] = '\0';
        for (i = 0; i < MaxSize - pos; i++) 
        {
            S.ch[i + pos-1] = T.ch[i];
        }
        S.len = MaxSize - 1;
    }
    return true;
}

3.删除

问题描述:在S串中删除第pos个位置开始的len个字符

3.1算法思想

  1. 判断删除位置和删除长度是否合法

  2. 利用循环 删除字符

  3. 改变S.len

3.2算法设计

//删除串S第pos个位置开始的len个字符
bool StrDel(SString &S,int pos,int len) 
{
    if (pos<0 || pos>S.len || pos + len-1 > S.len) 
    {
        return false;
    }
    for (int i = pos - 1 + len; i < S.len+1; i++) 
    {
        S.ch[i - len] = S.ch[i];
    }
​
    S.len = S.len - len;
    return true;
}

4.附上原文件

https://files-cdn.cnblogs.com/files/blogs/769155/%E4%B8%B2cpp.rar?t=1665540056

 

posted @   骆宾王  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示