一、插入
1.Linstinsert(&L,i,e)-------------->将元素e插入到L的第i个位置
2.插入位置之后的元素都要后移。
3.时间复杂度--------------------->最好O(1)、最坏O(n)、平均O(n)
bool insertArray(Dynamic &arr,int n,int e){
if (n<1||n>arr.length+1){//如果输入数字不合法,返回false
return false;
}
if (arr.length>=arr.max){//如果数组装满了,扩充数组
addArray(arr,5);
}
for (int i = arr.length; i >= n; --i) {
arr.data[i] = arr.data[i-1];//把到n以及n之后的数往后移动一位
}
arr.data[n-1] = e;//把e赋值到第n位处
arr.length++;//长度增加
return true;
}
二、删除
1.ListDelete(&L.i.&e)------------->将L的第i个元素删除,并返回e
2.删除位置之后的元素都要有右移。
3.时间复杂度--------------------->最好O(1)、最坏O(n)、平均O(n)
bool deleteArray(Dynamic &arr,int n){
if (n<1||n>arr.length+1){
return false;
}
if (arr.length>=arr.max){
addArray(arr,5);
}
for (int i = n; i >= arr.length; ++i) {
arr.data[i-1] = arr.data[i];//把从n开始的所有的数往前移动一位
}
arr.data[arr.length-1] = 0;//把最后一位设置为零
arr.length--;//长度减少
return true;
}
三、查找
一、按位查找
int selectArray(Dynamic &arr,int n){
if (n>arr.length){
return -1;
}
return arr.data[n-1];//直接返回值
}
最好/最坏/平均时间复杂度:都是O(1)
二、按值查找
int locateSelect(Dynamic &arr,int e){
for (int i = 0; i < arr.length; ++i) {
if (arr.data[i] == e){//遍历查找相应的值
return i+1;//返回此值的位序
}
}
return 0;
}
最好时间复杂度:O(1)
最坏时间复杂度:O(n)
平均时间复杂度:O(n)
四、代码要点
1.代码中位序i比数组的下标大1。
2.算法要有健壮性,注意判断i的合法性。
3.插入元素时,从数组最后开始移动;删除元素时,从数组删除的元素的后一个开始移动。
4.加“&”是因为要指向数组的地址,不然只是在一个数组的复制体内操作,最后数组并不会改变。