从顺序表中删除其值在给定值s与t之间 (包含s和t,要求s<t) 的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。

题目描述:从顺序表中删除其值在给定值s与t之间 (包含s和t,要求s
// 删除顺序表 L 中闭区间 [s, t] 内的元素
bool DeleteS_T(SqList &L, int s, int t) {
    // 若顺序表为空或给定区间无效,则无法删除,返回 false
    if (L.length == 0 || s >= t)
        return false;

    // 记录待删除的元素个数
    int count = 0;

    // 遍历顺序表
    for (int i = 0; i < L.length; i++) {
        // 若元素位于给定区间内,增加待删除计数
        if (L.data[i] >= s && L.data[i] <= t)
            count++;
        else
            // 将不在区间内的元素向前移动 count 个位置
            L.data[i - count] = L.data[i];
    }

    // 更新顺序表长度,即删除区间内的元素
    L.length -= count;

    // 删除操作成功,返回 true
    return true;
}

若将条件改为有序顺序表中删除在s和t之前的元素,其他不变则:

bool DeleteST(SqList &L, int s, int t) {
    if (L.length == 0 || s >= t)
        return false;

    int i, j;
    
    // 找到第一个大于等于s的元素的位置i
    for (i = 0; i < L.length && L.data[i] < s; i++);

    // 找到第一个大于等于t的元素的位置j
    for (j = i; j < L.length && L.data[j] <= t; j++);

    // 将[j, L.length)范围内的元素向前移动i-j个位置
    for (; j < L.length; i++, j++)
        L.data[i] = L.data[j];

    // 更新顺序表的长度
    L.length = i;

    return true;
}

你可能感兴趣的:(线性表,数据结构)