了解线性表(线性存储结构)这一篇就够了!!

什么是线性表?

线性表是最简答、最常用的一种数据结构。它是n个类型相同数据元素的有限序列,对于n大于0,除了第一个元素无直接前驱,最后一个元素无直接后继外,其余每个数据元素都只有一个直接前驱和一个直接后继,数据元素直接具有一对一的关系。如下图所示
在这里插入图片描述
线下表有如下几个特点:
1、同一性。线性表由同类型数据元素组成,每一个元素都必须属于同一类型数据。
2、有穷性。线性表由有限个数据元素组成,表长度就是表中数据元素的个数
3、有序性。线性表中相邻数据元素之间存在着序偶关系

线性表的两种实现方式

·顺序存储结构

线性表的顺序存储结构是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理存储单元中,简单的说就是可以通过数据元素物理存储的连续性来反映数据元素之间逻辑上的相邻关系。如下图所示
在这里插入图片描述

·链式存储结构
1、单链表

链表是用一组任意的存储单元来存储线性表中的节点,这组存储单元可以是连续的,也可以是非连续的,甚至可以零散的分布在内存的任何位置上。因此,链表中节点的逻辑顺序与物理顺序不一定相同。为了正确的表示节点之间的逻辑关系,必须在存储线性表中每个数据元素值的同时,存储指示其后继节点的地址,这两部分信息组成的存储映像称为节点(Node)。如下图所示
在这里插入图片描述
节点包括两个域:数据域用来存储节点的值,指针域用来存储数据元素的直接后继的地址。线性链表正是通过每个节点的指针域将线性表的n个节点按其逻辑顺序连接在一起。由于此线性链表的每个节点只有一个next指针域,故将这种链表称之为单链表。如下图所示

在这里插入图片描述
单链表中每个节点的存储地址存放在其前驱节点的指针域中,由于线性表中第一个节点无前驱,所以应设一个头指针H指向第一个节点。由于线性表中最后一个元素没有直接后继,指定单链表的最后一个节点的指针域为空(NULL)

2、循环链表

循环链表是一个首尾相接的链表。将单链表最后一个节点的指针域由NULL改为指向头表结点,就得到了单链表形式的循环链表,并称为循环单链表。
在循环链表中,表中所有的节点都在链在一个环上,为使某些操作实现方便,在循环单链表中也可以设置一个头结点。这样,空循环链表仅由一个自成循环的头结点表示。如下图所示
在这里插入图片描述

3、双向链表

循环单链表虽然能从任意一节点出发沿着链找到其前驱节点,但耗费时间是O(n)。如果希望能从表中快速确定一个节点的前驱,另一个解决方法就是向单链表的每个节点增加一个指向前驱的指针域(prior)。这样形成的链表中就有两条方向不同的链,称之为双向链表。如下图所示
在这里插入图片描述
与单链表类似,双链表也可以增加头结点使双链表的某些运算变的方便。同时,双向链表也可以有循环链表,称为双向循环链表。如下如所示
在这里插入图片描述

总结

通过本文的学习,相信读者已经对顺序存储结构和链表存储结构有了一个基本的认知。作为一名优秀的攻城狮,仅仅阅读此篇文章是不够的。希望读者可以通过代码自己实现这两种存储结构,加深自己的理解,同时,肯定会有所更多的收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值