2.线性表
线性表
线性表的定义——零个或多个数据元素的有限序列
线性表特点:
-
数据元素之间是有序的
-
数据元素之间是一对一的关系
-
有限性(线性表的数据元素个数是有限的)
注意:零个数据元素的有限序列被称为空表
线性表的数据元素个数是有限的
线性表的抽象数据类型
ADT 线性表(List) Data 1、线性表数据元素是一个集合{a_1,a_2,a_3....,a_n},数据元素的类型 DataType(int,char,自定义) 2、前驱——除了第一个元素a_1之外,每个元素有且只有一个直接的前驱元素 3、后继——除了最后a_n之外,每个元素有且只有一个直接的后继元素 4、每个数据元素之间的关系是一对一的关系 Operation InitList(*List) 创建一个空的线性表List InsertElement(*List, index,elem) 在线性表List的 index下标处插入元素elem DeleteElement(*List,index,*elem) 删除线性表List中第i个元 素,并返回删除元素的指针e GetLenght(*List) 返回线性表的元素个数 IsEmpty(*List) 检查是否是空的线性表 ClearList(*List) 清除线性表 GetElement(*List,index,*elem) 返回该下标index对应的元素 endADT
线性表的顺序存储
线性表的顺序存储结构,是指用一段地址连续的存储单元依次存储线性表的数据元素
1、我们需要定义线性表的最大存储空间 # define MAX_SIZE 255 2、线性表里需要有统一类型的元素集合 typedef int ElemType;起别名 int————ElemType 例如: typedef struct{ int id; char *name; }ElementType; 3、定义顺序表结构 typedef struct{ ElementType datas[MAX_SIZE]; int length; }
描述线性表的顺序存储结构需要三个属性:
-
存储空间的起始位置:数组datas的存储位置
-
线性表的最大存储容量:数组长度MAX_SIZE
-
线性表的当前长度:length
地址计算方法: 下标是从零开始的
第n个元素的内存地址 = 数组的内存地址 + 第n个元素的下标n-1
访问顺序表的元素: 可用 *(datas + 0) 访问第一个元素 一直到 *(datas + n-1)最后一个元素 position 位置,从1开始 index 下标,从0开始
顺序结构的插入与删除
顺序表插入数据元素
将数据元素a插入到顺序表(a_1,a_2,a_3,...,a_i,a_i+1,..,a_n)下标为i的位置
下标为i及下标为i以后的所有数据元素后移
下标i的位置放入数据元素a
注意:
-
插入元素后的顺序表长度变为n+1;
-
插入元素后,最后一个元素的下标变为n;
-
C语言数组实现时,顺序表长度不能超过它的最大长度;
顺序表删除数据
将第i个数据元素从顺序表(a_1,a_2,....,a_i,a_i+1,..,a_n)中删除
-
找到第i个位置的数据元素
-
将第i个数据元素以后的数据元素依次覆盖前一个位置
-
顺序表当前长度减1
线性表顺序存储结构的优点:
-
无需为表示 表中元素之间的逻辑关系而增加额外的存储空间
-
可以快速地存取表中任意位置的元素
线性表顺序存储结构的缺点:
-
插入和删除操作需要移动大量的元素
-
当线性表长度变化较大时,难以确定存储空间的容量
-
造成空间的“碎片”