目录
2.3.3 顺序表的基本操作
2.3.3.1 插入操作
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--){ //将第i个元素及其之后的元素后移
L.data[j]=L.data[j-1];
}
L.data[i-1]=e; //在位置i处放入e
L.length++; //长度加1
return true;
}
-
注意:
- 1.数组下标与顺序表的下标,需要加入元素的第i号位置,对应的数组的位置时i-1,所以将e的值赋值给L.data[i-1],也就是顺序表的第i号位置(L.data[i-1]=e)
- 2.判断i的值是否有效(i<1||i>L.length+1) ,目的是防止用户在顺序表的小于1的位置插入元素(顺序表下标从1开始),并且只能在L.length+1的范围以内(当前长度+1即下一位,也不会空元素)插入元素,即元素之间不能空。
- 3.(L.length>MaxSize),不能让顺序表的长度大于最大长度,但是可以等于
2.3.3.2 插入操作的时间复杂度
循环:for(int j=L.length; j>=i; j–)
最好情况:新元素插入表尾,i = n+1,不用移动元素 O(1)
最坏情况:新元素插入表头,i = 1,全部元素n都需要移动 O(n)
平均情况:插入每一个位置的概率都是相等的,有n +1 个位置可以插入,所以是
1
n
+
1
=
p
\frac {1} {n+1}=p
n+11=p,
n
(
n
+
1
)
2
∗
p
=
n
2
\frac{n(n+1)}{2}*p=\frac{n}{2}
2n(n+1)∗p=2n,所以O(n)
2.3.3.3 删除操作
bool LisDelete(SqList &L, int i, int &e){ // e用引用型参数 初始值可以设置位-1
//判断i的范围是否有效
if(i<1||i>L.length)
return false;
e = L.data[i-1] //将被删除的元素赋值给e
for(int j=L.length; j>=i; j--){ //将第i个后的元素前移
L.data[j-1]=L.data[j];
}
L.length--; //长度减1
return true;
}
-
注意:
- 1.e是引用类型的,所以才能返回到main函数里边,倘若不是引用类型则会赋值给内存中main函数的e的一个复制,也就是不能在main函数里打印输出,L与&L同理。
- 2.(i<1||i>L.length) 是传参i的一个合法性检验,这时的i还是不能小于1,并且最大只能跟顺序表的 length一样大,不能跟插入一样修改下一位 length+1。
2.3.3.4删除操作的时间复杂度
2.3.3.5 知识回顾与重要考点
2.3.3.6 顺序表的按位查找
#define MaxSize 10 //定义最大长度
typedef struct{
ElemType data[MaxSize]; //用静态的“数组”存放数据元素
int Length; //顺序表的当前长度
}SqList; //顺序表的类型定义
ElemType GetElem(SqList L, int i){
// ...判断i的值是否合法
if(i<1||i>L.length)
return false;
else
return L.data[i-1]; //注意是i-1
}
typedef struct{
int *data;//指示动态分配数组的指针
int MaxSize; //顺序表的最大容量
int length; //顺序表的当前长度
}SeqList;
返回的指针的类型就是我们按位查找元素时指针读取的步长,倘若不对应则会报错,不能完成读取正确的数据
2.3.3.7 顺序表按位查找的时间复杂度
2.3.3.8 顺序表按值查找
#define InitSize 10 //定义最大长度
typedef struct{
ElemTyp *data; //用静态的“数组”存放数据元素
int Length; //顺序表的当前长度
}SqList;
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L, ElemType e){
for(int i=0; i<L.lengthl i++)
if(L.data[i] == e)
return i+1; //数组下标为i的元素值等于e,返回其位序i+1
return 0; //推出循环,说明查找失败
}
基本数据类型:int float double char可以用==
结构则不能使用==判断