线性表结构
一、线性表的定义
线性表的长度是有限的,是一个有顺序的序列,每一个元素知道他的前面是谁,他的后面是谁。
二、线性表的顺序存储结构
1、顺序表其实就是数组,为什么称其为顺序表,就因为它是用一组地址连续的存储单元依次存储线性表的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理存储单元中,即通过数据元素物理存储的连续性来反映数据元素逻辑上的相邻关系。
顺序表的封装需要三个属性:
三、线性表的链式存储结构
链表结构的每个节点数据都由两个域组成,一个是存放实际数据元素的数据域,另一个就是构成链式结构的指针域,指针域存储了当前节点指向的直接后继的指针地址。
链式存储结构的出现解决了顺序存储结构在插入和删除操作时需要移动大量元素的缺点。顺序存储结构只需要存储数据信息就可以了,链式存储结构还会存储该元素的后继元素的存储地址。
链式存储结构也是有头有尾的,链表的第一个结点的存储位置叫做头指针,在第一个结点的前面在附设一个结点,称为头结点,头结点不存储数据,它的指针域存储指向第一个结点的指针。
链式存储结构中,我们需要弄清楚以下两个概念:
头指针:头指针是指向链表的第一个结点的指针,若链表有头结点,则是指向头结点;
头指针具有标识作用,所以常用头指针冠以链表的名字;
无论链表是否为空,头指针都不为空,头指针是链表的必要元素。
头结点:头结点是为了操作的统一和方便而设立的,放在第一元素结点之前,其数据域一般无意义(可存放链表的长度);
头结点的存在让对第一元素的插入和删除操作和其他元素都统一了起来;
头结点不一定是链表必需元素
其中,链式存储结构中可有以下三种存储方法:
1、单链表
单链表中的每个节点中只包含一个指针域,所以叫做单链表。对于线性表来说,总得有个头有个尾,链表也不例外。我们把链表中的第一个节点的存储位置叫做头指针,最后一个节点指针为空(NULL)。
2、双链表
双向链表的指针域在前面说过,它有两个指针域,一个指针域指向本节点的直接前驱,另一个则指向直接后继
3、循环链表
循环链表是一个首尾相接的链表。将单链表最后一个节点的指针域有NULL改为指向表头节点,就得到了单链形式的循环链表,并成为循环单链表。对于循环单链表,若经常要在首尾两端进行操作,则可以设一个尾指针在表尾
四、静态链表
有些早起的高级编程语言由于没有指针这一特性,所以就无法使用链表结构,那么就引入了静态链表这一概念,静态链表就是将数组做成链表的模式,它的每一个下标都由data和cur两个数据域,data用来存数据元素,cur类似于链表的next指针,存放该元素的后继元素的下标。在使用静态链表的时候需要对第一个元素和最后一个元素做特殊处理,这两个位置都不存数据,第一个元素存放第一个空位置的下标,最后一个元素存放数组第一个元素的下标;对于已存放的元素,最后一个元素的cur存0。静态链表优缺点:优点:插入和删除时只用修改游标,不用移动元素。缺点:表长难以确定,失去了顺序存储结构的随机存储的特点总的来说,静态链表是为了给没有指针的高级语言而设计的一种实现单链表的能力。五、链式存储结构与顺序存储结构优缺点
1、存储分配方式
顺序结构用一段连续的存储单元依次存储线性表的数据元素
链式结构用一组任意的存储单元存放线性表的元素
2、时间性能
1)查找
顺序结构:O(1)
链式结构:O(2)
2)插入和删除
顺序结构:平均需要移动表长一半的元素,所以为O(n)
链式结构:直接根据指针进行操作,所以为O(1)
3、空间性能
顺序结构需要预分配存储空间,所以可能出现分配的空间过大二浪费,或者不够用的情况
链式结构不需要分配存储空间,只要有就可以分配,而且元素个数也不受限制
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步