判断题
1-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 (1分)
T
1-2
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。 (2分)
T
1-3
对于顺序存储的长度为N的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为O(1)和O(N)。 (1分)
F
1-4
(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。 (1分)
T
1-5
(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。 (1分)
T
1-6
(neuDS)顺序存储的线性表不支持随机存取。 (1分)
F
1-7
(neuDS)在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关。 (1分)
F
1-8
在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 (1分)
F
1-9
若用链表来表示一个线性表,则表中元素的地址一定是连续的。 (1分)
F
1-10
将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。 (1分)
F
1-11
(neuDS)单链表不是一种随机存取的存储结构。 (1分)
T
选择题
2-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:(1分)
- O(1), O(1)
- O(1), O(N)
- O(N), O(1)
- O(N), O(N)
2-2
在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:(2分)
- 访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)
- 在第i个结点后插入一个新结点(1≤i≤N)
- 删除第i个结点(1≤i≤N)
- 将N个结点从小到大排序
2-3
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间? (2分)
- 双链表
- 单循环链表
- 带头结点的双循环链表
- 顺序表
2-4
顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )。(2分)
- 100
- 105
- 108
- 110
2-5
(neuDS)线性表的顺序存储结构是一种( ) (2分)
- 随机存取的存储结构
- 顺序存取的存储结构
- 索引存取的存储结构
- 散列存取的存储结构
2-6
(neuDS)一个顺序表所占用的存储空间大小与( )无关。 (2分)
- 表的长度
- 元素的类型
- 元素的存放顺序
- 元素中各字段的类型
*2-7
(neuDS)要将一个顺序表{a0,a1,……,an−1}中第i个数据元素ai(0≤i≤n-1)删除,需要移动( )个数据元素。 (2分)
- i
- n-i-1
- n-i
- n-i+1
2-8
用数组表示线性表的优点是()。 (2分)
- 便于插入和删除操作
- 便于随机存取
- 可以动态地分配存储空间
- 不需要占用一片相邻的存储空间
2-9
若长度为n的线性表采用顺序存储结构,那么删除它的第i个数据元素之前,需要它一次向前移动()个数据元素。 (2分)
- n-i
- n+i
- n-i-1
- n-i+1
2-10
若长度为n的线性表采用顺序结构,在第i个数据元素之前插入一个元素,需要它依次向后移动()个元素。 (2分)
- n-i
- n-i+1
- n-i-1
- i
2-11
线性表L=(a1, a2 ,……,an )用一维数组表示,假定删除线性表中任一元素的概率相同(都为1/n),则删除一个元素平均需要移动元素的个数是()。 (2分)
- n/2
- (n+1)/2
- (n-1)/2
- n
2-12
设h
为不带头结点的单向链表。在h
的头上插入一个新结点t
的语句是:(2分)
h=t; t->next=h->next;
t->next=h->next; h=t;
h=t; t->next=h;
t->next=h; h=t;
2-13
在单链表中,若p
所指的结点不是最后结点,在p
之后插入s
所指结点,则执行 (2分)
s->next=p; p->next=s;
s->next=p->next; p=s;
s->next=p->next; p->next=s;
p->next=s; s->next=p;
2-14
带头结点的单链表h
为空的判定条件是: (2分)
h == NULL;
h->next == NULL;
h->next == h;
h != NULL;
2-15
将两个结点数都为N且都从小到大有序的单向链表合并成一个从小到大有序的单向链表,那么可能的最少比较次数是: (2分)
- 1
- N
- 2N
- NlogN
2-16
线性表若采用链式存储结构时,要求内存中可用存储单元的地址 (1分)
- 必须是连续的
- 连续或不连续都可以
- 部分地址必须是连续的
- 一定是不连续的
2-17
在具有N个结点的单链表中,实现下列哪个操作,其算法的时间复杂度是O(N)? (2分)
- 在地址为p的结点之后插入一个结点
- 删除开始结点
- 遍历链表和求链表的第i个结点
- 删除地址为p的结点的后继结点
2-18
对于一个具有N个结点的单链表,在给定值为x的结点后插入一个新结点的时间复杂度为 (2分)
- O(1)
- O(N/2)
- O(N)
- O(N2)
2-19
链表不具有的特点是: (1分)
- 插入、删除不需要移动元素
- 方便随机访问任一元素
- 不必事先估计存储空间
- 所需空间与线性长度成正比
2-20
(neuDS)在一个含有n个结点的有序单链表中插入一个新结点,使单链表仍然保持有序的算法的时间复杂度是( )。 (2分)
- O(1)
- O(log2n)
- O(n)
- O(n2)
2-21
将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为( )。 (2分)
- O(1)
- O(m)
- O(n)
- O(n+m)
2-22
(neuDS)在单链表中,增加一个头结点的最终目的是为了( )。 (2分)
- 使单链表至少有一个结点
- 方便运算的实现
- 标识表结点中首结点的位置
- 说明单链表是线性表的链式存储
2-23
在单链表中,要删除某一指定结点,必须先找到该结点的()。 (2分)
- 直接前驱
- 自身位置
- 直接后继
- 直接后继的后继
2-24
以下关于链式存储结构的叙述中,()是不正确的。 (2分)
- 结点除自身信息外还包括指针域,因此存储密度小于顺序存储结构
- 逻辑上相邻的结点物理上不必邻接
- 可以通过计算直接确定第i个结点的存储地址
- 插入、删除运算操作方便,不必移动结点
2-25
线性链表不具有的特点是()。 (2分)
- 随机访问
- 不必事先估计所需存储空间大小
- 插入与删除时不必移动元素
- 所需空间与线性长度成正比
2-26
线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。 (2分)
- 必须是连续的
- 部分地址必须是连续的
- 一定是不连续的
- 连续或不连续都可以
**2-27
对线性表,在下列情况下应当采用链表表示的是()。 (2分)
- 经常需要随机地存取元素
- 经常需要进行插入和删除操作
- 表中元素需要占据一片连续的存储空间
- 表中的元素个数不变
2-28
不带表头附加结点的单链表为空的判断条件是头指针head满足条件()。 (2分)
- head==NULL
- head->next==NULL
- head->next== head
- head!=NULL
2-29
可以用带表头附加结点的链表表示线性表,也可以用不带头结点的链表表示线性表,前者最主要的好处是()。 (2分)
- 可以加快对表的遍历
- 使空表和非空表的处理统一
- 节省存储空间
- 可以提高存取表元素的速度
2-30
对于一非空的循环单链表,h
和p
分别指向链表的头、尾结点,则有:(2分)
p->next == h
p->next == NULL
p == NULL
p == h
2-31
在双向循环链表结点p
之后插入s
的语句是: (3分)
p->next=s; s->prior=p; p->next->prior=s ; s->next=p->next;
p->next->prior=s; p->next=s; s->prior=p; s->next=p->next;
s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;
s->prior=p; s->next=p->next; p->next->prior=s; p->next=s;
2-32
在双向链表存储结构中,删除p
所指的结点,相应语句为:(3分)
p->prior=p->prior->prior; p->prior->next=p;
p->next->prior=p; p->next=p->next->next;
p->prior->next=p->next; p->next->prior=p->prior;
p->next=p->prior->prior; p->prior=p->next->next;
2-33
某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间? (2分)
- 单链表
- 仅有尾指针的单循环链表
- 仅有头指针的单循环链表
- 双链表
2-34
若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用哪种存储方式最节省运算时间? (2分)
- 单链表
- 双链表
- 单循环链表
- 带头结点的双循环链表
**2-35
将线性表La和Lb头尾连接,要求时间复杂度为O(1),且占用辅助空间尽量小。应该使用哪种结构? (2分)
- 单链表
- 单循环链表
- 带尾指针的单循环链表
- 带头结点的双循环链表
2-36
(neuDS)在链表中若经常要删除表中最后一个结点或在最后一个结点之后插入一个新结点,则宜采用()存储方式。 (2分)
- 顺序表
- 用头指针标识的循环单链表
- 用尾指针标识的循环单链表
- 双向链表
2-37
非空的循环单链表head的尾结点(由p所指向)满足()。 (2分)
- p->next == NULL
- p == NULL
- p->next == head
- p == head
2-38
在循环双链表的p所指结点之前插入s所指结点的操作是()。 (2分)
- p->prior = s; s->next = p; p->prior->next = s; s->prior = p->prior;
- p->prior = s; p->prior->next = s; s->next = p; s->prior = p->prior;
- s->next = p; s->prior = p->prior; p->prior = s; p->right->next = s;
- s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s;
2-39
若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用()存储方式最节省运算时间。 (2分)
- 单链表
- 给出表头指针的单循环链表
- 双链表
- 带表头附加结点的双循环链表
2-40
某线性表最常用的操作是在最后一个结点之后插入一个结点或删除第一个结点,故采用()存储方式最节省运算时间。 (2分)
- 单链表
- 仅有头结点的单循环链表
- 双链表
- 仅有尾指针的单循环链表
2-41
在一个长度为n(n>1)的单链表上,设有头和尾两个指针,执行()操作与链表的长度有关。 (2分)
- 删除单链表中的第一个元素
- 删除单链表中的最后一个元素
- 在单链表第一个元素前插入一个新元素
- 在单链表最后一个元素后插入一个新元素
2-42
如果对线性表的运算只有4种,即删除第一个元素,删除最后一个元素,在第一个元素前面插入新元素,在最后一个元素的后面插入新元素,则最好使用()。 (2分)
- 只有表尾指针没有表头指针的循环单链表
- 只有表尾指针没有表头指针的非循环双链表
- 只有表头指针没有表尾指针的循环双链表
- 既有表头指针也有表尾指针的循环单链表
2-43
如果对线性表的运算只有2种,即删除第一个元素,在最后一个元素的后面插入新元素,则最好使用()。 (2分)
- 只有表头指针没有表尾指针的循环单链表
- 只有表尾指针没有表头指针的循环单链表
- 非循环双链表
- 循环双链表
**2-44
在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是()。 (2分)
- p->next = s; s->prior = p; (p->next)->prior = s; s->next = p->next;
- s->prior = p; s->next = p->next; p->next = s; p->next->prior = s;
- p->next = s; p->next->prior = s; s->prior = p; s->next = p->next;
- s->prior = p; s->next = p->next; p->next->prior = s; p->next = s;
2-45
带表头附加结点的双向循环链表为空的判断条件是头指针L满足条件()。 (2分)
- L= =NULL
- L->right= =NULL
- L->left = =NULL
- L->right= =L
2-46
循环链表的主要优点是()。 (2分)
- 不再需要头指针了
- 已知某个结点的位置后,能够很容易找到它的直接前驱
- 在进行插入、删除运算时,能更好的保证链表不断开
- 从表中的任意结点出发都能扫描到整个链表
2-47
已知指针ha和hb分别是两个单链表的头指针,下列算法将这两个链表首尾相连在一起,并形成一个循环链表(即ha的最后一个结点链接hb的第一个结点,hb的最后一个结点指向ha),返回该循环链表的头指针。请将该算法补充完整。 (4分)
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!”<<endl;
return NULL;
}
while ( p->next!=NULL )
p=p->next;
p->next=hb;
while ( p->next!=NULL )
p=p->next;
__________
}
- ha=p->next; return ha;
- p->next=ha; return ha;
- ha=p->next; return p;
- p->next=ha; return p;
2-48
设有一个双向循环链表,每个结点中除有left、data和right三个域外,还增设了一个访问频度域freq,freq 的初值为零。每当链表进行一次查找操作后,被访问结点的频度域值便增1,同时调整链表中结点的次序,使链表按结点频度值非递增有序的次序排列。下列算法是符合上述要求的查找算法,请将该算法补充完整。 (4分)
typedef struct Node{
ElemType data;
struct Node *left;
struct Node *right;
intfreq;
} DNode;
DNode *locate_DList(DNode *&L, ElemType x)
{ //在表L中查找元素x,查找成功则调整结点频度域值及结点位置,并返回结点地址;
//查找不成功则返回NULL
DNode *p=L, *q;
if (L==NULL) return NULL;
while (p->data!=x && p->right!=L) p=p->right;
if (p->data!=x) return NULL;
p->freq++;
q=p->left;
while (q!=L && q->freq<=p->freq) q=q->left; //查找插入位置
if (q==L && q->freq<=p->freq) { //需将p结点插在头结点L前
//将p结点先从链表中摘下来
p->left->right=p->right;
p->right->left=p->left;
//将p结点插在L结点前
p->right=L;
p->left=L->left;
L->left->right=p;
L->left=p;
L=p;
}
else if (q!=p->left ) { //若q不是p的前驱,则需调整结点位置,将p结点插在q结点后
//将p结点先从链表中摘下来
p->left->right=p->right;
p->right->left=p->left;
______________ //将p结点插在q结点后
}
return p;
}
- p->left=q; p->right=q->right;
- p->left=q; q->right=p;
- p->left=q; p->right=q->right; q->right->left=p; q->right=p;
- p->left=q; q->right=p; p->right=q->right; q->right->left=p;
2-49
与单链表相比,双链表的优点之一是()。 (2分)
- 插入、删除操作更加简单
- 可随机访问
- 可以省略表头指针或表尾指针
- 顺序访问相邻结点更加灵活
***2-50
采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N1和N2个,最高项指数分别为M1和M2,则实现两个多项式相乘的时间复杂度是:(2分)
- O(N1×N2)
- O(M1×M2)
- O(N1+N2)
- O(M1+M2)