目录
顺序表的基本操作——插入
首先,静态分配一个顺序表
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 5 // 定义队列的最大长度
typedef struct {
int data[MaxSize];
int length;
}SqList;
然后实现插入方法,for循环
我们提前插入了四个元素,顺序排放
原理是以i为插入位置(位序),e为插入的元素,j为这个顺序表的长度为5,当j所代表的长度大于等于插入位置时,这个循环就会继续,每一轮循环之后j自减1,此时j为5,然后进入循环把原本在位序4的元素放到位序5的位置,然后循环继续到j<i,此时插入元素e,因为位序和数组下标不同,位序比下标多1,最后扩大顺序表的长度+1.
void ListInsert(SqList& L, int i, int e) {
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1];
L.data[i - 1] = e;
L.length++;
}
但此时代码还不够健壮,我们无法让别人知道自己想插入的操作是否合法,此时要考虑到:
L的范围是(1,length+1),并且插入操作不能违反顺序表的规则,不能隔空插入
我们可以使用bool型来实现这个需求
bool ListInsert(SqList& L, int i, int e) {
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];
L.data[i - 1] = e;
L.length++;
return true;
}
这样代码就能够拥有足够的“防患于未然性”
插入操作的时间复杂度
关注最深层循环语句的执行次数与问题规模n的关系
L.data[j] = L.data[j - 1];
问题规模n=L.length(表长)
最好情况:新元素插入到表尾,不需要移动元素
i = n+1