线性表是信息表的一种形式,表中元素之间满足线性关系,是一种最基本最简单的数据结构。
线性表是由n(n≥0)个具有相同特性(同一类型)的数据元素(结点)a1,a2,…,an组成的有限序列的线性结构。当n=0时,称为空表;当n>0时,将非空的线性表记作(a1,a2,…,an),其中a1称为线性表的首结点,an称为线性表的尾结点。
线性表的主要特点是数据元素之间存在一对一的线性关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。具体来说,除第一个元素外,每个元素都有一个且仅有一个直接前驱;除最后一个元素外,每个元素都有一个且仅有一个直接后继。这种一对一的线性关系体现了数据元素之间的位置关系,使得线性表中的数据元素呈现出一种有序的、连续的排列方式。
根据数据结构逻辑层次上的分类,线性表可分为一般线性表和受限线性表。一般线性表可以自由地删除或添加结点,而受限线性表则对结点的操作有所限制,例如栈(先入后出)和队列(先入先出)就是受限线性表的典型代表。
从存储结构上来看,线性表可以分为顺序表和链表两种类型。
顺序表在内存中占用一段连续的存储空间,存储密度高,通过下标来访问元素,操作效率较高,但对表的插入和删除的效率较低。由于顺序表使用的是一段连续的存储空间,所以当数据足够大时,也可能会造成空间元素不够的问题。
链表则通过指针或引用将元素链接在一起,不需要占用连续的存储空间,但在访问元素时需要从头结点开始遍历,操作效率相对较低。链表又分为单链表、单向循环链表、双向链表、双向循环链表,循环链表与普通链表的差距在于循环链表中存在环。
顺序表更适合于元素数量基本确定且操作主要是访问的场景,如静态数组或查找表等。
链表更适合于需要动态调整大小且操作主要是插入和删除的场景,如动态数据结构或需要频繁修改的数据集合等。