从有序顺序表中删除其值在给定值s与t之间(要求s 有序顺序表如无特殊说明,一般指递增有序 先找到值大于等于s的第一个元素,然后找值大于t的第一个元素,将后面的元素前移覆盖待删除元素序列 删除元素不包括s和t 为什么是这个区间? 考虑以下情况: 区间 [j, L.length)包括从位置 j 到顺序表末尾的所有元素。这些元素需要被保留,因为它们不在要删除的范围 [s, t] 内。 区间 [i, L.length-(j-i))表示将上述元素移动到的新位置。这个区间的起始位置是 i,这是因为 i 是在 [s, t] 范围内找到的第一个元素的位置,即从这里开始的元素需要被删除或覆盖。 通过设置新的顺序表长度为 i 的值(即移动完成后的最后一个元素的索引加一),我们有效地切除了数组尾部的多余部分,这部分现在包含了重复的、不再需要的数据。bool del(SqList &L, int s, int t) {
int i, j;
if (s >= t || L.length == 0) {
return false;
}
// 找到第一个大于等于s的元素的位置
for (i = 0; i < L.length && L.data[i] < s; i++);
// 若没有找到大于等于s的元素或遍历到末尾,则返回false
if (i >= L.length) {
return false;
}
// 找到第一个大于t的元素的位置
for (j = i; j < L.length && L.data[j] <= t; j++);
// 将[j, L.length)区间的元素向前移动到[i, L.length-(j-i))区间
for (; j < L.length; i++, j++) {
L.data[i] = L.data[j];
}
// 更新顺序表的长度
L.length = i;
return true;
}
转载请注明来自码农世界,本文标题:《数据结构-线性表-应用题-2.2-4》
百度分享代码,如果开启HTTPS请参考李洋个人博客
还没有评论,来说两句吧...