数据结构线性表

发布时间 2024-01-09 22:35:13作者: W_K_KAI

线性表的两种存储结构:

1.顺序存储(线性表若采用链式存储结构时,内存中可用存储单元的地址连续或不连续都可以

2.链式存储(线性表若采用顺序存储结构时,必须占用一片连续的存储单元

线性表的顺序存储结构

顺序存储结构在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。当然,它的优缺点还不只这些……

优点:

存储密度(存储利用率)高
无需为表示表中元素之间的逻辑关系而增加额外的存储空间
可以快速地存取表中任一位置的元素

缺点:
插入删除操作需要移动大量元素
当线性表长度变化较大时,难以确定存储空间的容量
造成存储空间的碎片

线性表l在什么情况下适用于使用链式结构实现

线性表(linear list)是一种数据结构,它由零个或多个数据元素组成,这些元素按照线性顺序排列,并且每个元素都与其前驱元素和后继元素相连。有时候,线性表需要使用链式结构来进行实现,具体的情况如下:

插入和删除操作频繁

当需要频繁地进行插入和删除操作时,使用链式结构会更加方便。因为在顺序表中,每次插入或删除元素都需要移动其他元素,效率相对较低。而链式结构则只需要改变相邻元素的指针不需要移动元素。

线性表的长度不确定

当线性表的长度不确定时,使用链式结构也更加合适。因为数组在初始化时需要确定其长度,而链表则可以动态地增长或缩短。

内存空间有限

当内存空间有限时,使用链式结构也是一个不错的选择。因为链式结构可以使用零散的存储空间来存储数据,而顺序表需要连续的存储空间。

总的来说,线性表使用链式结构实现的主要原因是更加灵活和高效。但是链式结构也存在一些缺点,比如难以进行随机访问相对于顺序表占用更多的内存空间等。在选择使用何种实现方式时,需要根据具体的应用场景进行权衡和选择。

例题:

1.

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?(D

A.双链表 B.单循环链表 C.带头结点的双循环链表 D.顺序表

解析:注意题目中的字眼:“任一指定序号”“最后”,说明已经确定了位置,此时根据时间复杂度,顺序线性表的查找为 O(1) ,因为实在最后进行插入和删除的,所以不涉及元素的移动,(如果插入和删除的位置不在最后,则删除过后删除位置之后的元素要全部往前移,插入时要先将插入位置之后的元素全部往后移来腾出空间插入,所以这是插入和删除操作的时间复杂度就为 O(n) )。 如果是线性链表,则每次取相应的元素时都要进行遍历,此时的时间复杂度为 O(n) 。插入和删除如果指明位置时时间复杂度为 O(1) ,如果没有指明位置则仍需要先遍历找到位置再操作,此时的时间复杂度为 O(n) 。

循环链表

循环链表是另一种形式的链式存储结构形式:

循环单链表:将表中尾节点的指针域改为指向表头节点,整个链表形成一个环。由 此从表中任一节点出发均可找到链表中其他节点。节点类型与普通单链表节点类型相同.
循环双链表:...形成两个环。节点类型与普通双链表节点类型相同.
循环单链表图示:

img

与非循环单链表比较:

​ 1: 链表中没有空的指针域.

​ 2: p如果为尾结点,则p->next == L;

循环双链表图示:

img

与非循环双链表比较:

​ 1: 链表中没有空的指针域.

​ 2: p如果为尾结点,则p->next == L;

​ 3: L->prior就可以直接找到尾结点.

习题

【例2-8】某线性表最常用的操作 是在尾元素之后插入一个元素 和 删除第一个元素,故采用 存储方式最节省运算时间。

A.单链表

B.仅有头结点指针的循环单链表

C.双链表

D.仅有尾结点指针的循环单链表

队列之循环队列

一、循环队列的定义

​ 顺序队列在使用过程中容易出现虚假的满状态, 为了解决这个问题,就产生了一个较巧妙的方法,将顺序队列臆造为一个环状的空间,称之为循环队列。循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。但是循环队列中存在一个问题,在循环队列中只凭头指针front等于尾指针rear无法判别队列空间是“空”还是“满”,可有两种处理方法:其一是另设一个标志位以区别队列是“空”还是“满”;其二是少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置(指环状的下一位置)上”作为队列呈“满”状态的标志。此处使用方法二来解决这个问题。

二、循环队列的结构

结构图
在这里插入图片描述

例题:

1.在用数组表示的循环队列中,front值一定小于等于rear值

​ 在用数组表示的循环队列中,front值一定小于等于rear值。因为在循环队列中,队列为空的时候,front和rear都指向队列的第一个位置;当队列中有一个元素时,rear指向队列的第二个位置,front仍然指向队列的第一个位置。当队列中有n个元素时,rear指向队列的第n+1个位置,front指向队列的第一个位置。因此,当队列为空时,front=rear;当队列满时,(rear+1)%m=front,其中m为队列的长度。因此,当队列满时,front的值为(rear+1)%m,即front的值一定小于等于rear的值。