题目
1、线性表采用链式存储时,其地址( )。
A.必须是连续的
B.一定是不连续的
C.部分地址必须是连续的
D.连续与否都可以
2、顺序存储方式插入和删除数据元素效率太低,因此它不如链式存储方式好。( )
3、在双向链表中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s—>next=p;s—>prior=_____;_____=s;p—>prior=s;
4、链表不具有的特点是( )。
A.插入不需要移动元素
B.可随机访问任一元素
C.不必事先估计存储空间
D.删除不需要移动元素
5、在一个单链表中,已知q结点是p结点的前驱结点,若在q和p之间插入s结点,则执行( )。
A.s—>next=p—>next;p—>next=s;
B.p—>next=s—>next;s—>next=p;
C.q—>next=s;s—>next=p;
D.p—>next=s;s—>next=q;
6、线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。( )
7、将长度为n的单链表A链接在长度为m的单链表B之后的算法时间复杂度为_。
8、对于在表的首、尾两端进行插入操作的线性表,宜采用的存储结构是( )。
A.顺序表
B.用头指针表示的单循环链表
C.用尾指针表示的单循环链表
D.单链表
9、链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。( )
10、阅读下列算法,并补充所缺语句。
从头指针为la的带表头结点的有序顺序表中删除所有值相同的多余元素,并释放被删除结点的空间。
void purge_linkst(ListLink &la){
ListNode *p,*q,*t;
ElemType temp;
p=la—>data;
while(p!=NULL){
q=p;
temp=p—>link;
if(p!=NULL&&_____)
p=p—>link;
else{
while(p!=NULL&&_____){
t=p;
p=p—>link;
free(t);
}
p=q—>link;
}
}
}
答案
1、D
2、错误
3、p—>prior
p—>prior—>next
4、B
5、C
6、错误
7、O(m)
链表在B之后,需要对B遍历,长度为m,因此遍历了m次找到尾结点。
8、C
A选项顺序表插入效率低,时间复杂度为O(n);
B,D选项只适合在表的首端进行插入操作,时间复杂度为O(1);在尾端插入时,需要遍历整张表找到尾结点,时间复杂度为O(n);
C选项在表的首、尾两端进行插入操作,时间复杂度为O(1)。
9、错误
链表的删除不会发生结点的移动,顺序表的删除才会发生结点的移动。
10、temp!=p—>data
temp==p—>data
第一次循环用temp保存第一个结点的值,用q保存当前p指向的结点。
然后,用p指针向后遍历,若当前p指针所指向结点的值与temp相等,则删除该结点;
继续向后遍历,直到不存在这样的结点或者p指针已经为空就结束该次遍历。
接着,p=q—>link使得p指针指向原来p指针的下一个结点,重复操作。