0
点赞
收藏
分享

微信扫一扫

脚踏实地《数据结构第二章》第二节:顺序表

爱情锦囊 2022-02-02 阅读 107
数据结构

一:定义

顺序表:用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

二:顺序表的实现

2.1 静态分配

在这里插入图片描述
图例说明:

  1. 为什么在读取数据的时候,在data[8]和data[9]时会出现不一样的数?因为有内存中遗留的脏数据存在,所以在读的时候会出现下面的情况
  2. 将顺序表初始化时,将其长度进行初始为0,这一步是必须要的。初始化时,不进行设置默认值是可以的
  3. 在进行获取时,应该是使用L.length判断长度的。

问题:如果“数组”存满了怎么办?顺序表的表长刚开始确定后就无法更改(存储空间是静态的

要想让顺序表的大小可变的化,则可以采用动态分配这种方式

2.2 动态分配

在这里插入图片描述
图例说明

  1. 在使用malloc函数时,需要将Element强制转换成我们所定义的数据元素的类型
  2. malloc是申请一整块的空间,空间大小取决于malloc的参数sizeof(ElemType)*InitSize所指明的大小

在这里插入图片描述
当free§执行完成后,最终的结果如下

在这里插入图片描述

虽然,动态分配的方式可以让顺序表的大小得到改变,但是时间开销还是比较大的

2.3 共同特点

顺序表的特点:
①随机访问,即可以在9(1)时间内找到策i个元素。

②存储密度高,每个节点只存储数据元萦

③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)

④插入、删除操作不方便,需要移动大量元素

2.4 重要考点和回顾

在这里插入图片描述

三:顺序表的插入

Listlnsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

  1. 第i个位置:按位序(也就是从1开始)

3.1 分析

在这里插入图片描述
图例:

  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;
}

分析:

  1. 引用数据类型&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 时间复杂度

在这里插入图片描述

七:知识回顾与考点

在这里插入图片描述

举报

相关推荐

0 条评论