一:定义
顺序表
:用顺序存储
的方式实现线性表顺序存储。把逻辑上相邻的元素
存储在物理位置上也相邻
的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
二:顺序表的实现
2.1 静态分配
图例说明:
- 为什么在读取数据的时候,在data[8]和data[9]时会出现不一样的数?因为有内存中遗留的脏数据存在,所以在读的时候会出现下面的情况
- 将顺序表初始化时,
将其长度进行初始为0,这一步是必须要的
。初始化时,不进行设置默认值是可以的 - 在进行获取时,应该是使用L.length判断长度的。
问题:如果“数组”存满了怎么办?顺序表的表长刚开始确定后就无法更改(存储空间是静态的
)
要想让顺序表的大小可变的化,则可以采用动态分配这种方式
2.2 动态分配
图例说明
- 在使用malloc函数时,需要将Element强制转换成我们所定义的数据元素的类型
- malloc是申请一整块的空间,空间大小取决于malloc的参数sizeof(ElemType)*InitSize所指明的大小
当free§执行完成后,最终的结果如下
虽然,动态分配的方式可以让顺序表的大小得到改变,但是时间开销还是比较大的
2.3 共同特点
顺序表的特点:
①随机访问,即可以在9(1)时间内找到策i个元素。
②存储密度高,每个节点只存储数据元萦
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
④插入、删除操作不方便,需要移动大量元素
2.4 重要考点和回顾
三:顺序表的插入
Listlnsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
- 第i个位置:按位序(也就是从1开始)
3.1 分析
图例:
- 如果要在a、b、d、e、f的第三个位置加入一个c元素的话,需要将第三个位置往后的数据都王后移一位才可以
3.2 代码说明
主要代码片段:
#define MaxSize 10;//定义最大长度
typeof struct{
int data[MaxSize];//用静态的“数组"存放数据元素
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义
bool ListInsert(SqList $L,int i,int e){
if(i>1 || i>L.length+1)//判断i的范围是否有效
return false;
if(L.length>=MaxSize)//当前存储空间已满,不能插入
return false;
for(inr 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;
}
int main(){
SqlList L;//声明一个顺序表
InitList(L);//初始化顺序表
//...此处省略一些代码,插入几个元系
ListInsert(L,3,3);
return 0;
}
3.3 时间复杂度
关注最深层循环语句的执行次数与问题规模n的关系
问题规模n = L.length(表长)
四:顺序表的删除
4.1 分析
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用ew回删除亓素的值
分析:
4.2 代码实现
源代码:
#define MaxSize 10;//定义最大长度
typeof struct{
int data[MaxSize];//用静态的“数组"存放数据元素
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义
//&e:这个是引用数据类型的参数,会将此次删除的数据元素返回
bool ListDelete(SqList $L,int i,int &e){
if(i>1 || i>L.length+1)//判断i的范围是否有效
return false;
e = L.data[i-1];//将被删除的元素赋值给e
for(inr j=L.length;j>=i;j--)//将第i个元素后的元素前移
L.data[j-1]=L.data[j];
L.length--;//长度加1
return true;
}
int main(){
SqlList L;//声明一个顺序表
InitList(L);//初始化顺序表
//...此处省略一些代码,插入几个元系
int e = -1; //用变量e把删除的元素"带回来"
if(ListDelete(L, 3, e)){
printf("已删除第3个元素,删除元素值为=%d\n" , e);
}else{
printf( "位序i不合法,删除失败\n" );
}
return 0;
}
分析:
- 引用数据类型&e:实际上在内存当中对应的是同一份数据。所以ListDelete里面的参数e实际上在main函数里面的e的复制品
4.2 时间复杂度
五:插入和删除知识回顾与重要考点
六:顺序表的查找
6.1 按位查找
GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
6.1.1 代码实现
6.1.2 时间复杂度
6.2 按值查找
LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
6.2.1 代码实现
举例如下:
结构类型的比较