一、判断正误
- 链表的每个结点中都恰好包含一个指针。 (错)
解析:
链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。
- 链表的物理存储结构具有同链表一样的顺序。 (错)
解析:
链表的物理存储结构与链表的逻辑结构并不完全相同。链表的逻辑结构是线性的,即数据元素之间通过指针(或引用)顺序连接,形成一个序列。然而,从物理存储的角度来看,链表的节点通常并不连续存储在内存中。
- 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。 (错)
解析:
在链表中删除一个结点并不是由计算机自动完成的,而需要通过程序显式地操作结点的指针来实现。具体来说,在删除链表中的某个结点时,需要执行以下步骤:
定位节点、修改指针、释放内存
- 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (错)
解析:
线性表的每个结点可以是一个复杂类型。 线性表是一种逻辑结构概念,它可以顺序存储或链式存储,与元素的数据类型无关。线性表的链式存储是链表。线性表的顺序存储比如数组,数组中也可以有复杂数据类型比如结构体。
- 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (错)
解析:
实际上,顺序表结构(如数组)适宜于进行随机存取,而链表适宜于进行顺序存取。数组可以直接通过索引访问任意位置的元素,访问链表中的任意元素需要从头结点开始遍历,直到找到目标结点。
- 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 (错)
解析:
实际上,插入和删除效率低。顺序存储方式中,数据元素在内存中是连续存放的,不需要额外的空间来存储指针或链接信息,因此存储密度大。但是插入和删除时可能需要移动大量的元素来腾出空间或填补空位。
- 线性表在物理存储空间中也一定是连续的。 (错)
解析:
线性表在物理存储空间中并不一定是连续的。线性表的物理存储分为顺序存储和链式存储,顺序存储的线性表(如数组)具有连续的物理存储空间,而链式存储的线性表(如链表)则没有连续的物理存储空间。
- 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。 (错)
解析:
当线性表采用顺序存储方式时,逻辑上相邻的元素在物理存储位置上也是相邻的。
- 顺序存储方式只能用于存储线性结构。 (错)
解析:
可以用于存储其他类型的数据结构,比如数组中存储结构体。
- 线性表的逻辑顺序与存储顺序总是一致的。 (错)
解析:在线性表的链式存储结构中,逻辑顺序与存储顺序不一定一致。
线性表的逻辑顺序与存储顺序是否一致取决于线性表的存储实现方式:
二、单项选择题
1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:
(A)存储结构 (B)逻辑结构 (C)顺序存储结构 (D)链式存储结构
解析:
(C)顺序存储结构
顺序存储结构指的是数据元素在内存中是连续存放的,每个元素的存储地址可以通过计算得到,通常通过基地址加上偏移量来访问。而逻辑结构是指数据元素之间的逻辑关系,存储结构是指数据在计算机存储器中的组织方式,链式存储结构则是指数据元素在物理上可以不连续,通过指针连接。
- 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是
(A)110 (B)108 (C)100 (D)120
解析:
如果一个向量的第一个元素的存储地址是100,并且每个元素的长度为2,那么第5个元素的地址可以通过以下方式计算:
第一个元素的地址是100,第二个元素的地址是100 + 2,第三个元素的地址是100 + 2 * 2,以此类推。
所以第5个元素的地址是:
100 + (5 - 1) * 2 = 100 + 4 * 2 = 100 + 8 = 108
因此,正确答案是:
(B)108
- 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是:
(A) 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
(B) 在第i个结点后插入一个新结点(1≤i≤n)
(C) 删除第i个结点(1≤i≤n)
(D) 将n个结点从小到大排序
解析:
在顺序表中,时间复杂度为O(1)的操作意味着该操作可以在常数时间内完成,不需要依赖于列表中元素的数量。
(A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n):这两个操作都是可以在常数时间内完成的。访问第i个结点只需要通过基地址加上偏移量即可,而求第i个结点的直接前驱也只需要访问第i-1个结点。
(B)在第i个结点后插入一个新结点(1≤i≤n):这个操作通常需要移动第i个结点之后的所有结点,以便为新结点腾出空间,因此时间复杂度是O(n-i)。
(C)删除第i个结点(1≤i≤n):这个操作通常需要移动第i个结点之后的所有结点来填补被删除结点的位置,因此时间复杂度也是O(n-i)。
(D)将n个结点从小到大排序:这是一个排序操作,其时间复杂度取决于所使用的排序算法,但通常不会是O(1)。
因此,正确答案是:
(A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
- 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动 个元素
(A)8 (B)63.5 (C)63 (D)7
解析:
如果新元素插入在第一个位置,那么需要移动所有127个元素。
如果新元素插入在第二个位置,那么需要移动126个元素。
以此类推,直到新元素插入在最后一个位置,此时不需要移动任何元素。
127+126 + +2+1+0=127 ×64
(127 ×64)➗128=63.5
- 链接存储的存储结构所占存储空间:
(A) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
(B) 只有一部分,存放结点值
(C)只有一部分,存储表示结点间关系的指针
(D)分两部分,一部分存放结点值,另一部分存放结点所占单元数
解析:
A
链接存储结构通常由一系列节点组成,每个节点包含两部分信息:一部分用于存储数据(结点值),另一部分用于存储指向下一个节点的指针(或引用),用于表示结点间的连接关系。
- 线性表若采用链式存储结构时,要求内存中可用存储单元的地址:
(A)必须是连续的 (B)部分地址必须是连续的
(C)一定是不连续的 (D)连续或不连续都可以
解析:
D)连续或不连续都可以
链式存储结构不要求内存中的存储单元地址连续。每个节点包含数据和一个或多个指针,指针指向下一个节点的位置,这些位置可以是任意的、不连续的内存地址。
这是链式存储结构与顺序存储结构(如数组)的主要区别之一,后者要求存储单元地址连续。
7. 线性表L在 情况下适用于使用链式结构实现。
(A)需经常修改L中的结点值 (B)需不断对L进行删除插入
(C)L中含有大量的结点 (D)L中结点结构复杂
解析:
B
链式结构特别适合于需要频繁插入和删除操作的线性表,因为这些操作不需要移动其他元素,只需调整指针即可。
8. 单链表的存储密度
(A)大于1; (B)等于1; (C)小于1; (D)不能确定
解析:
C存储密度是指数据所占空间与整个节点所占空间的比例。
单链表是一种链式存储结构,其中每个节点包含数据部分和指向下一个节点的指针。在单链表中,除了存储数据本身之外,还需要存储指向下一个节点的指针,这增加了额外的存储开销。
由于每个节点都需要额外的空间来存储指针,单链表的存储密度小于1。
解析:
根据图片内容,可以看到有三个节点(a1、a2、a3),每个节点都有一个指向下一个节点的指针,且最后一个节点的指针指向一个特定的地址(通常是0或null,表示链表的结束)。这种结构符合单链表的定义。
10.下面关于线性表的叙述中,错误的是哪一个?
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
解析:
A. 线性表采用顺序存储,必须占用一片连续的存储单元。
正确。顺序存储结构通常使用数组来实现,数组中的元素是连续存储在内存中的。
B. 线性表采用顺序存储,便于进行插入和删除操作。
错误。实际上,顺序存储结构的线性表在进行插入和删除操作时,可能需要移动大量的元素来维护元素的连续性,这使得这些操作的效率较低。
C. 线性表采用链接存储,不必占用一片连续的存储单元。
正确。链接存储结构通过指针将分散在内存中的元素连接起来,因此不需要占用连续的存储空间。
D. 线性表采用链接存储,便于插入和删除操作。
正确。链接存储结构的线性表在进行插入和删除操作时,只需要改变指针的指向,不需要移动元素本身,因此这些操作的效率较高。
综上所述,错误的叙述是 B. 线性表采用顺序存储,便于进行插入和删除操作。
11.线性表是具有n个________的有限序列(n>0)。
A.表元素 B.字符 C.数据元素 D.数据项
解析:
线性表是具有n个数据元素的有限序列
12.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用______存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
解析:
注意:存取任一指定序号的元素和在最后进行插入和删除运算
13.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用 _______存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表
C.双链表 D.仅有尾指针的单循环链表
解析:
这种结构允许从尾节点快速进行插入和删除操作,因为可以直接通过尾指针访问到链表的末尾和开头(由于是循环的,尾节点指向头节点)。因此,无论是在末尾插入元素还是删除第一个元素,都可以非常快速地完成
- 静态链表中指针表示的是________.
A. 内存地址 B.下一元素的数组下标
C.下一元素的地址 D.左、右孩子地址
静态链表是一种特殊的数据结构,它使用数组来存储数据元素,并通过某种方式来表示元素之间的逻辑关系。在静态链表中,通常不使用指针来存储数据元素之间的直接关系,而是使用数组索引来表示。
A. 内存地址:这通常指的是物理内存地址,而在静态链表中,我们通常不直接使用内存地址。
B. 下一元素的数组下标:在静态链表中,每个元素会存储下一个元素在数组中的位置(即下标),这样可以不使用指针而通过下标来遍历整个链表。
C. 下一元素的地址:这与内存地址类似,通常不用于静态链表。
D. 左、右孩子地址:这通常用于树结构,而不是线性结构如链表。
- 链表不具有的特点是_________.
A.插入、删除不需要移动元素 B.可随机访问任一元素
C.不必事先估计存储空间 D.所需空间与线性长度成正比
解析:
B. 可随机访问任一元素:这是数组的特点,而不是链表的特点。链表不支持随机访问,要访问链表中的任意元素,通常需要从头开始遍历链表。
16.完成在双循环链表结点p之后插入s的操作是( ).
A. p^.next:=s ; s^.priou:=p; p.next.priou:=s ; s.next:=p.next;
B. p.next.priou:=s; p^.next:=s; s^.priou:=p; s.next:=p.next;
C. s^.priou:=p; s.next:=p.next; p^.next:=s; p.next.priou:=s ;
D. s^.priou:=p; s.next:=p.next; p.next.priou:=s ; p^.next:=s;
解析:
在双循环链表中完成在结点p之后插入结点s的操作,需要确保前驱和后继指针正确设置,同时保持链表的循环特性。具体步骤如下:
1.将s的前驱指针设置为p(s^.priou:=p;)。
2.将s的后继指针设置为p的后继(s.next:=p.next;)。
3.更新p的后继的前驱指针,使其指向s(p.next.priou:=s;)。
4.更新p的后继为s(p^.next:=s;)。
根据以上步骤,正确的操作是:
D. s^.priou:=p; s.next:=p.next; p.next.priou:=s; p^.next:=s;
17.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:( )。
A.p->next=s;s->next=p->next; B. s->next=p->next;p->next=s;
C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s;
解析:
在单链表中,在指针为p的结点之后插入指针为s的结点,需要执行以下步骤:
1.将s结点的next指针指向p结点的下一个结点(s->next=p->next;)。
2.将p结点的next指针指向s结点(p->next=s;)。
这样,s结点就被正确地插入到了p结点之后。
18.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是( )
A.headNULL B.head→nextNULL C.head→next==head D.head!=NULL
解析:
这个条件表示头结点的next指针指向空,即链表中没有任何节点跟在头结点后面,这是判定单链表为空的正确条件。
- 在双向链表存储结构中,删除p所指的结点时须修改指针( )。
A. (p.llink).rlink:=p^.rlink (p.rlink).llink:=p^.llink;
B. p.llink:=(p.llink)^.llink (p.llink).rlink:=p;
C. (p.rlink).llink:=p p.rlink:=(p.rlink)^.rlink
D. p.rlink:=(p.llink)^.llink p.llink:=(p.rlink)^.rlink;
解析:
在双向链表中,每个节点都有两个指针,一个指向前一个节点(通常称为llink或prev),另一个指向后一个节点(通常称为rlink或next)。要删除指针p所指向的节点,需要做以下操作:
将p节点的前一个节点的rlink指针指向p节点的后一个节点。
将p节点的后一个节点的llink指针指向p节点的前一个节点。
这样,p节点就被从链表中移除了,而链表的其余部分仍然保持连接。
三、简答题
1.线性表有哪两种存储结构?试问:
(1)如果有 n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构? 为什么?
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?
2 . 在单链表中设置头结点的作用是什么?
解析;
线性表有两种存储结构:顺序存储结构和链式存储结构。
(1)如果有n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用链式存储结构。因为链式存储结构可以动态地分配内存空间,不需要预先分配固定大小的存储空间,适合长度动态变化的情况。
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用顺序存储结构。因为顺序存储结构可以快速地通过索引访问元素,不需要像链式存储那样遍历链表。
在单链表中设置头结点的作用是:
简化插入和删除操作,避免空表的特殊情况处理。
头结点可以存放链表的长度信息,方便快速获取链表长度。
头结点可以作为链表的哨兵节点,提高操作的安全性和稳定性。