顺序表与数组非常类似
目录
一、顺序表的定义
顺序表是线性表的一种,是顺序存储的。它使用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
二、顺序表的物理存储结构图
若顺序表L的起始地址为Pos(A),数据元素类型是ElemType,则它的物理存储结构图如下
三、顺序表的两大分类
1.静态的顺序表
特点:长度不可变
代码如下(示例):
#define MaxSize 100 //顺序表的最大长度
typedef int ElemType; //顺序表的数据元素类型
typedef struct { //顺序表的定义
ElemType data[MaxSize]; //静态数组
int length; //顺序表当前长度
}SqList; //所定义的顺序表的名称
2.动态的顺序表
特点:长度可变
代码如下(示例):
#define InitSize 100 //顺序表的初始容量
typedef int ElemType; //顺序表的数据元素类型
typedef struct { //顺序表的定义
ElemType *data; //指向动态分配数组的指针
int length,MaxSize; //顺序表当前长度、容量
}SqList; //所定义的顺序表的名称
3.动态的顺序表的扩容
重新申请一片更大的连续空间,将原来的数据复制到新的数组中
代码如下:
void IncreaseCapacity(SqList& L,int i) { //顺序表的扩容,每次扩大i倍
//申请原来容量的i倍大小的连续空间
ElemType* p = (ElemType*)malloc(sizeof(ElemType) * i * L.MaxSize);
for (int i = 0; i < L.length; i++) { //将原来的数据复制到新的数组中
p[i] = L.data[i];
}
L.data = p; //更新顺序表
}
四、顺序表基本操作的实现
1.初始化
代码如下:
SqList L; //创建一个顺序表
void InitSqList(SqList &L){ //静态的顺序表初始化函数
L.length=0; //顺序表初始长度为0
}
void InitSqList(SqList &L){ //动态的顺序表初始化函数
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);//开辟初始容量所需的空间
L.length=0; //顺序表初始长度为0
L.MaxSize=InitSize; //暂时将最大容量设置为最初最大容量
}
2.插入
代码如下:
bool ListInsert(SqList& L, int i, ElemType value) {//插入到第i个元素的位置
if (i<1 || i>L.length + 1) { //i的值不合理
return false;
}
if (L.length >= MaxSize) { //容量已满,不能插入
return false;
}
for (int j = L.length - 1; j >= i - 1; j--) {//将第i个元素和它后面的元素依次往后移
L.data[j + 1] = L.data[j];
}
L.data[i - 1] = value; //在第i个位置上放入要插入的值
L.length++; //长度加1
return true;
}
时间复杂度:O(n)
3.删除
bool ListDelete(SqList& L, int i, ElemType &back) {//删除第i个元素
if (i<1 || i>L.length) { //i的值不合理
return false;
}
back = L.data[i - 1]; //记录并返回被删除的元素
for (int j = i-1; j < L.length-1; j++) {//将第i-1个元素和它后面的元素依次往前移
L.data[j] = L.data[j+1];
}
L.length--; //长度减1
return true;
}
时间复杂度:O(n)
4.按值查找
顺序查找,返回顺序表中等于value的第一个元素的下标
int findFirstValue(SqList& L, ElemType value) {//返回顺序表中等于value的第一个元素的下标
int i = 0;
for (i; i < L.length; i++) {
if (L.data[i] == value) {
return i; //返回下标
}
}
return -1;//返回值是-1则没有此元素
}
时间复杂度:O(n)
五、总结
顺序表与数组很相似,主要特点就是支持随机访问,顺序表的存储密度高,物理上和逻辑上都相邻。