插入元素的位置是i表示插入后,这个插入的元素是在 i 的位置, 即要先找到原先顺序表中i的位置所属元素, 插在此元素的前面即可
#include
#define MaxSize 5
typedef struct {
int data[MaxSize]; //用静态数组存储当前数据
int length; //当前顺序表的长度
} SqList;
void InitList(SqList &L) {
for(int i = 0; i<MaxSize; i++)
L.data[i] = 0;
L.length = 0;
}
bool ListInsert(SqList &L,int i,int e) {
if(i<1 || i>L.length+1) { //判断 i的位置是否合法
printf("插入的位置不合法,请重新定义i的值\n");
return false;
}
if(L.length >= MaxSize){
printf("存储已满,不能插入\n");
return false;
}
for(int j=L.length; j>=i; j--) //(j 和 i 都是位序)
L.data[j] = L.data[j-1];
L.data[i-1] =e; //在位置 i 处放入e (i是位序)
L.length++; //长度+1
return true;
}
int main() {
SqList L;
InitList(L);
ListInsert(L,1,1);
ListInsert(L,2,3);
ListInsert(L,3,4);
ListInsert(L,4,5);
ListInsert(L,5,6);
bool a= ListInsert(L,2,2);
printf("%d\n",a); //c语言中 bool类型就是 0 和 1, 因此可以用 %d 来输出
printf("%d,%d",L.data[1],L.length); //打印位序为2的元素和当前的顺序表表长
return 0;
}
#include
#define MaxSize 5
typedef struct {
int data[MaxSize];
int length;
} SqList;
void InitList(SqList &L) {
L.length = 5;
for(int i=1; i<=L.length; i++){
L.data[i-1] = i;
// printf("%d",L.data[i-1]);
}
}
bool ListDelete(SqList &L,int i,int &e) {
if(i<1 || i > L.length) {
printf("删除的位置不合法\n");
return false;
}
if(L.length == 0) {
printf("当前表为空表,删除失败");
return false;
}
e = L.data[i-1];
for(int m=i; m<L.length; m++)
L.data[m-1] =L.data[m];
L.length --;
return true;
}
int main() {
SqList L;
InitList(L);
int e = -1;
ListDelete(L,3,e);
printf("%d",e);
}
新元素插入到表尾, 则不需要移动元素
i = n+1, 循环0次; 即最好时间复杂度 = O(1)
新元素插入到表头, 则表中的 n 个元素需要全部移动
i =1; 循环n次, 最坏时间复杂度 = O(n)
新元素插入有(n+1)种选择,即插入每个位置的概率都是 p= 1/(n+1)
i =1 ,循环n次
i =2 ,循环n-1次
…
i =n+1, 循环 0次
平均循环次数: = np+(n-1)p+…+1*p = n/2
即 平均时间复杂度 = O(n)
删除表尾元素, 则不需要移动元素
i = n, 循环0次; 即最好时间复杂度 = O(1)
删除表头元素, 则表中的 n-1 个元素需要移动
i =1; 循环n-1次, 最坏时间复杂度 = O(n)
删除操作有n种选择,即删除每个位置的概率都是 p= 1/n
i =1 ,循环n-1次
i =2 ,循环n-2次
…
i =n, 循环 0次
平均循环次数: = (n-1)p+…+1*p = (n-1)/2
即 平均时间复杂度 = O(n)