#define MaxSize 10
#include <stdio.h>
typedef struct {
int data[MaxSize];
int length;
}SqList;
//在L的位序i 插入元素e
//void ListInsert(SqList &L, int i, int e){
// //i的合法值 [1,length+1]
// for(int j=L.length; j>=i; j--) //将i个元素之后的元素后移
// L.data[j] =L.data[j-1];
// L.data[i-1] =e; //在位置i处放入e
// L.length++; //长度+1
//}
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--) //将i个元素之后的元素后移
L.data[j] =L.data[j-1];
L.data[i-1] =e; //在位置i处放入e
L.length++; //长度+1
return true;
}
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i] = 0; //将所有数据元素设置为默认初始值
L.length = 0; //顺序表初始长度为0
}
int main(){
SqList L;
InitList(L);
ListInsert(L, 3 ,3);
return 0;
}
(好的算法应该有健壮性,所以后面优化了一下)
时间复杂度分析
最好情况:新元素插入到表尾,不需要移动元素 i = n+1 循环0次 O(1)
最坏情况: 新元素表头 需要将原有n个元素全部向后移动
i=1,循环n次,最坏时间复杂度O(n)
平均情况: 假设新元素插入到任何一个位置概率相同,即i = 1, 2, 3,....,length+1的概率都是p=1/(n+1)
i=1 循环n次
i=2 循环n+1次
...
i=n+1时,循环0次
平均循环次数 np+(n-1)*p+(n-2)*p+.......+1*p=[n*(n+1)/2] *[1/(n+1)]=n/2
平均时间复杂度O(n)
删除操作
bool ListDelete(SqList &L, int i, int &e){
if(i<1 || i>L.length) //判断i的范围是否有效
return true;
e = L.data[i-1];
for(int j=i; j<L.length; j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
(小注:引用符号e,带回)
最好情况:最后一个元素 O(1)
最坏情况:表头元素 O(n)
平均情况O(n)