顺序串的插入和删除
字符串:由零个或多个字符组成的有限序列
1.顺序串
用一组地址连续的储存单元来储存串的字符序列
1.1数据结构
typedef struct {
char ch[MaxSize];
int len;//字符串的长度
}SString;
2.插入
问题:在串S中第pos位置前插入串T
2.1算法思想
-
判断插入位置pos是否正确
-
判断插入之后的总长度是否小于 MaxSize-1 (字符串最后一位是\0)
-
如果总长度小于MaxSize-1
-
在串S中腾出T.len的空间 方便插入操作
-
插入串T
-
改变S.len
-
-
如果总长度大于MaxSize-1
-
情况一:总长度大于MaxSize-1,且T全部插入到S中
-
让字符串数组最后一个元素为\0
-
在串S中腾出空间
-
插入串T
-
改变S.len
-
-
情况二:总长度大于MaxSize-1,但T有部分字符要被舍弃
-
让字符串数组最后一个元素为\0
-
直接从插入位置开始插入串T,直到将S的剩余空间占满
-
-
-
改变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算法思想
-
判断删除位置和删除长度是否合法
-
利用循环 删除字符
-
改变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.附上原文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通