线性表的定义与实现

简介: 线性结构是最基本和最常用的一种,它表示的是线性结构,元素之间存在一对一的关系,数据元素之间按照某种规定存在一个顺序关系。


一、定义



假设有  个同类型数据元素的有限序列,记为:

它构成一个线性表,任何一种逻辑结构都可以使用顺序存储和链式存储来实现,使用顺序存储时,会在内存中分配连续的空间来存储数据元素,在程序中经常使用数组来实现。

但很多时候无法知道预先分配多大的空间合适,如果数据量较大时,内存中不存在那么大的连续空间,所以会导致内存分配失败,此时就可以使用链式存储来实现。

链式存储可以使用任何地址的空间存放数据元素,可以空间不连续,它存放的数据结点,里面包含数据元素和指向另一个数据元素的引用(或指针)。


微信图片1000.png


二、线性表基本操作



数据结构包含数据的基本操作,使用不同的存储结构来实现线性表的插入、删除、查找、遍历等基本操作。


1. 插入


初始化一组数据  ,然后在  后面插入数据  。

顺序存储中,定位到  ,需要将  往后移动才能插入。

微信图片999.gif

链式存储中,定位到  ,然后把  的指针指向  ,再把  的指针指向  就完成了新节点的插入。

微信图片888.gif

由此可得链表比顺序表插入的效率高。

顺序存储需要预先分配内存空间,在插入时初始化的空间不够会抛异常。


2. 删除


初始化一组数据  ,然后删除数据  。

顺序存储中,定位到  删除并释放内存,然后将  往前移动。

微信图片777.gif

链式存储中,定位到  ,然后把  的指针指向  ,释放内存即可删除。

微信图片666.gif

由此可得链表比顺序表删除的效率高。


3. 查找


初始化一组数据  ,然后查找数据  。

顺序存储中,数据在内存中是连续的,如果已知  的下标,可以直接获取到该数据元素。

在下标未知的情况下,也可以通过遍历来查找。

微信图片555.gif


image.gif链式存储中,数据在内存中是无序的,不能通过下标查找,只能通过遍历来查找数据。

而链式存储在遍历的时候,会增加寻址的操作。

微信图片444.gifimage.gif

由此可得顺序表比链表查找的效率高。


4. 遍历


初始化一组数据  ,然后遍历所有数据 。

顺序存储中,遍历连续内存空间上的数据元素。

微信图片333.gif

image.gif

链式存储中,通过地址引用来找到下一个数据元素,来遍历所有数据。


微信图片222.gif

链式存储增加了寻址的操作,所以遍历的效率低于顺序存储。


三、链式存储扩展



前面讲的链式结构实现的线性表都是单向链表,可以增加结点的引用来创建更多的链表结构,比如:双向链表、单向循环链表和双向循环链表等。

微信图片111.png


四、代码示例



具体的代码实现如下:

Gitee:https://gitee.com/code_artist/DataStructure

GitHub:https://github.com/AiJiangnan/DataStructure

目录
相关文章
|
6月前
|
存储 C语言
【数据结构】顺序表的定义和运算
【数据结构】顺序表的定义和运算
157 0
|
1月前
|
存储 C语言 索引
你真的了解线性表中的顺序表了吗?(静态与动态顺序)
你真的了解线性表中的顺序表了吗?(静态与动态顺序)
44 0
|
2月前
|
存储 索引
数据结构练习之线性表定义与操作
有限序列:这意味着序列的长度是固定的,不会无限延伸,这与计算机资源的限制相符。在实际应用中,数据结构的大小通常是有限制的,因为内存和存储资源是有限的。
40 4
|
3月前
|
存储
顺序表以及实现(结构篇)
顺序表以及实现(结构篇)
55 11
|
6月前
|
存储
线性表、链表、栈和队列的初始化
线性表、链表、栈和队列的初始化
41 1
|
6月前
|
存储
线性表的概念
线性表的概念
90 2
|
11月前
|
存储
数据结构 2.1 线性表的定义和基本操作
数据结构 2.1 线性表的定义和基本操作
61 0
|
存储
05 顺序表的结构与实现
05 顺序表的结构与实现
37 0
|
人工智能 C语言
线性表的定义和基本操作
线性表的定义和基本操作
140 0
|
人工智能
线性表的定义和基本操作(三)
线性表的定义和理解,和一些基本的操作,并且有例题
104 0