线性表的顺序存储
顺序存储的线性表称顺序表
物理顺序存储方式
数组下标 | 顺序表 | 内存地址 |
---|---|---|
0 | a1 | LOC(A) |
1 | a2 | LOC(A)+sizeof(Elemtype) |
… | … | … |
i-1 | ai | LOC(A)+(i-1)*sizeof(Elemtype) |
… | … | … |
n-1 | an | LOC(A)+(n-1)*sizeof(Elemtype) |
… | … | … |
MaxSize-1 | … | LOC(A)+(MaxSize-1)*sizeof(Elemtype) |
优缺点
优点 | 缺点 |
---|---|
存储密度大,不需要为元素的逻辑关系额外开辟空间 | 插入和删除操作需要移动大量元素,平均时间复杂度O(n) |
随机存取,可快速存取表中任一元素 | 对存储要求高,会出现存储碎片 |
(注意,随机存取这个概念很重要,它不是存储)
顺序存储
1、线性表是一种逻辑结构,存储单元地址连续;顺序表和链表是储存结构;
2、线性表的顺序表示
//线性表的静态分配
#define MaxSize 50 //定义线性表的最大长度
typedef struct{
//注意:线性表元素位序从1开始,而数组从0开始
ElemType data[MaxSize];
int length;
}SqList;
//线性表的动态分配
#define InitSize 100 //定义表的初始长度
typedef struct{
ElemType *data;
int MaxSize,length;
}SeqList;
SeqList L;//初始化一个叫做L的线性表
L.data=new ElemType[InitSize];
//动态分配虽然使用指针,但是它不是链式存储,而是顺序存储,因为开辟的空间是连续的
3、顺序表的操作
插入操作
在顺序表第i个元素的位置插入一个新元素e
bool ListInsert(SqList &L,int i,Elemtype e){
if(i<1||i>L.length+1)//判断i的范围是否有效
return false;//顺序表首位是1,末位是length,length+1则正好插到最后
if(L.length>=MaxSize)//储存空间已满,不可插入
return