一.顺序表的定义:
线性表的顺序存储又叫顺序表,它由一组地址连续的存储单元依次存储线性表中的数据元素。
特点:
- 逻辑上相邻的两元素在物理位置上也相邻。
- 线性表中任意元素都可以随机存取(随机访问)。
- 通常用高级语言中的数组来描述。
- 存储密度高,每个结点只存储数据元素。
二.定义顺序表(静态数组):
define MaxSize 50 //假设线性表的最大长度为50
typedef struct{
ELemType data[MaxSize]; //顺序表元素
int length; //顺序表当前长度
}SqList; //类型定义
三.定义顺序表(动态数组):
define InitSize 100 //线性表的初始长度
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize,length; //数组最大容量和当前长度
}SeqList; //动态分配数组顺序表的类型定义
四.顺序表的基本操作:
- 在线性表第i个位置插入元素e。
bool ListInsert(SqList &L,int i,ElemType e){
if(i<1||i>length+1) //判断位置i是否合法
return false;
if(L.length>=MaxSize) //判断是否已经满了不能插入
return false;
for(int j=L.length;j>=i;j--) //将第i个元素及之后的元素后移
L.data[j]=L.data[j-1];
L.data[i-1]=e; //位置i放入e
L.length=L.length+1; //表长加1
return true;
}
最好情况:在表尾插入,元素后移语句不执行。时间复杂度为O(1)
最坏情况:在表头插入,元素后移语句执行length次。时间复杂度为O(n)
- 删除第i个位置的元素,用e返回。
bool ListDelete(SqList &L,int i,ElemType &e){
if(i<1||i>length)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++) //将第i个位置后的元素前移
L.data[j-1]=L.data[j];
L.length--;
return true;
}
最好时间复杂度:O(1) 最坏时间复杂度:O(n) 平均时间复杂度:O(n)
- 按值查找:(顺序查找)
在顺序表L中查找第一个元素等于e的元素,返回位序。
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0; //退出循环说明查找失败
}
最好时间复杂度:O(1) 最坏时间复杂度:O(n) 平均时间复杂度:O(n)