线性表的顺序存储结构是一种随机存取的存储结构,高级语言中通常用数组来描述数据结构中的顺序储存结构。
#define MAXSIZE 100
typedef struct
{
Elemtype *elem; //储存空间的基地址
int length; //当前长度
}SqList;
一. 初始化
顺序表的初始化操作就是构造一个空的顺序表。
1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段路弄件这段空间的基地址。
2.将表的长度设置为0。
Status InitList(SqList &L)
{//构建一个顺序列表L;
L.elem = new ElemType(MAXSIZE); //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(OVERFLOW) ; //储存分配失败退出
L.length = 0; //空表长度为 0
return Ok;
}
二.取值
取值操作是根据指定的位置序号 i ,获取顺序表中的第 i 个数据元素的值。
1.判断指定的位置序号 i 是否合理,(1 <= i <= L. length),若不合理,则返回ERROR。
2.若 i 合理,则将第 i 个数据元素L.elem[i - 1],赋值给参数e,通过e返回第 i 个数据元素的传值。
Status GetElem(SqList L,ElemType &e)
{
if(i < 1 || i > L.length) return ERROR; //判断i是否合理,如果不合理返回ERROR
e = L.length[i - 1]; //elem[i - 1]单元储存第i个元素
return OK;
}
三.查找
查找操作是根据指定的元素值 e ,查找顺序表中第 1 个与 e 相等的元素,若找到返回 i + 1,查找失败,返回 0 。
1.从第一个元素开始,一次和 e 比较若找到与 e 相等的元素 L.elem[ i ],返回 i + 1。
2.若查找失败返回 0 。
int LocateElem(SqList L,ElemType e)
{//在顺序表L中查找值为e的数据元素,返回其符号
for(int i = 0; i < L.length; i++)
if(L.elem == e) return i + 1; //若查找成功返回 i + 1
return 0; //若查找失败返回 0
}
四.插入
1.判断插入位置 i 是否合法(i 的合法取值范围是 i <= i <= L.length + 1),若不合法返回ERROR。
2.判断顺序表的储存空间是否已满,若满返回ERROR。
3.将第 n 个至第 i 个位置的元素依次向后移动一个位置,空出第 i 个位置(i = n + 1 时无需移动)
4.将要插入的新元素 e 放入第 i 个位置。
5.表长加1。
Status ListInsert(SqList &L, int i, ElemType e)
{//在顺序表L中第i个位置插入新的元素e,i值的合法范围是1 <= i <= L.length+1
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;
}
五.删除
1…判断删除位置 i 是否合法(i 的合法取值范围是 i <= i <= L.length + 1),若不合法返回ERROR。
2…将第 i + 1 个至第 n 个元素依次向前移动一个位置(i = n 时无需移动)。
3.表长减1。
Status ListDelete(SqList &L, int i,)
{//在顺序表L中第i个位置删除第i个元素,i值的合法范围是1 <= i <= L.length
if((i < 1) || (i > L.length)) return ERROR; //i值不合法
for(int j = i; j < L.length - 1; j++)
L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长加1
return OK;
}
文章借鉴:《数据结构》(C语言版)(第二版)人民邮电出版社;