线性表学习要点

概述

线性表是一种最基本的数据结构,它不仅有着广泛的应用,而且也是其他数据结构的基础,同时,单链表是贯穿整个课程的基本技术。本章虽然讨论的是线性表,但涉及的许多问题都带有一定的普遍性。因此,本章是本课程的重点和核心,也是其他后续章节的重要基础。本章知识点的组织结构如下图所示:
在这里插入图片描述
蓝色曲线代表要注意二者的区别与比较。

重点/难点/要点

本章重点是:

  1. 顺序存储结构和链接存储结构的基本思想;
  2. 顺序表和单链表的基本算法;
  3. 顺序表和单链表基本操作的时间性能;
  4. 顺序表和链表之间的比较。

本章难点是:

  1. 线性表的抽象数据类型定义;
  2. 基于单链表的算法设计,尤其是要求算法满足一定的时间性能和空间性能;
  3. 双链表的算法设计。

学习要点
1条明线:线性表的逻辑结构一线性表的存储结构→线性表的实现。
对于线性表的逻辑结构,要从线性表的定义出发,抓住要点深刻理解概念,引申出线性表的特性及逻辑特征,最后给出线性表抽象数据类型定义。
对于线性表的存储结构,要把握两条支线:顺序存储结构和链接存储结构,对每种存储结构,从存储思想出发,根据存储示意图理解存储要点,基于存储结构设计线性表抽象数据类型。

4条暗线。

  1. 顺序表和单链表的比较:从存储思想、存储特点、算法实现等方面进行比较,从而深刻理解并掌握两种基本的存储结构,在实际应用中能为线性表选择或设计合适的存储结构。
  2. 顺序表和静态链表的比较:从存储思想、存储特点、算法实现等方面进行比较,从而灵活运用内存中一段连续的存储空间。
  3. 单链表、循环链表和双链表的比较:从存储思想、存储特点、算法实现等方面进行比较,从而理解时空权衡的观点,灵活运用链接存储结构。
  4. 单链表算法的设计模式:在讲完单链表的查找算法后,总结单链表算法的设计模式,并在单链表的插入、删除等算法中应用该模式。

知识点整理

  1. 线性表是0个或多个具有相同类型的数据元素的有限序列。在这个序列中,每个元素最多有一个前驱和一个后继。
  2. 线性表的顺序存储结构称为顺序表,是用一段地址连续的存储单元依次存储线性表的数据元素,通常用一维数组来实现。
  3. 顺序表中数据元素之间的逻辑关系是用存储位置表示的,顺序表是随机存取结构。
  4. 在顺序表上实现插入和删除操作,在等概率情况下,平均要移动表中一半的元素,算法的平均时间复杂度为O(n)。
  5. 顺序表的优点是:无需为表示表中元素之间的逻辑关系而增加额外的存储空间;随机存取。顺序表的缺点是:插入和删除操作需移动大量元素;表的容量难以确定;造成存储空间的“碎片”。
  6. 线性表的链接存储结构称为链表,是用一组任意的存储单元存放线性表的元素,元素的逻辑次序和物理次序不一定相同。
  7. 在单链表中,头指针指向第一个元素所在的结点,具有标识一个单链表的作用;最后一个元素所在结点的指针域为空(图示中用“^”表示),称为尾标志;为了运算方便,在单链表的开始结点之前附设一个类型相同的结点,称为头结点。
  8. 单链表中数据元素之间的逻辑关系用指针表示,单链表是顺序存取结构。
  9. 在单链表上实现插入和删除操作,无需移动结点,在将工作指针指向合适的位置后,仅需修改结点之间的链接关系。
  10. 对顺序表和单链表的比较要考虑时间性能和空间性能两个方面。作为一般规律,若线性表需频繁查找却很少进行插入和删除操作,或其操作和“数据元素在线性表中的位置”密切相关时,宜采用顺序表作为存储结构;若线性表需频繁进行插入和删除操作,则宜采用单链表作为存储结构;当线性表中元素个数变化较大或者未知时,最好使用单链表实现;如果用户事先知道线性表的大致长度,使用顺序表的空间效率会更高。
  11. 循环链表是在单链表中,将终端结点的指针域由空指针改为指向头结点,通常采用尾指针来标识。
  12. 循环链表中没有明显的尾端,需要格外注意循环条件,通常判断用作循环变量的工作指针是否等于某一指定指针(如头指针或尾指针等),以判定工作指针是否周游了整个循环链表。
  13. 双链表是在单链表的每个结点中再设置一个指向其前驱结点的指针域。双链表是一种对称结构,便于实现各种操作。
  14. 静态链表是用数组来描述单链表,用数组元素的下标来模拟单链表的指针(称为游标)。静态链表在插入和删除操作时,只需要修改游标,不需要移动表中的元素。
  15. 间接寻址是将数组中存储数据元素的单元改为存储指向该元素的指针。间接寻址保持了顺序表随机存取的优点,同时改进了插入和删除操作的时间性能。

