目录
一、顺序表的概念
1、定义
线性表的顺序存取又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
2、特点
(1)顺序表是一种随机存取的存储结构,通过首地址和元素序号可在时间O(1)内找到指定的元素。
(2)存取密度高,每个结点只存储数据元素。
(3)逻辑上相邻的元素在物理上也相邻,所以插入和删除操作需要移动大量元素。
3、实现方式
在高级程序语言中通常用数组来描述线性表的顺序存储结构。
(1)一维数组的静态分配
#define MaxSize 50 //定义线性表的最大长度
typedef struct{
ElemType data[MaxSize]; //顺序表的元素
int Length; //顺序表的长度
}SqList,*List; //顺序表的类型定义
(2)动态的分配
#define InitSize 50 //定义线性表的初始长度
typedef struct{
ElemType *data; //动态分配数组的指针
int MaxSize,Length; //数组的最大长度和当前长度
}SqList,*List; //顺序表的类型定义
初始动态分配语句为
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
二、顺序表基本操作的实现
1、插入操作
/*
* L 插入的顺序表
* i 插入顺序表的位置
* e 插入的元素
*/
bool ListInsert(List L,int i,int e){
if(i < 1 || i > L->Length + 1){ //判断i是否合法
return false;
}
else if(L->Length > MaxSize){ //判断顺序表是否已满
return false;
}
else{
i--; //因为顺序表的位序比数组的下表大1
for(int j = L->Length;j > i;j--){ //将第i个元素及后面的元素后移一位
L->data[j] = L->data[j-1];
}
L->data[i] = e; //在位置i插入元素e
L->Length++; //顺序表长度加1
return true;
}
}
复杂度分析:
最好情况:在表尾插入,时间复杂度为O(1);
最坏情况:在表头插入,时间复杂度为O(n);
平均情况:时间复杂度为O(n);
2、删除操作
/*
* L 删除操作的顺序表
* i 删除元素的位置
* e 用来替代被删元素
*/
bool ListDelete(List L,int i,int &e){
if(i < 1 || i > L->Length){ //判断i的范围是否有效
return false;
}
else {
e = L->data[i];
for(int j = i;j<L->Length;j++){ //将第i个位置后的元素前移一位
L->data[j-1]=L->data[j];
}
L->Length--; //顺序表长度减1
return true;
}
}
复杂度分析:
最好情况:删除表尾元素,时间复杂度为O(1);
最坏情况:删除表头元素,时间复杂度为O(n);
平均情况:时间复杂度为O(n);
3、按值查找(顺序查找)
/*
* L 查找的顺序表
* e 查找的元素
*/
int LocateElem(List L,ElemType e){
for(int i = 0;i<L->Length;i++){
if(L->data[i]==e){
return i+1; //返回元素的位序
}
}
return 0; //查找失败,返回0
}
复杂度分析:
最好情况:查找的元素就在表头,时间复杂度为O(1);
最坏情况:查找的元素在表尾,时间复杂度为O(n);
平均情况:时间复杂度为O(n);