2.2 线性表的顺序表示
2.2.1 顺序表的定义
(1)线性表的顺序存储(物理存储结构)又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
(2)顺序表的特点:
- 表中的元素的逻辑顺序和物理顺序相同。插入和删除元素需要移动大量的元素;
- 随机访问。即通过首地址和元素序号找到对应元素的时间恒为O(1);
- 存储密度高。每个结点只存储数据信息,不存储下一个元素的地址。
注:线性表中的元素的位序是从1开始的,而数组中元素的下标是从0开始的。
(3)顺序表的描述为
静态分配:
#define MaxSize 50 //定义表的最大长度
typedef struct {
ElemType data[size]; //元素
int length; //长度
}SqList; //顺序表的类型定义
动态分配:
#define InitSize 100 //表长度的初始定义
typedef struct{
ElemType *data; //指定动态分配数组的指针
int MaxSize,length; //数组的最大容量和当前个数
}SeqList; //动态分配定义
C语言的初始动态分配的语句为:
L.data = (ElemType*) malloc ( sizeof(ElemType) * InitSize);
2.2.2 顺序表上的基本操作的实现
(1)插入操作
//C语言C99之前是没有布尔类型定义,但是考试不要求完全实现,所以这里使用bool返回类型是没有问题的
//在顺序表中的第i个位置插入元素
bool insertList(SqlList &L,int i,ElemType e){
if( i < 1 || i > L.length + 1 ){
//判断插入位置,如果小于顺序表位序1或大于当前长度length+1造成不连续,不合法
return false;
}
if( L.length >= MaxSize ){
//当前长度以达到最大值,无法插入
return false;
}
for( int j = L.length - 1; j >= i - 1; j-- ){
//把data[i-1] - data[L.length - 1]后移一位
L.data[j + 1] = L.data[j];
}
L.data[i - 1] = e;
L.length++;
return true;
}
//平均时间复杂O(n)
(2)删除操作
//删除顺序表中第i个元素,成功返回元素e,失败返回false
bool ListDelete(SqList &L,int i,Elemtype &e){
if( i < 1 || i > L.length){
//删除位置不合法
return false;
}
e = L.data[i - 1];
for(int j = i - 1;j <= L.length - 2;j ++){
//将第i个元素后的元素整体前移一位
L.data[j] = L.data[j + 1];
}
L.length--;
return true;
}
//平均时间复杂O(n)
(3)按值查找
//按值在顺序表中查找元素.返回元素位序
int LocateElem(SqList L,ElemType e){
int i = 0;
for(;i < L.length;i ++){
if(L.data[i] == e)
return i + 1; //返回元素位序,而不是数组下标
}
return 0;
}
//平均时间复杂O(n)