0、目录
1、定义
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。其特点是,逻辑上相邻的数据元素,其物理次序也是相邻的。
2、存储表示
//-------顺序表的存储结构--------
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct{
ElemType *elem; //存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
3、基本操作实现
3.1、初始化
3.1.1、初始化算法步骤
①为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
②将表当前的长度设为0。
3.1.2、初始化算法描述
Status InitList(SqList &L){ //构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
3.2、取值
3.2.1 取值算法步骤
①判断指定的位置序号 i 值是否合理(1
≤
\leq
≤i
≤
\leq
≤L.length),若不合理,则返回ERROR。
②若 i 值合理,则将第 i 个数据元素L.elem[i-1]赋给参数 e,通过 e 返回第 i 个数据元素的传值。
3.2.2 取值算法描述
Status GetElem(SqList L,int i,ElemType &e){
if(i < 1 || i > L.length) return ERROR; //判断i值是否合理,若不合理,返回ERROR
e = L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
3.3、查找
3.3.1 查找算法步骤
①从第一个元素起,依次和 e 相比较,若找到与 e 相等的元素L.elem[i],则查找成功,返回该元素的序号 i+1。
②若查遍整个顺序表都没有找到,则查找失败,返回0。
3.3.2 查找算法描述
int LocateElem(SqList L,ElemType e){ //在顺序表L中查找值为e的数据元素,返回其序号
for(int i = 0;i < L.length;i++)
if(L.elem[i] == e) return i+1; //查找成功,返回序号i+1
return 0; //查找失败,返回0
}
3.4、插入
3.4.1 插入算法步骤
①判断插入位置 i 是否合法(1
≤
\leq
≤i
≤
\leq
≤n+1),若不合法则返回ERROR。
②判断顺序表的存储空间是否已满,若满则返回ERROR。
③将第 n 个至第 i 个位置的元素依次向后移动一个位置,空出第 i 个位置(i = n+1时无需移动)。
④将要插入的新元素 e 放入第 i 个位置。
⑤表长加1。
3.4.2 插入算法描述
Status ListInsert(SqList &L,int i,ElemType e){ //在顺序表L中第i个位置之前插入新的元素e,i的合法范围是[1,L.length]
if((i < 1) || (i > L.length+1)) return ERROR; //i的值不合法
if(L.length == MAXSIZE) return ERROR; //当前存储空间已满
for(int j = L.length-1;j >= i-1;j--)
L.elem[j+1] = L.elem[j]; //插入位置及之后的元素后移
L.elem[i-1] = e; //将新元素e放入第i个位置
L.length++; //表长加1
return OK;
}
3.5、删除
3.5.1 删除算法步骤
①判断删除位置 i 是否合法(1
≤
\leq
≤i
≤
\leq
≤n),若不合法则返回ERROR。
②将第 i+1 个至第 n 个的元素依次向前移动一个位置(i = n时无需移动)。
③表长减1。
3.5.2 删除算法描述
Status ListDelete(SqList &L,int i){ //在顺序表L中删除第i个元素,i值的合法范围是[1,L.length]
if((i < 1) || (i > L.length)) return ERROR; //i值不合法
for(int j = i;i <= L.length-1;j++)
L.elem[j-1] = L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
return OK;
}
4、完整代码
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef int Status;
typedef int ElemType; //我们这把数据元素类型定义为int
typedef struct{
ElemType *elem; //存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
Status InitList(SqList &L){ //构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
Status GetElem(SqList L,int i,ElemType &e){
if(i < 1 || i > L.length) return ERROR; //判断i值是否合理,若不合理,返回ERROR
e = L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
int LocateElem(SqList L,ElemType e){ //在顺序表L中查找值为e的数据元素,返回其序号
for(int i = 0;i < L.length;i++)
if(L.elem[i] == e) return i+1; //查找成功,返回序号i+1
return 0; //查找失败,返回0
}
Status ListInsert(SqList &L,int i,ElemType e){ //在顺序表L中第i个位置之前插入新的元素e,i的合法范围是[1,L.length]
if((i < 1) || (i > L.length+1)) return ERROR; //i的值不合法
if(L.length == MAXSIZE) return ERROR; //当前存储空间已满
for(int j = L.length-1;j >= i-1;j--)
L.elem[j+1] = L.elem[j]; //插入位置及之后的元素后移
L.elem[i-1] = e; //将新元素e放入第i个位置
L.length++; //表长加1
return OK;
}
Status ListDelete(SqList &L,int i){ //在顺序表L中删除第i个元素,i值的合法范围是[1,L.length]
if((i < 1) || (i > L.length)) return ERROR; //i值不合法
for(int j = i;i <= L.length-1;j++)
L.elem[j-1] = L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
return OK;
}
Status TraverseList(SqList L){ //遍历顺序表
if(L.elem == NULL)
printf("顺序表为空");
else
for(int j = 0;j <= L.length-1;j++)
printf("%d ",L.elem[j]);
return OK;
}
int main(void){ //示例main函数
SqList L;
ElemType e;
if(InitList(L))
printf("初始化顺序表成功\n");
if(ListInsert(L,1,1))
printf("插入数据成功\n");
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,18);
TraverseList(L);
if(GetElem(L,2,e))
printf("\n取出成功,第i个元素值为:%d\n",e);
if(LocateElem(L,1))
printf("取出成功,值为e的元素在第%d个\n",LocateElem(L,1));
if(ListDelete(L,4))
printf("删除数据成功\n");
TraverseList(L);
return 0;
}