中北大学数据结构习题.docx
- 文档编号:9226803
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:34
- 大小:275.73KB
中北大学数据结构习题.docx
《中北大学数据结构习题.docx》由会员分享,可在线阅读,更多相关《中北大学数据结构习题.docx(34页珍藏版)》请在冰豆网上搜索。
中北大学数据结构习题
《算法与数据结构》习题
第一到三章习题
选择题
1.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(C)。
A.O(n)O(n)B.O(n)O
(1)C.O
(1)O(n)D.O
(1)O
(1)
2.非空的循环单链表head的尾结点p满足(A)。
A.P->next=headB.P->next=NILC.p=NILD.p=head
3.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:
(B)。
A.p->next=s;s->next=p->next;B.s->next=p->next;p->next=s;
C.p->next=s;p->next=s->next;D.p->next=s->next;p->next=s;
4.在双向链表指针p的结点前插入一个指针q的结点操作是(C)注:
双向链表的结点结构为(pre,data,next)。
A.p->pre=q;q->next=p;p->pre->next=q;q->pre=q;
B.p->pre=q;p->pre->next=q;q->next=p;q->pre=p->pre;
C.q->next=p;q->pre=p->pre;p->pre->next=q;p->pre=q;
D.q->pre=p->pre;q->next=q;p->pre=q;p->pre=q;
5.栈的特点是(①B),队列的特点是(②A),栈和队列都是(A③A)。
若进栈序列为1,2,3,4则(④C)不可能是一个出栈序列(不一定全部进栈后再出栈);若进队列的序列为1,2,3,4则(⑤E)是一个出队列序列。
①,②:
A.先进先出B.后进先出C.进优于出D.出优于进
③:
A.顺序存储的线性结构B.链式存储的线性结构
C.限制存取点的线性结构D.限制存取点的非线性结构
④,⑤:
A.3,2,1,4B.3,2,4,1C.4,2,3,1D.4,3,2,1E.1,2,3,4F.1,3,2,4
6.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是(B)。
A.不确定B.n-i+1C.iD.n-i
7.若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是(D)。
A.i-j-1B.i-jC.j-i+1D.不确定的
8.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是(C)。
A.top:
=top+1;V[top]:
=xB.V[top]:
=x;top:
=top+1
C.top:
=top-1;V[top]:
=xD.V[top]:
=x;top:
=top-1
9.表达式a*(b+c)-d的后缀表达式是(B)。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
10.表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(D),其中^为乘幂。
A.3,2,4,1,1;*^(+*-B.3,2,8;*^-
B.C.3,2,4,2,2;*^(-D.3,2,8;*^(-
11.循环队列存储在数组A[0..m]中,则入队时的操作为(D)。
A.rear=rear+1B.rear=(rear+1)mod(m-1)
C.rear=(rear+1)modmD.rear=(rear+1)mod(m+1)
12.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是(C)。
A.6B.4C.3D.2
13.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?
(B)
解析:
当队列非空时,可执行如下的出队操作:
Q.front=(Q.front+1)%Q.queuesize;
当队列非满时,可执行如下的入队操作:
Q.rear=(Q.rear+1)%Q.queuesize;
A.1和5B.2和4C.4和2D.5和1
14.循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是(A)。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front
应用题
1.在程序设计中,可采用下列三种方法实现输出和输入:
(1)通过scanf和printf语句;
(2)通过函数的参数显式传递;
(3)通过全局变量隐式传递。
试讨论这三种方法的优缺点。
答:
(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果出现错误,则会引起整个系统的崩溃。
(2)通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少出错的可能。
(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程序的维护较为困难。
2.线性表有两种存储结构:
一是顺序表,二是链表。
(1)如果有n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。
在此情况下,应选用哪种存储结构?
为什么?
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?
为什么?
答:
(1)选链式存储结构。
它可动态申请内存空间,不受表长度(即表中元素个数)的影响,插入、删除时间复杂度为O
(1)
(2)选顺序存储结构。
顺序表可以随机存取,时间复杂度为O
(1)
3.设pa,pb分别指向两个带头结点的有序(从小到大)单链表。
仔细阅读如下的程序,并回答问题:
(1)程序的功能。
(2)s1,s2中值的含义。
(3)pa,pb中值的含义。
答:
Voidexam(node*pa,node*pb)
{node*p,*p1,*p2;ints1,s2;
p1=pa->next;p2=pb->next;pa->next=null;s1=0;s2=0;
While(p1&&p2)
{if(p1->data
{p=p1;p1=p1->next;s2=s2+1;delete(p)};
elseif(p1->data>p2->data)p2=p2->next;
else(p1->data==p2->data)
{p=p1;p1=p1->next;p->next=pa->next;
pa->next=p;p2=p2->next;s1=s1+1;};
}
While(p1){p=p1;p1=p1->next;delete(p);s2=s2+1}
}
解:
本程序段功能是将pa和pb链表中的值相同的结点保留在pa链表中(pa中与pb中不同结点删除),pa是结果链表的头指针。
链表中结点值与从前逆序。
S1记结果链表中结点个数(即pa与pb中相等的元素个数)。
S2记原pa链表中删除的结点个数。
算法题
1.写出下图双链表中对换值为23和15的两个结点相互位置时修改指针的有关语句。
结点结构为:
(pre,data,next)
解:
设q=p->pre;则
q->next=p->next;p->next->pre=q;
p->pre=q->pre;q->pre->next=p;
p->next=q;q->pre=p
2.顺序结构线性表LA与LB的结点关键字为整数。
LA与LB的元素按非递减有序,线性表空间足够大。
试给出一种高效算法,将LB中元素合到LA中,使新的LA的元素仍保持非递减有序。
高效指最大限度的避免移动元素。
解:
VoidUnion(seqlistLA,seqlistLB)
{m=LA.length;n=LB.length;k=m+n-2;i=m-1;j=n-1;
while(i>=0&&j>=0)
{if(LA.elem[i]>=LB.elem[j])
{LA.elem[k]=LA.elem[i];k=k-1;i=i-1;}
else{LA.elem[k]=LB.elem[j];k=k-1;j=j-1;}
}
while(j>=0){LA.elem[k]=LB.elem[j];k=k-1;j=j-1;}
}
3.给定一个带表头结点的单链表,设head为头指针,结点的结构为(data,next),data为整型元素,next为指针;试写出算法:
按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。
(要求;不允许使用数组作辅助空间)
解:
voidMiniDelete(LinkedListhead)
{LinkedList*pre,*p,*u;
while(head->next!
=null)∥循环到仅剩头结点。
{pre=head;p=pre->next;∥p为工作指针,pre为最小值的前驱
while(p->next!
=null)
{if(p->next->data
p=p->next;}∥记住当前最小值结点的前驱
print(%2d,pre->next->data);∥输出最小值。
u=pre->next;pre->next=u->next;free(u);∥删除最小结点
}
free(head);∥释放头结点。
}
4.试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x);
解:
intLocateElem_L(LinkList&L,ElemTypex)
{
inti=0;
LinkListp=L;
while(p&&p->data!
=x){
p=p->next;
i++;
}
if(!
p)return0;
elsereturni;
}
5.已知单链表中的元素以值递增有序排列。
试写一高效的算法,删除表中所有值大于mink且小于maxk的元素,同时释放被删结点空间。
解:
voiddelete(LinkList&L,intmink,intmaxk){
p=L->next;
while(p&&p->data<=mink)
{pre=p;p=p->next;}//查找第一个值>mink的结点
if(p){
while(p&&p->data
//查找第一个值≥maxk的结点
q=pre->next;pre->next=p;//修改指针
while(q!
=p)
{s=q->next;deleteq;q=s;}//释放结点空间
}
}//delete
6.试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。
已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素
从集合B取出物件放入集合A
要求集合A中同样物件不能有两件以上
因此,算法的策略应该和例2-1基本相同,差别仅在于集合A的初始状态是“空集”
voidunion(List&La,ListLb){
InitList(La);//构造(空的)线性表LA
La_len=ListLength(La);Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++){
GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e
if(!
LocateElem(La,e,equal()))
ListInsert(La,++La_len,e);
//La中不存在和e相同的数据元素,则插入之
}//for
}//union
例如:
(2,3,3,5,6,6,6,8,12)
对集合B而言,
值相同的数据元素必定相邻
对集合A而言,
数据元素依值从小至大的顺序插入
因此,数据结构改变了,
解决问题的策略也相应要改变。
voidpurge(List&La,ListLb){
InitList(LA);La_len=ListLength(La);
Lb_len=ListLength(Lb);//求线性表的长度
for(i=1;i<=Lb_len;i++){
GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e
if(ListEmpty(La)||!
equal(en,e)){
ListInsert(La,++La_len,e);
en=e;
}//La中不存在和e相同的数据元素,则插入之
}//for
}//purge
第四章串习题
1.下面关于串的的叙述中,哪一个是不正确的?
(B)
2.A.串是字符的有限序列B.空串是由空格构成的串
3.C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储
4.2.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为(C)
5.A.求子串B.联接C.匹配D.求串长
6.3.串‘ababaaababaa’的next数组为(C)。
A.012345678999B.012121111212C.011234223456D.0123012322345
4.字符串‘ababaabab’的nextval为(A)
A.(0,1,0,1,0,4,1,0,1)B.(0,1,0,1,0,2,1,0,1)
C.(0,1,0,1,0,0,0,1,1)D.(0,1,0,1,0,1,0,1,1)
5、设字符串S=‘aabaabaabaac',T=‘aabaac'
(1)给出S和T的next值和nextval值;
(2)若S作主串,T作模式串,试给出利用BF算法和KMP算法的匹配过程。
解:
(1)S的next与nextval值分别为012123456789和002002002009;
t的next与nextval值分别为012123和002003。
(2)利用BF算法的匹配过程:
利用KMP算法的匹配过程:
第一趟匹配:
aabaabaabaac第一趟匹配:
aabaabaabaac
aabaac(i=6,j=6)aabaac(i=6,j=6)
第二趟匹配:
aabaabaabaac第二趟匹配:
aabaabaabaac
aa(i=3,j=2)(aa)baac
第三趟匹配:
aabaabaabaac第三趟匹配:
aabaabaabaac
a(i=3,j=1)(成功)(aa)baac
第四趟匹配:
aabaabaabaac
aabaac(i=9,j=6)
第五趟匹配:
aabaabaabaac
aa(i=6,j=2)
第六趟匹配:
aabaabaabaac
a(i=6,j=1)
第七趟匹配:
aabaabaabaac
(成功)aabaac(i=13,j=7)
第6章树和二叉树习题
选择题
1、已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为(D)
A.-A+B*C/DEB.-A+B*CD/E
C.-+*ABC/DED.-+A*BC/DE
2、设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。
与森林F对应的二叉树根结点的右子树上的结点个数是(D)。
A.M1B.M1+M2C.M3D.M2+M3
3、有关二叉树下列说法正确的是(B)
A.二叉树的度为2
B.一棵二叉树的度可以小于2
C.二叉树中至少有一个结点的度为2
D.二叉树中任何一个结点的度都为2
4、二叉树的第I层上最多含有结点数为(C)
A.2IB.2I-1-1C.2I-1D.2I-1
5、一个具有1025个结点的二叉树的高h为(C)
A.11B.10C.11至1025之间D.10至1024之间
解析:
具有n个结点的完全二叉树的深度为
6、高度为K的二叉树最大的结点数为(C)。
A.2kB.2k-1C.2k-1D.2k-1-1
7、利用二叉链表存储树,则根结点的右指针是(C)。
A.指向最左孩子B.指向最右孩子
C.空D.非空
8、对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现编号。
A.先序B.中序C.后序D.从根开始按层次遍历
9、某二叉树中序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E则先序序列是:
B
A.E,G,F,A,C,D,BB.E,A,C,B,D,G,FC.E,A,G,C,F,B,DD.上面的都不对
10、上题的二叉树对应的森林包括多少棵树(B)
A.lB.2C.3D.概念上是错误的
11、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(C)
A.所有的结点均无左孩子B.所有的结点均无右孩子
C.只有一个叶子结点D.是任意一棵二叉树
12、在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序(B)
A.都不相同 B.完全相同
C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同
13、在完全二叉树中,若一个结点是叶结点,则它没(C)。
A.左子结点B.右子结点
C.左子结点和右子结点D.左子结点,右子结点和兄弟结点
14、n个结点的线索二叉树上含有的线索数为(C)
A.2nB.n-lC.n+lD.n
(解析:
一棵n结点树包含n-1条边,而每个结点有两个指针域即总共2n个指针,减去表示边的指向关系(即左右子树)的n-1条边,剩下n+1条边即为线索。
)
15、下述编码中哪一个不是前缀码(B)。
A.(00,01,10,11)B.(0,1,00,11)
C.(0,10,110,111)D.(1,01,000,001)
(解析:
一组编码中任何一个编码均不为其他编码的前缀.避免了多义性,且缩短了报文总长)
16、在下述结论中,正确的是(D)
①只有一个结点的二叉树的度为0;②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④
17、若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B)
A.9B.11C.15D.不确定
(解析:
任意一棵二叉树,度为零的节点即叶子节点的数比度为二的节点多一。
)
18、具有10个叶结点的二叉树中有(B)个度为2的结点
A.8B.9C.10D.1l
19、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)
(1023是满二叉树,有512片叶子。
1001比1023少22个结点,所以有512-22+22/2=501片叶子。
511是满二叉树,有256片叶子。
1001比511多490个结点,所以有256+490-(490+1)/2=501片叶子。
所以答案就是501了。
)
A.250B.500C.254D.501
20、有n个叶子的哈夫曼树的结点总数为(D)。
A.不确定B.2nC.2n+1D.2n-1
21、二叉树的先序遍历和中序遍历如下:
先序遍历:
EFHIGJK;中序遍历:
HFIEJKG。
该二叉树根的右子树的根是(C)。
A、EB、F C、G D、H
22、设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是(A)
A.m-nB.m-n-1C.n+1D.条件不足,无法确定
23、用一维数组存储二叉树时,总是以(D)遍历顺序存储结点
A.先序B.中序C.后序D.按层次遍历
24、对一棵二叉树进行层次遍历时,应借助于一个(D)。
A.顺序表B.数组C.栈D.队列
25、某二叉树的先序序列和后序序列正好相反,则该二叉树一定是(C)的二叉树。
A.空或只有一个结点B.任一结点无左子树
C.高度等于其结点数D.任一结点无右子树
26、设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1则T中的叶子数为(D)
A.5B.6C.7D.8
(设度为0的结点数为n0,度为1的结点数为n1,度为2的结点数为n2,度为3的结点数为n3,度为4的结点数为n4,那么这棵树总的结点数为n0+n1+n2+n3+n4;又因为树中的每个结点(除了根结点外)都有一个指针指向它,那么这棵树总的结点数为总的指针数加上1;
总的指针数=1*n1+2*n2+3*n3+4*n4;故有:
1+1*n1+2*n2+3*n3+4*n4=n0+n1+n2+n3+n4;从而有
n0=1+n2+2*n3+3*n4=1+2+2*1+3*1=8;)
27、将一棵树t转换为孩子—兄弟链表表示的二叉树h,则t的后根序遍历是h的(B)
A.先序遍历B.中序遍历C.后序遍历
28、某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号为1,2,…,n,且有如下性质:
T中任一结点V,其编号等于左子树上的最小编号减1,而V的右子树的结点中,其最小编号等于V左子树上结点的最大编号加1。
这时是按(B)编号的。
A.中序遍历序列B.先序遍历序列C.后序遍历序列D.层次顺序
应用题
1、从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。
答:
树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树(森林的特例)可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。
树和二叉树的区别有:
一是二叉树的度至多为2,树无此限制;二是二叉树有左右子树之分,即使在只有一个分枝的情况下,也必须指出是左子树还是右子树,树无此限制。
2、试找出满足下列条件的二叉树
1)先序序列与后序序列相同;2)中序序列与后序序列相同;3)先序序列与中序序列相同;
1)、既不含左子树,也不含右子树的二叉树。
2)、不含右子树的二叉树。
3)、不含左子树的二叉树。
3、已知一棵度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中北大学 数据结构习题 北大 数据结构 习题