一:定义
顺序表:用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
二:顺序表的实现
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 代码实现

 举例如下:
 
 结构类型的比较
 
 
6.2.2 时间复杂度

七:知识回顾与考点









