概念
顺序表是指用一组地址连续的存储单元依次存储线性表的数据元素,也被称为线性表的顺序存储结构或顺序映像。
存储的位置:其在逻辑上相邻的数据元素,在物理次序上也是相邻的存储地址。
顺序表的存储结构体
#define MAXSIZE 100 //最大的表长
#define OVERRFLOW -1
#define OK 1
#define ERROR 0
typedef struct
{
ElemType *elem;//存储空间基地址
int length; //当前表长
}Sqlist;//顺序表的结构类型Sqlist
初始化顺序表
【算法步骤】
- 为顺序表分配一个MAXSIZE大的动态空间的数组。
- 将表长设置为0。
伪码:
status Initlist(Sqlist &L)
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem)
exit(OVERRFLOW);
L.length=0;
return OK;
}
顺序表的取值
【算法步骤】
- 判断i位置是否合理,若不合理则返回ERROR。
- 若i值合理,则将第i个数据元素L.elem[i-1]的值赋给参数e,通过e返回第i个数据元素的传值。
伪码:
status GetElem(Sqlist L,int i,ElemType &e)
{
if((i<1)||(i>L.length))
return ERROR;
e=L.elem[i-1];
return OK;
}
顺序表的查找
【算法步骤】
- 从第一个元素起,依次和e比较,若找到与e相同的元素L.elem[i],
则返回该元素的序号i+1。 - 若没有找到,查找失败,则返回ERROR。
伪码:
int LocateElem(Sqlist L,ElemType e)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e)
return i+1;
return ERROR;
}
顺序表的插入
【算法步骤】
- 判断插入的位置是否合理,若不合理则返回ERROR。
- 判断顺序表是否已满,若满则返回ERROR。
- 将第i个至第n个位置的元素都向后移一位,空出第i个位置;当i为n+1时不需要移动。
- 见要插入的元素e放入到第i个位置。
- 表长加一。
伪码:
status ListInsert(Sqlist &L,int i,Elemtype e)
{
if((i<1)||(i>L.length))
return ERROR;
if(L.length==MAXSIZE)
return ERROR;
for(j=L.length;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
L.length++;
return OK;
}
顺序表的删除
【算法步骤】
- 判断删除位置是否合法,若不合法则返回ERROR。
- 将第i+1个至第n个元素向前移动一位;当i=n时不需要移动。
- 表长减一。
伪码:
status ListDelete(Sqlist &L,int i)
{
if((i<1)||(i>L.length))
return ERROR;
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
L.length--;
return OK;
}
顺序表的具体实现:
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct {
ElemType *elem; //存储空间的基地址
int length; //当前长度
} SqList;
Status InitList(SqList &L) // 顺序表的初始化
{
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L