#Python知识分享#
一、顺序表的定义
1、顺序表就是采用顺序存储的方式将线性表顺序的存储起来。就是数据结构是什么中所提到的,不仅要保持元素在逻辑上相邻存储,而且还要保持元素在位置上也相邻存储,存储单元的邻接关系来体现元素之间的关系。
顺序表的线性表的一种,满足线性表所拥有的系列特征,每个数据元素都是一样大的,占有的存储空间一样大。
假设线性表中存储的第一个元素的位置为loc(L)(loc为location的缩写),那么,在内存中,第二个元素所存放的位置为loc(L)+数据元素的大小,第三个元素所存放的位置为loc(L)+2×数据元素的大小。那,我们怎样知道一个数据元素的大小,存储空间呢?
在C语言中,可以采用sizeof关键字查找数据元素的大小,形式为sizeof(ElemType)。
二、顺序表的实现——静态分配
小例子1:
#defineMaxSize//定义最大的长度为
typedefstruct{
ElemTypedata[MaxSize];//采用静态的数组来存放数据元素
intLength;//length表示顺序表目前的长度
}SqList;//定义顺序表的类型(静态的分配方式,即在一开始就已经确定好了整个顺序表的类型,之后不能再改变)
超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架小故事4-1:大家可以想象一下建房子,定义顺序表的类型就相当于是打地基建框架,地基框架确定好了,房子的结构就确定了,之后再进行细建,装修。而如果在装修时,觉得房子版型不好的话,要打墙或是其他操作的话,就要看房子结构怎样了,特别是对于那种原本结构就简单的,基本上都是有支撑力的,不能随意打掉。一旦打掉了有支撑力的墙的话,整个房子都有可能会垮掉。这是不允许那样操作的。这里的静态分配是指在定义后不允许再次分配的,确定了就确定了,无法更改。
小问题:如果静态分配的“数组”空间存满了要怎么办呢?
emmm建议直接放弃治疗,因为如我们前面所提到的,确定好空间后,是无法再次更改的,所以,只能采取其他方法,或者一开始声明定义大一些的空间。
那,如果一开始就声明很大的内存空间会怎样呢?
这也大可不必,毕竟空间太大了会造成空间浪费。
三、顺序表的实现——动态分配
小例子2:
#defineInitSize//定义顺序表的初始长度为
typedefstruct{
ElemType*data;//定义动态分配数组的指针
intMaxSize;//定义顺序表的最大容量
intlength;//定义顺序表当前的长度
}SqList;//定义顺序表的类型(动态分配的方式,定义好顺序表容量后,后续可更改)
小要点:要注意动态申请和释放内存空间的函数——malloc函数和free函数
malloc函数可以申请连续的一整片存储空间,并且有一个起始地址的指针,将malloc函数返回的指针强制转换为我们所需要定义的元素类型指针,再将其赋予顺序表中的data指针。
表示为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
ElemType换成我们所需要定义的元素类型;大小为类型的大小×初始长度。
当顺序表存满时,可以采用malloc函数拓展顺序表的容量,将需要的数据元素复制到新的存储区域后,再用free函数释放掉原来的区域。
四、顺序表的特点
1、随机访问,可以在常数级,即O(1)时间内找到第i个元素。
2、存储的密度高,每个节点只存储数据元素。
3、拓展容量时不方便(即使用于动态分配实现,采用的拓展时间复杂度也很高)。
4、插入删除等操作需要移动大量的元素,不方便。
本文系作者授权百家号发表,未经许可,不得转载。