线性表 Linear List
什么是线性表
线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,n为表长,当n为0时,我们称该线性表是一个空表。
重要概念:
- ai是线性表中的第i个元素,i指的是位序,位序从1开始
- a1是表头元素,an是表尾元素
- 除第一个元素外,每个元素都有且仅有一个直接前驱(就是紧挨着该元素之前的一个元素);除最后一个元素外,每个元素都有且仅有一个直接后继(就是紧挨着该元素之后的一个元素)
顺序表
顺序表就是用顺序存储方式实现的线性表。
把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
顺序表的特点
- 随机访问,即可以在O(1)时间内找到第i个元素
- 存储密度高,每个节点只存储数据元素(相比于链表,链表还要存放指向下一个元素的指针)
- 拓展容量不方便(即使采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
- 插入、删除操作不方便,需要移动大量的元素
顺序表的实现——静态分配
存储空间是静态的,顺序表的表长从最开始确定过后就无法更改
#define Maxsize 10//顺序表的长度
typedef stuct{
Elemtype data[MaxSize];//静态分配
int length;//顺序表当前的长度
}SqList;//顺序表的类型定义
//基本操作——初始化一个顺序表
void InitList(SqList &L){
for(int i=0;i<MaxSize;i++){
L.data[i]=0;//将所有数据元素默认设置为0,如果不设置默认值,程序中可能会有以前遗留脏数据
}
L.length=0;//顺序表初始长度为0
}
int main(){
SqList L;
InitList(L);
}
顺序表的实现——动态分配
c语言中提供了malloc和free函数动态申请和释放内存空间
malloc函数返回一个指针,需要强制转换为你所定义的数据元素类型指针:L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
#include<stdlib.h>///malloc、free函数的头文件
#define InitSize 10//顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SeqList;//顺序表的类型定义(动态分配方式)
void InitList(SeqList &L)</