持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
线性表的顺序实现被称为顺序表
存储类型
存储类型可以理解为是存储结构
在高级程序设计语言中的数组来描述线性表的顺序存储结构,一维数组既可以静态分配又可以动态分配
假设线性表的元素类型为ElemType
线性表的静态分配描述
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
线性表的动态分配描述
#define InitSize 100
#define INCREMENT 5
#define OVERFLOW -2
#define ERROR 0
#define OK 1
tyedef int Status;
typedef struct{
ElemType *data;
int MaxSize, length;
}SqList
C中的初始化动态分配语句是
L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize)
C++中的初始化动态分配语句是L.data = new ElemType[InitSize]
注意:线性表的动态分配方式依然是顺序存储结构,因为线性表中元素的存储依然是按照顺序依次存储在连续的存储空间的,并且逻辑顺序与存储顺序相同
顺序表上的操作
动态申请的情况下初始化
由于静态申请的情况下一开始就已经申请好空间了,所以我们这里只考虑动态申请的情况
Status InitList(SqList &L){
L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);
if(!L.data){
exit(OVERFLOW);
}
L.length = 0;
L.MaxSize = InitSize;
return OK;
}
插入操作
描述
在顺序表L中第i个位置(1<=i<=L.length+1)插入新元素e,如果插入失败返回false;否则将i个元素及以后的所有元素依次往后移动一个位置,再在i位次上插入e返回true
静态分配插入代码
bool ListInsert(SqList &L, int i, ElemType e){
if(i < 1 || i > L.length + 1){
return false;
}
if(L.length >= MaxSize){
return false;
}
for(int j=L.length; j >= i; j--){
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length ++;
return true;
}
动态分配插入代码
与静态不同的是在当表满的情况下我们仍然可以插入,只不过需要在插入之前扩大表的大小。
Status ListInsert(SqList &L, int i, ElemType e){
if(i < 1 || i > L.length + 1){
return ERROR;
}
if(L.length >= L.MaxSize){
newbase = (ElemType *)realloc(L.data, sizeof(ElemType) * (L.length + INCREMENT));
if(!newbase){
return OVERFLOW;
}
L.data = newbase;
L.length += INCREMENT;
}
for(int j=L.length; j >= i; j--){
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length ++;
return OK;
}
删除操作
描述
删除顺序表L中第i个位置的元素(1<=i<=L.length),用e返回
代码
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; j <= L.length; j++){
L.data[j-1] = L.data[j];
}
L.length --;
return true;
}
按值查找
描述
在顺序表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;
}