05-顺序表的基本操作

133 阅读1分钟

插入操作

  • 插入方法的定义

    1. 在顺序表 LL 的第i1iL.length+1i(1 \leq i \leq L.length + 1)个位置插入新元素 ee
    2. ii 的输入不合法,则返回 false**,**表示插入失败
    3. 否则,将顺序表的第 ii 个元素及其后的所有元素右移一个位置,腾出一个空位置插入新元素 ee,顺序表长度增加 11。插入成功,返回 true
  • 插入方法的代码实现

    #define MaxSize 10;
    typeof struct {
    	int data[MaxSize];
    	int length;
    }SqList
    
    bool ListInsert(SqList &L, int i, int e) {
    	// 判断 i 的范围是否有效
    	if (i < 1 || i > L.length + 1) {
    		return false
    	}
    	// 当前存储空间已满,不能插入
    	if (L.length >= MaxSize) {
    		return false
    	}
    	for (int j = L.length; j >= i; j--) {
    		L.data[j] = L.data[j - 1] // 将第 i 个元素及之后的元素后移
    	}
    	L.data[i - 1] = e;
    	L.length++;
    	return true;
    }
    
  • 插入操作的时间复杂度

    • 最好情况:在表尾插入,即 i=n+1i = n + 1,元素后移语句不执行,时间复杂度为 O(1)
    • 最坏情况:在表头插入,即 i=1i=1,元素后移执行 n 次,时间复杂度为 O(n)
    • 平均情况:n/2n/2

删除操作

  • 删除方法的定义

    删除顺序表 LL 中第 i1iL.lengthi(1 \leq i \leq L.length)个位置的元素,若成功则返回 true

    并将被删除的元素用引用变量 ee 返回,否则返回 false

  • 删除方法的代码

    bool ListDelete(SqList &L, int i, int &e) {
    	if (i < 1 || i > L.length) {
    		return false;
    	};
    	e = L.data[i - 1];
    	for (int j = i; j < L.length; j++) {
    		L.data[j - 1] = L.data[j];
    	}
    	L.length--;
    	return true;
    }