入门数据结构——线性表(概念向)

前言

前面两篇博客分别学习了数据结构和算法相关的概念和术语,这篇博客就来学习数据结构中最常见和最常用的入门级数据结构——线性表。

什么是线性表?

线性表,顾名思义,就是具有线的性质的表格,很抽象是吧,先别急。
我们来看一下正式定义:

线性表(List):零个或多个数据元素的有限序列。

定义中我们需要注意的点有两个:

  1. 序列:线性表是一种数据结构,它由数据组成,并且数据元素之间是有顺序的,若表中存在多个元素,则第一个元素无前驱,最后一个元素无后继,其余元素有且只有一个前驱和后继。在这里插入图片描述
  2. 有限:线性表强调有限。不仅仅是线性表,事实上,在计算机中处理的对象都是有限的,那种无限的数列只存在于数学的概念当中,一方面计算机的内存容量远远做不到容纳无限数据;另一方面,在现实问题上没必要处理无限的数据。

在线性表中,数据元素呈线性排列且一一对应,故此得名。

以下为一些线性表的术语:

记线性表为a1, a2, a3, a4, …, ai-1, ai, ai+1, …, an。
直接前驱:表中ai-1领先于ai,所以称ai-1ai的直接前驱。
直接后驱:表中ai领先于ai+1,所以称ai+1ai的直接后继。
表长:表中的n指线性表的长度,特别地,n=0时,称为空表
位序:在非空线性表中,每个元素都有一个确定的位置,而i为元素ai在线性表中的位序。

另外,在较为复杂的线性表中,一个数据元素可以由若干个数据项组成。如下图:
在这里插入图片描述

线性表的抽象数据类型定义

ADT 线性表(List)
Data
	线性表的数据对象集合为 { a1, a2, a3, …, an },每个元素的类习惯均为DataType。
	其中,除第一个元素a1外,每个元素有且只有一个直接前驱元素,
	除了最后一个元素an外,每个元素有且只有一个直接后继元素。
	数据元素之间是一一对应的关系。
Operation
	InitList(*List):初始化操作,建立一个空的线性表L。
	ListEmpty(*Lust):若线性表为空,返回true,否则返回false。
	ClearList(*List):将线性表清空。
	GeiElem(L, i, *e):将线性表L中的第i个元素值返回给e(输出型参数)。
	LocateElem(L, e):在线性表中查找给定值e,
					  如果查找成功返回该元素在表中的序号;
					  否则,返回-1表示查找失败。
	ListInsert(*L, i, e):在线性表L中的第i个位置插入一个新元素。
	ListDelete(*L, i, *e):删除线性表L中第i个位置元素,并用e返回其值。
	ListLength(L):返回线性表L的元素个数。

线性表的顺序存储结构

定义

线性表根据其存储在计算机中的物理结构,主要分为两种:

  1. 顺序存储结构,又称 “顺序表”。
  2. 链式存储结构,又称 “链表”。

我们先来看第一种的定义

线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表中的数据元素。

看完顺序表的定义是不是感觉有点眼熟,特别是学习C语言的朋友,没错就是数组
在这里插入图片描述
用数组来实现顺序表就是把第一个数据元素存到数组下标为0的位置当中,接着把线性表中相邻的元素存储在数组中相邻的位置。

此外,顺序表中的元素要严格按照从左到右的顺序依次存放,不能出现间隔存放,如:在这里插入图片描述

静态顺序表

在这里插入图片描述

动态顺序表

在这里插入图片描述

线性表的链式存储结构

定义

链表为何被称为链表?我们来对比一下下面这两幅图就知道了(假设数据都是int类型)
在这里插入图片描述

  • 第一幅图是一个长度为4的顺序表,每个元素的地址间相差4Byte,它们在内存上是连续的。
  • 第二幅图是一个长度为4的单向链表,每个数据元素都含有一个指针变量的数据项,存放了下一个元素的地址,并且它们每个元素之间的地址不一定是相连的。

像这样的,物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过指针链接次序实现的线性表,我们称之为 “链表”。

术语

  1. 结点:链表中的数据元素被称为 “结点”。
  2. 数据域:把数据元素中存取数据信息的区域称为 “数据域”。
  3. 指针域:把存储直接后继位置的域称之为 “指针域”。
  4. 指针(链):把指针域中的地址称之为 “链”。
  5. 头指针:指存储链表第一个结点地址的指针变量。
  6. 哨兵位头节点:有时为了操作方便,会在第一个结点前面再加一个结点且该结点不会存储任何有效信息,该节点我们一般称之为 “哨兵位头节点”。
  7. :最后一个结点的没有直接后继结点,则该节点的指针域为 “空”,通常用NULL^表示。
    在这里插入图片描述

链表的分类

链表的结构十分多,主要有三大类的排列组合

  1. 单向 or 双向
    在这里插入图片描述
  2. 带头 or 不带头
    在这里插入图片描述
  3. 循环 or 非循环
    在这里插入图片描述
    虽然经过排列组合之后数量达8种之多,但是常用的链表结构只有无头单向非循环链表带头双向循环链表

总结

这篇博客首先介绍了什么是线性表并给出了线性表的抽象数据类型定义,然后根据线性表存储在计算机当中的物理结构将线性表分成两种,“顺序表” 和 “链表”。顺序表根据数组长度可变和不可变又分成了 “静态顺序表” 和 “动态顺序表”。链表根据其三个特征又可以组合成八种结构。
这篇博客更多的是关于概念性的东西,接下来的博客将会一一将顺序表、链表常用的结构一一实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值