a[i][j]=i*j;return
(1);
else
return(n*fact(n-1));}
2.画出下列二元组表示的数据结构对应的逻辑图形,并指出分别属于何种结构。
(1)B=(K,R)
K={a,b,c,d,e,f,g,h}
R={,,,,,,}
(2)C=(K,R)
K={1,2,3,4,5,6}
R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}
第二章线性表
一、选择题
1.链表不具备的特点是()。
A.可随机访问任一结点B.插入删除不需要移动元素
C.不必事先估计存储空间D.所需空间与其长度成正比
2.不带头结点的单链表head为空的判定条件是()。
A.head==NULLB.head->next==NULLC.head->next==headD.head!
=NULL
3.带头结点的单链表head为空的判定条件是()。
A.head==NULLB.head->next==NULLC.head->next==headD.head!
=NULL
4.带头结点的双循环链表L为空表的条件是()。
A.L==NULLB.L->next==NULLC.L->prior==NULLD.L->next==L
5.非空的循环单链表head的尾结点(由P所指向)满足()。
A.p->next==NULLB.p==NULLC.p->next==headD.p==head
6.在循环双链表的p所指结点之前插入s所指结点的操作是()。
A.p->prior=s;s->next=p;p->prior->next=s;s->prior=p->prior;
B.p->prior=s;p->prior->next=s;s->next=p;s->prior=p->prior;
C.s->next=p;s->prior=p->prior;p->prior=s;p->right->next=s;
D.s->next=p;s->prior=p->prior;p->prior->next=s;p->prior=s;
7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用( )存储方式最节省运算时间。
A.单链表 B.给出表头指针的单循环链表C.双链表 D.带头结点的双循环链表
8.某线性表最常用的操作是在最后一个结点之后插入一个结点或删除第一个结点,故采用( )存储方式最节省运算时间。
A.单链表 B.仅有头结点的单循环链表 C.双链表 D.仅有尾指针的单循环链表
9.如果最常用的操作是取第i个结点及其前驱,则采用( )存储方式最节省时间。
A.单链表B.双链表C.单循环链表D.顺序表
10.在一个具有n个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是( )。
A.O
(1) B.O(n)C.O(n2)D.O(nlog2n)
11.在一个长度为n(n>1)的单链表上,设有头和尾两个指针,执行( )操作与链表的长度有关。
A.删除单链表中的第一个元素 B.删除单链表中的最后一个元素
C.在单链表第一个元素前插入一个新元素 D.在单链表最后一个元素后插入一个新元素
12.设线性表有n个元素,以下算法中,()在顺序表上实现比在链表上实现效率更高。
A.输出第i(0≤i≤n-1)个元素值 B.交换第0个元素与第1个元素的值
C.顺序输出这n个元素的值 D.输出与给定值x相等的元素在线性表中的序号
13.设线性表中有2n个元素,算法(),在单链表上实现比在顺序表上实现效率更高。
A.删除所有值为x的元素 B.在最后一个元素的后面插入一个新元素
C.顺序输出前k个元素 D.交换第i个元素和第2n-i-1个元素的值(i=0,1,..,n-1)
14.与单链表相比,双链表的优点之一是()。
A.插入、删除操作更简单B.可以进行随机访问
C.可以省略表头指针或表尾指针 D.顺序访问相邻结点更灵活
15.如果对线性表的运算只有4种,即删除第一个元素,删除最后一个元素,在第一个元素前面插入新元素,在最后一个元素的后面插入新元素,则最好使用( )。
A.只有表尾指针没有表头指针的循环单链表B.只有表尾指针没有表头指针的非循环双链表
C.只有表头指针没有表尾指针的循环双链表D.既有表头指针也有表尾指针的循环单链表
16.如果对线性表的运算只有2种,即删除第一个元素,在最后一个元素的后面插入新元素,则最好使用( )。
A.只有表头指针没有表尾指针的循环单链表B.只有表尾指针没有表头指针的循环单链表
C.非循环双链表D.循环双链表
17.设有两个长度为n的单链表,结点类型相同,若以h1为表头指针的链表是非循环的,以h2为表头指针的链表是循环的,则()。
A.对于两个链表来说,删除第一个结点的操作,其时间复杂度都是O
(1)
B.对于两个链表来说,删除最后一个结点的操作,其时间复杂度都是O(n)
C.循环链表要比非循环链表占用更多的内存空间
D.h1和h2是不同类型的变量
18.在长度为n的()上,删除第一个元素,其算法的时间复杂度为O(n)。
A.只有表头指针的不带表头结点的循环单链表B.只有表尾指针的不带表头结点的循环单链表
C.只有表尾指针的带表头结点的循环单链表D.只有表头指针的带表头结点的循环单链表
19.线性表是()。
A.一个有限序列,可以为空B.一个有限序列,不能为空
C.一个无限序列,可以为空D.一个无限序列,不能为空
20.设单链表中指针p指向结点M,指针f指向将要插入的新结点X:
(1)当X插在链表中两个数据元素M和N之间时,只要先修改()后修改()即可。
(2)当X插在链表中最后一个结点M之后时,只要先修改()后修改()即可。
A.p->next=fB.p->next=p->next->nextC.p->next=f->nextD.f->next=p->nextE.f->next=NULLF.f->next=p
21.在单循环链表中指针p指向结点A,若要删除A之后的结点,则指针的操作方式为()。
A.p->next=p->next->nextB.p=p->nextC.p=p->next->nextD.p->next=p
22.给定有n个元素的向量,建立一个有序单链表的时间复杂度为()。
A.O
(1)B.O(n)C.O(n2)D.O(nlog2n)
23.线性表采用链式存储时,其地址()。
A.必须是连续的B.一定是不连续的C.部分地址必须是连续的D.连续与否均可以
24.从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较()个元素。
A.n/2B.nC.(n+1)/2D.(n-1)/2
二、填空题
1.在单链表中,要删除某一指定的结点,必须找到该结点的()结点。
2.访问单链表中的结点,必须沿着()依次进行。
3.在双链表中,每个结点都有两个指针域,一个指向(),另一个指向()。
4.在()链表上,删除最后一个结点,其算法的时间复杂长为O
(1)。
5.在非循环的()链表中,可以用表尾指针代替表头指针。
6.在一个单链表中的p所指结点之前插入一个s所指结点时,可执行如下操作:
(1)s->next=();
(2)p->next=s;(3)t=p->data;
(4)p->data=();(5)s->data=();
7.在一个单链表中删除p所指结点时,应执行以下操作:
q=p->next;p->data=p->next->data;p->next=()free(q);
8.在一个单链表中p所指结点之后插入一个s所指结点时,应执行s->next=()和p->next=()的操作。
9.对于一个具有n个结点的单链表,在*p结点后插入一个新的结点的时间复杂度是(),在给定值为x的结点后插入一个新结点的时间复杂度是()。
10.在一个长度为n的顺序表的第i(1<=i<=n)个元素之前插入一个元素需向后移动()个元素。
11.在长度为n的顺序表中,删除第i(1<=i<=n)个元素,需向前移动()个元素。
12.线性表常用的存储结构有()和()。
13.线性表的逻辑结构是(),其所含结点的个数称为线性表的()。
14.当对一个线性表经常进行存取操作,而很少进行插入和删除操作时,则采用()存储结构为宜,当经常进行的是插入删除操作时,则采用()存储结构为宜。
三、判断题
1.顺序存储的线性表可以随机存取。
()
2.线性表中的元素可以是各种类型的,但同一线性表中的数据元素具有相同的性质,因此属于同一数据对象。
()
3.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定是相邻的。
()
4.线性表的链式存储结构优于顺序存储结构。
()
5.在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。
()
6.顺序存储方式只能用于存储线性结构。
()
7.链表的每个结点中都恰好包含一个指针。
()
四、简答题
1.头指针、头结点和首结点的区别是什么?
2.线性表的两种存储结构各有哪些优缺点?
3.对链表设置头结点的作用是什么?
五、算法题
1.建立一个由n个结点构成的单链表L=(1,2,3,…n)。
2.求单链表中数据域为x的结点个数。
3.求某一循环单链表的表长。
4.在头指针为head的单链表中查找值为x的元素。
5.复制一个单链表(依次查找头指针为head1的单链表中的每个结点,对每个结点复制一个新结点并链接到头指针为head2的单链表中)。
6.将单链表中所有值为x的元素替换成y。
7.编写函数,通过一次遍历确定单链表中值最大的结点,返回其地址。
8.编写函数将一个不带头结点的单链表中的所有结点逆置。
9.编写函数删除单链表中第i个结点。
10.在长度大于1的循环单链表中,既无头结点也无头指针,p指向链表中某一结点,编写算法删除该结点的前驱结点。
11.在单链表中删除值为x的所有元素。
12.已知带头结点的单链表中的元素按递增顺序排列,编写函数删除表中所有值大于min且小于max的元素。
(max>min)
13.已知带头结点的单链表中的元素是无序的,编写函数删除表中所有值大于min且小于max的元素。
(max>min)
14.编写函数,对一单链表反复找出表中最小元素,并在输出该元素后删除它,直到表为空时结束。
15.有一个单链表,其结点的元素值以递增有序排列,编写函数删除该单链表中多余的元素值相同的结点。
16.试写出一个在不带头结点的单链表的第i个元素之前插入一个新元素x的算法。
17.有一个有序单链表,表头指针为head,编写函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。
18.设A,B是两个线性表,其表中元素递增有序,长度分别为m和n,试写算法分别以顺序存储和链式存储将A和B归并成一个仍按元素值递增有序的线性表C。
19.编写一个算法将一个头结点指针为pa的单链表A分解成两个单链表A和B,其头结点指针分别为pa和pb,使得A链表中含有原链表A中序号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
20.有一个循环双链表,每个结点由两个指针(prior和next)以及data三个域构成,p指向其中某一结点,编写一函数删除p所指结点。
21.设有一个循环双链表,其中有一结点的指针为p,编写一个算法将p与其后继结点进行交换。
第三章栈和队列
一、选择题
1.栈和队列的共同点是()。
A.都是先进后出 B.都是先进先出C.只允许在端点处插入和删除元素 D.没有共同点
2.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是( )。
A.edcba B.decba C.dceab D.abcde
3.若已知一个栈的进栈序列是1,2,3,..,n,其输出序列为p1,p2,p3,..,pn,若p1=n则pi(1≤iA.iB.n-iC.n-i+1D.不确定
4.若已知一个栈的进栈序列是1,2,3,..,n,其输出序列为p1,p2,p3,..,pn,若pn=n则pi(1≤iA.iB.n-iC.n-i+1D.不确定
5.若已知一个栈的进栈序列是1,2,3,..,n,其输出序列为p1,p2,p3,..,pn,若p1=3则p2为()。
A.可能是2 B.一定是2 C.可能是1 D.一定是1
6.若已知一个栈的进栈序列是p1,p2,p3,..,pn,其输出序列为1,2,3,..,n,若p3=1则p1为()。
A.可能是2 B.一定是2 C.不可能是2 D.不可能是3
7.判定一个栈ST(最多元素为MaxSize)为空的条件是( )。
A.ST->top!
=-1B.ST->top==-1C.ST->top!
=MaxSize-1D.ST->top==MaxSize-1
8.判定一个栈ST(最多元素为MaxSize)为栈满的条件是()。
A.ST->top!
=-1B.ST->top==-1C.ST->top!
=MaxSize-1D.ST->top==MaxSize-1
9.最不适合用作链栈的链表是()。
A.只有表头指针没有表尾指针的循环双链表B.只有表尾指针没有表头指针的循环双链表
C.只有表尾指针没有表头指针的循环单链表D.只有表头指针没有表尾指针的循环单链表
10.向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行( )。
A.HS->next=s;B.s->next=HS->next;HS->next=s;
C.s->next=HS;HS=s;D.s->next=HS;HS=HS->next;
11.从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删除结点的值,则执行()。
A.x=HS;HS=HS->next;B.x=HS->data;
C.HS=HS->next;x=HS->data; D.x=HS->data;HS=HS->next;
12.一个队列的入队序列是1,2,3,4,则队列的输出序列是()。
A.4,3,2,1 B.1,2,3,4 C.1,4,3,2 D.3,2,4,1
13.判定一个队列QU(最多元素为MaxSize)为空的条件是()。
A.QU->rear-QU->front==MaxSizeB.QU->rear-QU->front-1==MaxSize
C.QU->front==QU->rearD.QU->front==QU->rear+1
14.循环顺序队列中是否可以插入下一个元素,()。
A.与队头指针和队尾指针的值有关 B.只与队尾指针的值有关,与队头指针的值无关
C.只与数组大小有关,与队首指针和队尾指针的值无关
D.与曾经进行过多少次插入操作有关
15.判定一个循环队列QU(最多元素为MaxSize)为空的条件是()。
A.QU->front==QU->rearB.QU->front!
=QU->rear
C.QU->front==(QU->rear+1)%MaxSizeD.QU->front!
=(QU->rear+1)%MaxSize
16.判定一个循环队列QU(最多元素为MaxSize)为满队列的条件是()。
A.QU->front==QU->rearB.QU->front!
=QU->rear
C.QU->front==(QU->rear+1)%MaxSizeD.QU->front!
=(QU->rear+1)%MaxSize
17.循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是()。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front
18.若用一个大小为6的一维数组来实现循环队列,且当前rear和front的值分别为0和3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是()。
A.1和5B.2和4C.4和2D.5和1
19.最不适合用作链队列的链表是()。
A.只带队头指针的非循环双链表 B.只带队头指针的循环双链表
C.只带队尾指针的循环双链表 D.只带队尾指针的循环单链表
20.在一个链队列中,假设f和r分别为队头和队尾指针,则插入s所指结点的运算是( )。
A.f->next=s;f=s;B.r->next=s;r=s;C.s->next=r;r=s;D.s->next=f;f=s;
21.在一个链队列中,假设f和r分别为队头和队尾指针,则删除一个结点的运算是()。
A.r=f->next;B.r=r->next; C.f=f->next;D.f=r->next;
22.设有一个顺序栈S,元素的入栈顺序是S1,S2,S3,S4,S5,S6,如果6个元素出栈的顺序是S2,S4,S3,S6,S5,S1,则栈的容量至少应该是()。
A.2B.3C.5D.6
23.和顺序栈相比,链栈比较明显的优势是()。
A.通常不会出现栈满的