跳到正文

2.2.2 顺序表的插入删除、顺序表的查找

40 分钟

2.2.2 顺序表插入、删除与查找:先守边界,再决定移动方向

在位序 插入新元素,原第 至第 个元素都要右移。为了不覆盖数据,必须从表尾向前搬:

int insert(SeqList *L, int i, int x) {
    if (i < 1 || i > L->length + 1 || L->length == L->capacity) return 0;
    for (int j=L->length; j>=i; --j) L->data[j]=L->data[j-1];
    L->data[i-1]=x; ++L->length; return 1;
}

删除第 个元素后,从 i 开始的下标依次左移,并先保存被删值:

int erase(SeqList *L, int i, int *out) {
    if (i < 1 || i > L->length) return 0;
    *out=L->data[i-1];
    for (int j=i; j<L->length; ++j) L->data[j-1]=L->data[j];
    --L->length; return 1;
}

长度为 时,在各合法位序等概率插入,平均移动 个元素;等概率删除平均移动 个,故均为 。尾插和删尾在容量足够时是 ,但最坏复杂度仍需看允许的位序。

按位查找用地址公式,;无序表按值查找需逐个比较,平均与最坏均为 。有序顺序表可二分查找到 ,但在中间插入仍要移动元素。

错解反馈:正向右移会把后一个值覆盖成重复值;插入后忘记增 length 会使新元素对后续接口不可见;删除先减长度再取值,容易拿错边界;复杂度只写“插入 ”则偷换成了尾插特例。

迁移练习:表 [3,7,9,12] 在位序 2 插入 5,再删除位序 4。答案先得 [3,5,7,9,12],再删 9 得 [3,5,7,12];插入移动 3 次,删除移动 1 次。独立验收:能逐轮写出数组变化并说明循环上下界。

小纸条

计算:长度8的顺序表在位序3插入,再删除新表的位序6。两步各移动几个元素?

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。