线性表(linear list)
线性表是n个类型相同数据元素的有限序列,通常记作(a,…,a,a,a,…,a)。
1.相同数据类型
在线性表的定义中,线性表的n个数据元素具有相同的数据类型。
比如都是数字,如(1,2,3,4,5);
也可以都是字符,如(A,B,...,Z);
还可以是具有更复杂结构的数据元素,如学生,图书,商品。
相同的数据类型意味着在内存中存储时,每个元素会占用相同的内存空间,便于后续的查询定位。
2.序列(有序性)
在线性表的相邻数据元素之间存在着徐偶关系。
即a是a的直接前驱,则a是a的直接后续,
同时a又是a的直接前驱,a是a的直接后继。
唯一没有直接前驱的元素a一端称为表头,
唯一没有直接后续的元素a一端称为表尾。
除了表头和表尾元素外,任何一个元素都有且仅有一个直接前驱和直接后继。
3.有限
线性表中数据元素的个数n定义为线性表的长度,n是一个有限值。
当n=0时线性表为空表。
在非空的线性表中每个数据元素在线性表中都有唯一确定的序号,如a的序号是0,a的序号是i。
在一个具有n>0个数据元素的线性表中,数据元素序号的范围是[0,n-1]。
线性表的逻辑结构
线性表的存储结构
1.顺序表-------顺序存储结构
特点:在内存中分配连续的空间,只存储数据,不需要存储地址信息,位置就隐含着地址。
优点:
1.节省存储空间,数据是连续存放的,命中率比较高。
2.索引查找效率高,即一个结点对应一个序号,由该序号可以直接计算出结点的存储地址。
假设线性表的每个数据元素需占用K个存储单元,并以元素所占的第一个存储单元的地址作为数据元素的存储地址。
线性表的i号元素a的存储地址为
LOC(a) = LOC(a) + i*K
其中LOC(a)为0号元素a的存储地址,通常成为线性表的起始地址。
缺点:
1.插入和删除操作需要移动元素,效率较低。
2.必须提前分配固定数量的空间,如果存储元素少,可能导致空闲浪费。
3.按照内容查询效率低,因为需要逐个比较判断。
时间复杂度 :查找操作为O(1) ,插入和删除操作为O(n)。
2.链表------链式存储结构
特点:该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。
每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的链接关系反映出来。
逻辑上相邻的节点物理上不必相邻。
优点:
1.插入、删除灵活,不必移动节点,只需改变指针指向即可。
2.不用事先开辟内存,有元素才会分配内存空间。
3.内存利用率较高。
缺点:
1.比顺序存结构的存储密度小(需占用额外的空间存储指针,比较浪费空间)。
2.查找结点时链式存储要比顺序节点慢(每个节点地址不连续,查找时需循环链表)。
时间复杂度 :查找操作为O(n) ,插入和删除操作为O(1)。