线性表的顺序存储结构
定义:用一段地址连续的的存储单元依次存储线性表的数据元素。
代码结构:
#define MAXSIZE 20
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList;
三个重要属性:
- 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
- 线性表的最大存储容量: 数组长度MAXSIZE。
- 线性表的当前长度: length
地址计算方法:自己想,注意下标和序列的区别
顺序存储结构的插入与删除
获得元素操作:
typedef int Status;
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length == 0 || i < 1 || i > L.length)
return false;
*e = L.data[i-1];
return True;
}
插入操作:
插入算法的思路:
- 如果插入位置不合理,抛出异常
- 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量
- 从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移一个位置;
- 将要插入的元素填入位置i处
- 表长+1
实现代码如下:
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if(L->length == MAXSIZE) /*顺序线性表已经满*/
return false;
if(i < 1 || i>L->length+1) /*当i不再范围内*/
return false;
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 True;
}
删除操作:类似于插入操作,详细代码见书P53
线性表顺序存储结构的优缺点
优点:
- 无须为表示表中的逻辑关系而额外占用空间
- 可以快速地存取表中任意位置的元素
缺点:
- 插入和删除涉及大量元素的挪动
- 当线性表长度变化较大时,难以确定存储空间的容量
- 造成存储空间碎片化