顺序表的创建及操作
1,顺序表
顺序表即线性表的顺序储存结构,是指使用一组地址连续的储存单元依次储存线性表的各元素的储存方式。这种储存方式实现了线性表各个元素之间的逻辑结构与储存结构相对应
2,顺序表的创建
#define MAXSIZE 20 //存储空间初始分配量
typedef int ElemType; //ElemType类型根据实际情况而定
typedef struct
{
ElemType data[MAXSIZE]; //数组存储数据单元,最大值为MAXSIZE
int length; //线性表当前长度
}SqList;
TIP:线性表长度和数组长度不一样
3,顺序表的相关操作
1.获得元素操作
要返回线性表中第i个元素,只需将数组中第i-1下标的值返回即可
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status; //Status是函数类型,其值是函数结果状态代码
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值
Status GetElem(SqList L, int i, ElemType* e)
{
if (L.lemgth == 0 || i < 1 || i > L.length)
return ERROR;
*e = L.data[i - 1];
return OK;
}
2.插入操作
在线性表L中的第i个位置插入新元素e
算法思路:
- 如果插入位置不合理,抛出异常
- 如果线性表长度大于等于数组长度,则抛出异常或动态增加内存
- 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
- 将要插入元素填入位置i中
- 表长加1
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
Status ListInsert(SqList* L, int i, ElemType e)
{
int k;
if (L->length == MAXSIZE) //顺序表已满
return ERROR;
if (i < 1 || i > L->length + 1) //i不在范围
return ERROR;
if (i <= L->length) //若插入范围不在表尾
{
for (k = L->length - 1; k >= i - 1; k--)//将要插入位置后数据元素向后移动一位
L->data[k + 1] = L -> data[k];
}
L->data[i-1] = e; //将新元素插入
L->length++;
return OK;
}
3.删除操作
算法思路:
- 如果删除位置不合理,抛出异常
- 取出删除元素
- 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
- 表长减1
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
Status ListDelete(SqList* L, int i, ElemType* e)
{
int k;
if (L->length == 0) //线性表为空
return ERROR;
if (i < 1 || i > L->length) //删除位置不正确
return ERROR;
*e = L->data[i - 1];
if (i < L->length) //如果删除不是最后位置
{
for (k = i; k < L->length; k++) //将删除位置后继元素前移
L->data[k - 1] = L->data[k];
}
L->length--;
return OK;
}