练习

线性表的逻辑结构
线性结构的基本特征是:每个元素有且仅有一个直接前驱和一个直接后继。(×)
线性表中数据元素类型的抽象性指的是在定义和使用时可以不用确定数据类型。(×)
线性表中数据元素的序号指的是元素在线性表中的位置,这个位置和存储结构有关。(×)
在线性表的抽象数据类型定义中,基本操作的功能、个数、参数均是固定不变的。(×)

线性表的顺序存储
在顺序表中,数据元素的逻辑顺序和存储顺序总是一致的。(√)
在顺序表中,数据元素的存储位置体现了逻辑关系,这是由于(AB)。
A.存储地址连续 B.依次存储数据元素 C.没有采用指针 D.线性表的特性
顺序表是随机存取的存储结构,说明按位置进行查找(B)。
A.在任意时间存取 B.时间性能是O(1) C.随意存储任意元素 D.随机存储任意元素
在顺序表中插入一个元素,移动元素的次数与(AC)有关。
A.插入的位置B.插入的元素值C.线性表的长度D.顺序表空间的大小

线性表的链式存储
设p,q是指针,若p==q,则一定有*p= =*q。(×)
对于变量定义语句“int *p;”,指针变量p的存储单元需要在运行过程中动态分配。(×)
在单链表中,要取得某个元素,知道指向该元素结点的指针即可,因此单链表是随机存取的存储结构(×)
单链表一定要有头指针和尾标志,可以根据需要设置头结点。(√)
在单链表中实现将工作指针p指向下一个结点的语句是(C)。
A.p++;B.p–;C.p=p->next;D.p->next=p;
对于单链表和循环单链表的插入操作,修改指针的语句完全相同。(√)
在头指针指示的带头结点的循环双链表中,开始结点是(B),终端结点是(C)。
A.first B.first->next C.first->prior D.first->next->next
已知指针p指向单链表中某结点,可以在O(1)时间内在结点p之前插入一个结点。(×)
已知指针p指向单链表中某结点,可以在O(1)时间内在结点p之后插入一个结点。(√)
已知指针p指向双链表中某结点,可以在O(1)时间内在结点p之前插入一个结点。(√)
已知指针p指向双链表中某结点,可以在O(1)时间内在结点p之后插入一个结点。(√)
将结点s插入到单链表中结点p和q之间,需要修改两个指针,修改语句之间没有顺序要求。(√)

顺序表与链表比较
线性表的顺序存储结构优于链接存储结构。(×)
单链表由于采用动态存储分配使得操作比较灵活,因而优于顺序表。(×)
通常来说,顺序表的存储空间利用率要高于单链表。(×)
在单链表中执行插入操作不用移动元素。(√)A.正确B.错误
顺序表没有存储数据元素之间的逻辑关系,因而空间利用率较高。(×)

参考资料:《数据结构(从概念到C++实现)》清华大学出版社,王红梅

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oldmao_2000

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

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

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

打赏作者

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

抵扣说明:

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

余额充值