1.顺序表的存储结构:
//顺序表的存储结构
#define MAXSIZE 100
typedef struct
{
ElemType *elem;
int length;
}SqList;
2.初始化:构造一个空的顺序表.
算法步骤:
1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址. 2.将表的当前长度设为0.
算法描述:
//初始化
Status Initlist(SqList* L)
{
L->elem = new ElemType[MAXSIZE];
if (!L->elem)
{
return ERROR;
}
L->length = 0;
return OK;
}
3.顺序表的取值:获取顺序表中第i个数据元素的值.
算法步骤:
1.判定指定的位置序号i值是否合理(i<=i<=L->length),若不合理,则返回ERROER. 2.若i值合理,则将第i个元素L.elem[i-1]赋给参数e,通过e返回第i个数据元素的传值.
算法描述:
//获取顺序表的值
Status GetElem(SqList L, int i, ElemType e)
{
if (L.length == 0 || i<1 || i>L.length) //表为空或i的值不合法.
{
return ERROR;
}
e = L.elem[i - 1];//获取的值.
return OK;
}
4.查找:根据指定的元素值e,查找顺序表中的第一个与e相等的元素.
算法步骤:
1.从第一个元素起,依次和e相比较,若找到与e相等的元素L->elem[i],则查找成功,返回该元素的序号i+1. 2.若查找整个顺序表都没有找到,则查找失败,返回0.
算法描述:
//查找
int LocateElem(SqList* L, ElemType e)
{
for (int i = 0; i < L->length; i++)
{
if (e == L->elem[i]) return i + 1;
}
return 0;
}
5.插入:在表的第i个位置插入一个新的数据元素e,使长度为n的线性表变为长度为n+1的线性表.
算法步骤:
1.判断插入位置是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回ERROR. 2.判断顺序表的存储空间是否已满,若满则返回ERROR. 3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动). 4.将要插入的新元素e放到第i个位置上. 5.表长加一.
算法描述:
//插入
Status ListInsert(SqList* L, int i, ElemType e)
{
if (L->length == MAXSIZE)//表的长度超出限制,即存储空间已满
{
return ERROR;
}
if (i<1 || i>L->length + 1) //插入数据的位置不合法.
{
return ERROR;
}
if (i <= L->length) //插入数据的位置不在表的末尾
{
for (int j = L->length-1; j >= i - 1; j--)
{
L->elem[j + 1] = L->elem[j]; //将i后面的数据依次往后移一位.
}
}
L->elem[i - 1] = e;
L->length++;
return OK;
}
6.删除:将表的第i个元素删去,将长度为n的线性表变为n-1的线性表.
算法步骤:
1.判断删除的位置是否合法(合法值为1<=i<=n),若不合法则返回ERROR. 2.将第i+1个至第n个的元素依次向前移动一个位置(i=n时无需移动). 3.表长减一.
算法描述:
//删除
Status ListDelete(SqList* L, int i, ElemType* e)
{
if (L->length == 0) //表为空,不能删除元素.
{
return ERROR;
}
if (i<1 || i>L->length) //删除元素的位置不合法.
{
return ERROR;
}
*e = L->elem[i - 1]; //删除元素的值.
if (i < L->length) //删除的元素不在表的末尾,将后面的元素依次前移一位.
{
for (int j = i; j < L->length; j++)
{
L->elem[i-1] = L->elem[i];
}
}
L->length--;//表长减一.
return OK;
}