目录
一、选择题
1、线性表的唯一存储形式是链表。F
解析:线性表按存储的不同分为顺序表和链表。
2、在线性表的顺序存储结构中可实现快速的随机存取,而在链式存储结构中则只能进行顺序存取。T
解析:如果是顺序存储结构,可以通过下标直接访问,与存储位置无关,所以是随机存取,比如说数组。如果是链式存储结构,不能通过下标访问,只能按照存储顺序存取,所以是顺序存取,比如说单链表。要注意“存储”和“存取”的不同。
3、线性表采用链式存储表示时,所有结点之间的存储单元地址可以连续也可以不连续。T
解析:顺序表:线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里;链表:用一组任意的存储单元来存放线性表的结点,这组存储单元可以是连续的,也可以是不连续的。
4、在顺序表中取出第i个元素所花费的时间与i成正比。F
解析:取出第i个元素的意思不是找到这个元素,而是找到后删除或别的什么操作。那么找到第i个元素的过程是不花费时间的,仅仅是一个地址移位运算而已。但是接下来需要把i后面所有元素往前移一位,这才是花费时间的地方。所以不是与i成正比,而是i越大花费时间越小。
5、在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。T
解析:插入时,移动n-i个,删除时,移动n-i-1个。
6、所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。T
7、线性表中每个元素都有一个直接前趋和一个直接后继。F
解析:首先,线性表分为顺序表和链表。顺序表是以数组的形式来存储的,没有前驱和后继的这种叫法。而链表,头结点是没有前驱的,尾结点是没有后继的。
8、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。T
解析:首先,顺序表可以通过首地址和序号随机存取任意数据,而且题中说在最后进行插入和删除,所以顺序表是最节省时间的;而链表常适用于插入删除内部结点的情况。
9、顺序存储的线性表可以随机存取。T
解析:解释一:
顺序存储结构的地址在内存中是连续的所以可以通过计算地址实现随机存取,与此相对 链式存储结构的存储地址不一定连续,只能通过第个结点的指针顺序存取。
解释二:
线性表的顺序存储结构可以通过线性表的首址加偏移的方法计算出来第i个数据的位置a+i*sizeof(单个结构)而线性表的链式存储结构要访问第i个数据,就必须先访问前面的i-1个数据。
10、在N个结点的顺序表中访问第i(1<=i<=N)个结点和求第i(2<=i<=N)个结点直接前驱的算法时间复杂度均为O(1)。T
11、将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。F
解析:要插入到长度为m的单链表,需要找到表尾,这个过程的时间复杂度为o(m),连接的时间复杂度为o(1),所以总的时间复杂度为o(m)。
12、在顺序表中,逻辑上相邻的元素,其物理位置必定相邻。T
解析:顺序表中,逻辑上相邻的元素,其物理位置也相邻,在链表中,逻辑上相邻的元素,其物理位置不一定相邻。
13、在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关。F
解析:顺序表上进行删除操作时与待删除元素位置有关。
14、顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。F
解析:各有各的优点,顺序表没有指针,不需要花费额外的开销,存储效率高。
在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。F
解析:单链表的时间复杂度为O(n),访问结点的时间复杂度也为O(n)。
二、选择题
1、链表 - 存储密度
链表的存储密 ▁▁▁▁▁ 。
A.等于 1
B.小于 1
C.不能确定
D.大于 1
解析:因为顺序表的存储密度为1,链表的存储效率和密度都不如顺序表,因此链表的存储密度小于1。
2、已知L是带头结点的单链表,则摘除首元结点的语句是( )。
A.L=L->link->link;
B.L=L->link;
C.L->link=L->link->link;
D.L->link = L;
解析:L---->Link指向首元结点,L---->Link---->Link指向首元结点的下一节点,用L---->Link=L---->Link---->Link让头结点的Link指向首元结点的下一结点,可将首元结点从链中摘下。
3、以下说法错误的是 ( )。
A.插入、删除操作在链表上的实现可在O(1)时间内完成
B.对于线性表来说,定位运算LocateElem在顺序表和单链表上的时间复杂度均为O(n)
C.在链表上实现读表元运算的平均时间复杂度为O(1)
D.插入、删除操作在顺序表上的实现,平均时间复杂度为O(n)
解析:顺序表:定位 ;插入删除O(n);查找O(1)。链表:定位 ;插入删除O(1);查找O(n)。
4、与单链表相比,双链表的优点之一是()。
A.可随机访问
B.顺序访问相邻结点更加灵活
C.插入、删除操作更加简单
D.可以省略表头指针或表尾指针
解析:双向链表相对于单链表来说,要更复杂一些,因为它多了prior指针,对于插入和删除时,需要小心。另外,由于它每个结点都需要记录两份指针,所以在空间上要占用多一些。不过,由于它良好的对称性,使得对某个结点的前后结点操作,带来了方便,可以有效提高算法的时间性能。其实就是用空间来换时间。
5、已知表头元素为c
的单链表在内存中的存储状态如下表所示:
现将f
存放于1014H
处,并插入到单链表中,若f
在逻辑上位于a
和e
之间,则a
、e
、f
的“链接地址”依次是
A.1014H
, 1004H
, 1010H
B.1010H
, 1004H
, 1014H
C.1010H
, 1014H
, 1004H
D.1014H
, 1010H
, 1004H
解析:这道题的逻辑,简单来说,就是地址存放你当前元素的地址,链接地址是指向当前元素的下一个元素的地址。
因此,我们来看没插入f之前时,链表的顺序,由于头元素是c(地址1008H),由C开始,C的链接地址是1000H,也就是指向元素a(地址1000H),之后a的链接地址是1010H,也就是指向元素e。。。
按照上面这个思路遍历,我们可以得到链表的遍历顺序c(1008H)->a(1000H)->e(1010H)->b(1004H)->d(100CH)->null。
由于f逻辑上位于a和e之间,因此也就是说将f插入到ae之间,因此只需要修改a的链接地址(也就是指向下一个元素的地址)为f的地址(1014H),然后将f的链接地址修改为e的地址。
链表插入不影响其他元素,所以其他元素链接地址不变。
因此,a,e,d的链接地址分别为,1014H,1004H,null
6、数组A[1..5,1..6]每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为:
数组A[1..5,1..6]每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为:
A.1125
B.1120
C.1145
D.1140
解析: A[5,5]是第4*6+5=29个元素,29*5=145,但因为元素的地址为其首地址,且第一个元素的起始地址从1000开始,所以A[5,5]的地址为1000+145-5=1140。
上面的题目均是博主在期末考试前总结的重难点,欢迎各位大佬指正错误或者给出更优质的解析。