对于非空的线性表和线性结构,其特点如下:
- 存在唯一的一个被称作 "第一个" 的数据元素
- 存在唯一的一个被称作 "最后一个" 的数据元素
- 除了第一个之外,结构中的每个数据元素均有一个前驱
- 除了最后一个之外,结构中的每一个数据元素都有一个后继
顺序存储
指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像。
顺序表
是在计算机内存中以数组的形式保存的线性表,是将表中的结点依次存放在计算机内存中一组地址连续的存储单元。
/* 空间大小 */
#define MAXSIZE 100
/* ElemType是数据类型,具体类型根据实际情况而定,这里假设为int */
typedef int ElemType;
/* 顺序表结构设计 */
typedef struct {
ElemType *data; /* 存储数据 */
int length; /* 顺序表中数据的个数 */
}SeqList;
存储结构要体现数据的逻辑结构,顺序表的存储结构,内存中物理地址相邻的结点一定具有顺序表中的逻辑关系
只要确定了起始位置,表中任一数据元素的地址都通过下列公式得到:
Location(ki) = Location(a1) + (i - 1) * Length; 1 < i < n
其中,Length是元素占用存储单元的长度。
顺序表的基本操作 (c语言)
1. 构建一个空的顺序表
// 1. 分配MAXSIZE大小的数组空间
// 2. 分配失败
// 3. 空表长度置0
Status initList(SeqList *L) {
L->data = malloc(sizeof(ElemType) * MAXSIZE);
if (!L->data) return ERROR;
L->length = 0;
return OK;
}
2. 销毁
// 已知条件: 顺序表L已存在
// 1. 释放存储空间
// 2. 表长度置0
Status destroyList(SeqList *L) {
free(L->data);
L->data = NULL;
L->length = 0;
return OK;
}
3. 置空
// 初始条件:顺序线性表L已存在
// 清空顺序表,只需要将顺序表的长度置为0
Status clearList(SeqList *L) {
/* 将顺序表置为空表,即表长度为0 */
L->length = 0;
return OK;
}
4. 判断是否为空
// 初始条件:顺序线性表L已存在
// 判断L的length是否等于0
Status isEmptyList(SeqList L) {
if (L.length == 0) {
return TRUE;
}else return FALSE;
}
5. 表中数据元素的个数
// 初始条件:顺序线性表L已存在
// 返回L的length,即数据元素个数
Status lengthOfList(SeqList L) {
return L.length;
}
6. 遍历
// 初始条件:顺序线性表L已存在
// 从第一个数据元素,按顺序输出
Status traversList(SeqList L) {
int i;
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
return OK;
}
7. 插入
// 初始条件:顺序线性表L已存在,插入位置i满足 1 < i < lengthOfList(L)
// 1. 判断插入位置是否合法
// 2. 判断存储的空间是否已满
// 3. 插入数据不在表尾, 则先移动出空余位置
// 4. 插入位置后,之后的数据后移1位
// 5. 将新元素e,放入第i位置
// 6. 表中数据元素的个数加一
Status insertList(Seqist *L,int i,ElemType e){
if((i<1) || (i>L->length+1)) return ERROR;
if(L->length == MAXSIZE) return ERROR;
if(i <= L->length){
for(int j = L->length-1; j>=i-1;j--){
L->data[j+1] = L->data[j];
}
}
L->data[i-1] = e;
++L->length;
return OK;
}
8. 删除
// 初始条件:顺序线性表L已存在,删除位置i满足 1 < i < lengthOfList(L)
// 1. 判断删除位置是否合法
// 2. 顺序表是否已为空表
// 3. 删除第 i 位置数据元素
// 4. 表中数据元素的个数减一
Status deleletList(SeqList *L, int i) {
if (i < 1 || i > (L->length + 1)) {
return ERROR;
}
if (L->length == 0) {
return ERROR;
}
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
L->length--;
return OK;
}