1、带头结点的单链表h
为空的判定条件是:
A.h == NULL;
B.h->next == NULL;
C.h->next == h;
D.h != NULL;
B
头结点为h->next
。 头结点为空,则单链表为空。
2、在双向链表存储结构中,删除p
所指的结点,相应语句为:
A.p->prior=p->prior->prior; p->prior->next=p;
B.p->next->prior=p; p->next=p->next->next;
C.p->prior->next=p->next; p->next->prior=p->prior;
D.p->next=p->prior->prior; p->prior=p->next->next;
C
p
所指的上一个结点为p->prior
,下一个结点为p->next
。
设o
为p
的前结点,q
为p
的后结点,则
q->prior (p->next->prior) = o(p->prior);
让q
的前指针指向p
的前结点,(前继往前指)
o->next(p->prior->next) = q(p->next);
让o
的后指针指向p
的后结点,(后继往后指)
从而让p
的前后结点连在一起,达到删除p
所指的结点的目的。
3、已知L是带头结点的单链表,则摘除首元结点的语句是( )。
A.L=L->link;
B.L->link=L->link->link;
C.L=L->link->link;
D.L->link = L;
B
头结点为L->link
。删除头结点,即用头结点的下一个结点覆盖头结点。
4、如果最常用的操作是取第i
个结点及前驱,最节省时间的存储方式是()。
A.单链表
B.双向链表
C.单循环链表
D.顺序表
D
顺序表是一种随机存取的存储结构,访问节点的时间复杂度为O(1
)。
5、阅读下列程序,该算法的功能是()。
typedef struct node{
ElemType data;
struct node *next;
}LNode;
void fun2(LNode *&h){
LNode *p, *q, *r;
if (h==NULL) return;
p=h;
q=h->next;
while (q!=h )
{
r=q->next;
q->next=p;
p=q;
q=r;
}
h->next=p;
h=p;
}
A.将单链表逆置
B.将单循环链表逆置
C.从头到尾遍历单链表
D.从头到尾遍历单循环链表
B
6、数组A[1..5,1..6]每个元素占5个单元,将其按行优先次序存储在起始地址为1000的连续的内存单元中,则元素A[5,5]的地址为:
A.1120
B.1125
C.1140
D.1145
C
4×6+4=28
1000+28×5=1140
7、在N个结点的顺序表中,算法的时间复杂度为O(1)
的操作是:
A.访问第i
个结点(1≤i≤N)
和求第i
个结点的直接前驱(2≤i≤N)
B.在第i
个结点后插入一个新结点(1≤i≤N)
C.删除第i
个结点(1≤i≤N)
D.将N个结点从小到大排序
A
顺序表是一种随机存取的存储结构,所以访问节点的时间复杂度为O(1
)。
8、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?
A.双链表
B.单循环链表
C.带头结点的双循环链表
D.顺序表
D
9、链表不具有的特点是:
A.插入、删除不需要移动元素
B.方便随机访问任一元素
C.不必事先估计存储空间
D.所需空间与线性长度成正比
B
10、已知表头元素为c
的单链表在内存中的存储状态如下表所示:
现将f
存放于1014H
处,并插入到单链表中,若f
在逻辑上位于a
和e
之间,则a
、e
、f
的“链接地址”依次
是:
A.1010H
, 1014H
, 1004H
B.1010H
, 1004H
, 1014H
C.1014H
, 1010H
, 1004H
D.1014H
, 1004H
, 1010H
D
链表的遍历顺序c(1008H)->a(1000H)->e(1010H)->b(1004H)->d(100CH)->null。
由于f逻辑上位于a和e之间,因此也就是说将f插入到ae之间,因此只需要修改a的链接地址(也就是指向下一个元素的地址)为f的地址(1014H),然后将f的链接地址修改为e的地址(a→f,f→e)。链表插入不影响其他元素,所以其他元素链接地址不变。
11、数据结构反映了数据元素之间的结构关系。单链表是一种( )。
A.顺序存储线性表
B.非顺序存储非线性表
C.顺序存储非线性表
D.非顺序存储线性表
D
单链表是一种链式存储线性表。
12、在具有N个结点的单链表中,实现下列哪个操作,其算法的时间复杂度是O(N)
?
A.在地址为p的结点之后插入一个结点
B.删除开始结点
C.遍历链表和求链表的第i
个结点
D.删除地址为p的结点的后继结点
C
13、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?
A.单链表
B.仅有尾指针的单循环链表
C.仅有头指针的单循环链表
D.双链表
B
在最后一个元素之后插入一个元素和删除第一个元素,仅有头指针的话,进行以上操作需移动所有元素,因此仅有尾指针的单循环链表最节省运算时间。
14、将线性表La
和Lb
头尾连接,要求时间复杂度为O(1)
,且占用辅助空间尽量小。应该使用哪种结构?
A.单链表
B.单循环链表
C.带尾指针的单循环链表
D.带头结点的双循环链表
C
15、对于一个具有N个结点的单链表,在给定值为x的结点后插入一个新结点的时间复杂度为
A.O(1)
B.O(N/2)
C.O(N)
D.O(N^2)
C
在具有N个结点的单链表中,遍历链表和求链表的第i
个结点,其算法的时间复杂度是O(N)
。
16、与单链表相比,双链表的优点之一是()。
A.插入、删除操作更加简单
B.可随机访问
C.可以省略表头指针或表尾指针
D.顺序访问相邻结点更加灵活
D
17、将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度为()。
A.O(1)
B.O(n)
C.O(m)
D.O(m+n)
C
对长度为m的单链表进行尾插法。
找到长度为m的单链表的尾结点的时间复杂度为O(m)
。
找到长度为n的单链表的头结点的时间复杂度为O(1)
。
18、单链表的每个结点中包括一个指针next,它指向该结点的后继结点。现要将指针q指向的新结点插入到指针p指向的单链表结点之后,下面的操作序列中()是正确的。
A.q=p->next; p->next =q->next;
B.p->next =q->next; q=p->next;
C.q->next =p->next; p->next=q;
D.p->next =q; q-> next=p->next;
C
让p指向的下一个结点链接在q指向的结点后面:q->next =p->next;
让q指向的结点链接在p指向的结点后面:p->next=q;
19、以下说法错误的是 ( )。
A.对于线性表来说,定位运算LocateElem
在顺序表和单链表上的时间复杂度均为O(n)
B.插入、删除操作在顺序表上的实现,平均时间复杂度为O(n)
C.在链表上实现读表元运算的平均时间复杂度为O(1)
D.插入、删除操作在链表上的实现可在O(1)
时间内完成
C
在链表上实现读表元运算的平均时间复杂度为O(n)
。
20、链表 - 存储密度
链表的存储密度 ▁▁▁▁▁ 。
A.大于 1
B.等于 1
C.小于 1
D.不能确定
C
假设单链表数据元素本身的存储量为N,指针域所占的存储量为M,则存储密度为:N/(N+M) < 1。
21、设h
为不带头结点的单向链表。在h
的头上插入一个新结点t
的语句是:
A.h=t; t->next=h->next;
B.t->next=h->next; h=t;
C.h=t; t->next=h;
D.t->next=h; h=t;
22、已知指针ha
和hb
分别是两个单链表的头指针,下列算法将这两个链表首尾相连在一起,并形成一个循环链表(即ha的最后一个结点链接hb
的第一个结点,hb
的最后一个结点指向ha
),返回ha
作为该循环链表的头指针。请将该算法补充完整。
typedef struct node{
ElemType data;
struct node *next;
}LNode;
LNode *merge(LNode *ha, LNode *hb) {
LNode *p=ha;
if (ha==NULL || hb==NULL) {
cout<<”one or two link lists are empty!”<next!=NULL )
p=p->next;
p->next=hb;
while ( p->next!=NULL )
p=p->next;
__________
}
A.ha=p->next; return ha;
B.p->next=ha; return ha;
C.ha=p->next; return p;
D.p->next=ha; return p;
B
23、单链表 - 插入结点
在单链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 ▁▁▁▁▁ 。
A.p->next = s; s->next = p->next;
B.s->next = p->next; p->next = s;
C.s->next = p->next; p->next = s->next;
D.p->next = s->next; s->next = p->next;
B
24、双链表 - 插入结点
在双链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 ▁▁▁▁▁ 。
A.p->next = s; s->prev = p; s->next = p->next; p->next->prev = s;
B.s->next = p->next; s->prev = p; p->next = s; p->next->prev = s;
C.s->next = p->next; p->next->prev = s; p->next = s; s->prev = p;
D.p->next = s; s->prev = p; p->next->prev = s; s->next = p->next;
C
25、已知头指针 h
指向一个带头结点的非空单循环链表,结点结构为 data | next
,其中 next
是指向直接后继结点的指针,p
是尾指针,q
是临时指针。现要删除该链表的第一个元素,正确的语句序列是:
A.h->next=h->next->next; q=h->next; free(q);
B.q=h->next; h->next=h->next->next; free(q);
C.q=h->next; h->next=q->next; if (p!=q) p=h; free(q);
D.q=h->next; h->next=q->next; if (p==q) p=h; free(q);
D
1、非空线性表的结构特征
非空线性表具有哪些结构特征?
A.只有唯一的开始结点和唯一的终端结点
B.可拥有多个的开始结点和多个终端结点
C.除开始结点外,每个结点只有一个前驱结点
D.除终端结点外,每个结点只有一个后继结点
ACD
2、以下说法正确的是。
A.求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低
B.顺序存储的线性表可以随机存取
C.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
D.线性表的链式存储结构优于顺序存储结构
ABC
3、链表 - 时间复杂度
在包含n
个数据元素的链表中,▁▁▁▁▁ 的时间复杂度为O(n)
。
A.访问第i
个数据元素
B.在第i(1≤i≤n)
个结点后插入一个新结点
C.删除第i(1≤i≤n)
个结点
D.将n
个元素按升序排序
ABC