线性表结构是最常用且最简单的一种数据结构。简言之,一个线性表是n个数据元素的有限序列。至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个符号,也可以是一页书,甚至其他更複杂的信息。在稍複杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称档案。
基本介绍
- 中文名:线性表结构
- 外文名:Linear-list Structure
- 学科:计算机
- 定义:是n个数据元素的有限序列
- 领域:数据结构
- 有关术语:顺序表、鍊表
简介
线性表结构是n个数据元素的有限序列,是一个种线性结构。线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素;(2)存在惟一的一个被称做“最后一个”的数据元素;(3)除第一个之外,集合中的每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。常见的线性表结构有顺序表、鍊表。
顺序表
顺序表是在计算机记忆体中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
存储结构
/* 线性表的动态分配顺序存储结构 */
#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */
#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */
typedef struct
{
ElemType *elem; /* 存储空间基址 */
int length; /* 当前长度 */
int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
}SqList;
鍊表
鍊表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,鍊表在插入的时候可以达到O(1)的複杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间複杂度分别是O(logn)和O(1)。
使用鍊表结构可以克服数组鍊表需要预先知道数据大小的缺点,鍊表结构可以充分利用计算机记忆体空间,实现灵活的记忆体动态管理。但是鍊表失去了数组随机读取的优点,同时鍊表由于增加了结点的指针域,空间开销比较大。
在计算机科学中,鍊表作为一种基础的数据结构可以用来生成其它类型的数据结构。鍊表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的连结("links")。鍊表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁碟上顺序,数据的访问往往要在不同的排列顺序中转换。而鍊表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(连结)。鍊表允许插入和移除表上任意位置上的节点,但是不允许随机存取。鍊表有很多种不同的类型:单向鍊表,双向鍊表以及循环鍊表。
双向鍊表
也叫双鍊表,是鍊表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向鍊表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环鍊表。
循环鍊表
循环鍊表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环鍊表中的任何一个结点出发都能找到任何其他结点。循环鍊表的操作和单鍊表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
单向鍊表
鍊表中最简单的一种是单向鍊表,它包含两个域,一个信息域和一个指针域。这个连结指向列表中的下一个节点,而最后一个节点则指向一个空值。
一个单向鍊表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向鍊表只可向一个方向遍历。
鍊表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存一个特殊的结束标记,另外在一个固定的位置保存指向第一个节点的指针,有的时候也会同时储存指向最后一个节点的指针。一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。但是也可以提前把一个节点的位置另外保存起来,然后直接访问。当然如果只是访问数据就没必要了,不如在鍊表上储存指向实际数据的指针。这样一般是为了访问鍊表中的下一个或者前一个(需要储存反向的指针,见下面的双向鍊表)节点。
相对于下面的双向鍊表,这种普通的,每个节点只有一个指针的鍊表也叫单向鍊表,或者单鍊表,通常用在每次都只会按顺序遍历这个鍊表的时候(例如图的邻接表,通常都是按固定顺序访问的)。
结构特点
1.均匀性:虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度。
2.有序性:各数据元素线上性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素(直接前驱)和后面均只有一个数据元素(直接后继)。