顺序表与链表——数据结构详细讲解

本文主要内容:线性表的逻辑结构、存储结构和线性表的基本操作 (理论知识)

导语:每当我们接触一个新的数据结构时,我们往往从三方面展开学习,分别是:逻辑结构存储结构/物理结构和该数据结构的基本操作

线性表学习框架
知识框架

一、线性表的定义

线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。其中的n就为表长,当n=0时线性表是一个空表。线性表一般表示为 L = ( a 1 , a 2 , . . . , a i , . . . , a n ) . L = (a_1,a_2,...,a_i,...,a_n). L=(a1,a2,...,ai,...,an).
a1是表头元素,an是表尾元素。除了表头元素外,每个元素都有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继
线性表图示

(1)线性表的逻辑结构

由上述线性表的定义可以总结出:线性表是表示元素之间一对一的相邻关系的逻辑结构。

(2)线性表的基本操作

导语:一个数据结构的基本操作是指其最核心、最基本的操作。其他较为复杂的操作可通过调用其基本操作来实现。

线性表的基本操作如下所示:
InitList(&L);//初始化表。构造一个空的线性表。
Length(L);//求表长。返回线性表L的长度,即L中数据元素的个数。
LocateElem(L,e);//按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i);//按位查找操作。获取表L中第i个位置的元素的值。
ListInsert(&L,i,e);//插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e);//删除操作。删除表L中的第i个位置的元素,并用e返回删除元素的值。
PrintList(L);//输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L);//判空操作。若L为空表,则返回true,否则返回false。
DestoryList(&L);//销毁操作。销毁线性表,并释放线性表L所占用的内存空间。

线性表的基本操作代码见文章:【待补充】

二、线性表的实现

(1)线性表的存储结构

上面说过,线性表是一种逻辑结构,表示元素之间一对一的相邻关系。而顺序表和链表指的是存储结构。要注意区分之两个概念。

(2)线性表的顺序实现——顺序表

线性表的顺序存储又称线性表。它是用一组地址连续的存储单元一次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。也就是说,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同

顺序表结构如下图所示,注意,图中的地址是用十六进制表示的,图中的i和n同样表示十六进制的序列号。
顺序表

(3)线性表的链式实现——链表

线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。

为了建立数据元素之间的线性关系,对于每个链表节点,除存放元素自身的信息外,还需要存放一个指向其后继的指针。单链表节点结构如下图所示:
单链表结点结构
由于顺序表在存储时需要占用大量连续存储单元,可能就会出现找不到一片连续的存储单元的情况。单链表的元素离散的分布在存储空间中,利用单链表就可以解决顺序表需要大量连续存储单元的缺点。

线性表结构如下图所示:
l链表

1)头结点与头指针

我们通常用头指针来标识一个单链表,如单链表L,当头指针为NULL时表示空表。为了操作上的方便,在单链表第一个节点之前附加一个节点,称为头结点
头结点和头指针的区分:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的链表中的第一个节点,节点内通常不存储信息。(也就是说,没有头结点时,头指针指向链表第一个结点有头结点时,头结点就是第一个结点,头指针指向头结点

带头结点的单链表如下图所示:
带头结点的单链表

顺序表与链表的优缺点对比见文章:顺序表与链表的优缺点对比分析

本文为个人学习总结所写,如有问题欢迎评论区指正。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HePingxxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值