线性表
一个复杂的线性表中,一个数据元素可由若干个数据项组成
线性表的抽象数据类型
ADT 线性表(List)
data
...
Operation
...
endADT
- 线性表的数据对象集合为 {a1, a2, …, an} ,每个元素的类型均为 DataType
- 除第一个元素 a1 外,每个元素有且只有一个直接前驱元素
- 除最后一个元素 an 外,每个元素有且只有一个直接后继元素
- 数据元素之间是一对一的关系
Operation | explanation |
---|---|
InitList(*L) | 初始化,建立一个空的线性表 L |
ListEmpty(L) | 判断是否为空,是则返回 true 否则返回 false |
ClearList(*L) | 清空 |
GetElem(L, i, *e) | 将 L 中第 i 个位置元素返回给 e |
LocateElem(L, e) | 查找与 e 相同的元素,找到返回该元素序号,否则返回 0 |
ListInsert(*L, i, e) | 在 L 的 i 位置插入元素 e |
ListDelete(*L, i, *e) | 删除 L 中第i位置元素,并用 e 返回其值 |
ListLength(L) | 统计表中元素个数 |
顺序存储结构
#define MAXSIZE 20 // 线性表的最大存储容量
typedef int ElemType;
typedef struct {
ElemType data[MAXSIZE]; // 存储空间起始位置,它的存储位置即为存储空间的存储位置
int length; // 线性表的当前长度
}SqList;
数组长度 线性表长度:
- 数组长度为存放线性表的存储空间长度,分配空间后这个长度大小一般不变
- 线性表长度是线性表中元素个数,经过一系列操作这个个数可以变化
- 数组长度 >= 线性表长度
- 存储器中的每个存储单元都有自己的编号,称为地址(address)
取值 插入 删除 打印
#include <iostream>
#define MAXSIZE 20 // 数组最大长度
#define OK 1 // 表示操作结果
#define ERROR 0 // 表示操作结果
typedef int Status; // 状态,用于返回函数执行结果,有效值为TRUE OR FALSE
typedef int ElemType; // 表示数组存放的数据类型,根据实际情况更改
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList; // 线性表定义
using namespace std;
/* 获取数组元素 */
Status GetElem(SqList L, int i, ElemType* e) {
if (L.length == 0 || i<1 || i>L.length) {
return ERROR;
}
*e = L.data[i - 1];
return OK;
}
/*删除数据,参数为 线性表 L 的地址,需要删除的元素的位置 i*/
Status ListDelete(SqList* L, int i) {
if (L->length == 0) {
return ERROR;
}
if (i<1 || i>L->length) {
return ERROR;
}
if (i <= L->length) {
for (int j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j];
}
}
L->length--;
return OK;
}
/*插入数据,参数为 线性表 L 的地址,需要添加的元素的位置 i,需要添加的元素 e*/
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->data[j + 1] = L->data[j];
}
}
L->data[i - 1] = e;
L->length++;
return OK;
}
void ListPrint(SqList L) {
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
cout << endl;
}
int main() {
SqList s;
s.length = 0; // 不先初始化线性表长度为 0 会报错
return 0;
}
- 在存取数据时,时间复杂度为 O(1);插入删除数据时,时间复杂度为 O(n)
优缺点
优点 | 缺点 |
---|---|
无需为表示表中元素之间的逻辑关系 而增加额外的存储空间 | 插入删除需移动大量元素 |
可以快速地存取表中任一位置元素 | 当线性表长度变化较大时,难以确定存储空间的容量 |
造成存储空间“碎片” |
回顾的时候去用类实现