数据结构习题集.docx
《数据结构习题集.docx》由会员分享,可在线阅读,更多相关《数据结构习题集.docx(31页珍藏版)》请在冰豆网上搜索。
![数据结构习题集.docx](https://file1.bdocx.com/fileroot1/2023-6/3/f6d375cb-f50c-4f32-88d8-53ce677ef844/f6d375cb-f50c-4f32-88d8-53ce677ef8441.gif)
数据结构习题集
绪论习题课
对于给定的n个元素,可以构造出的逻辑结构有()、()、()、()四种。
答案:
集合-线性结构-树形结构-图结构
1.数据的逻辑结构在计算机存储中的映像(或表示)通常有几种方法?
a)-顺序映像和非顺序映像
2.线性结构和树性结构的特点分别是什么?
a)-结构中的数据元素之间存在一个对一个的关系
b)-结构中的数据元素之间存在一个对多个的关系
3.2.计算机算法必须具备输入、输出、()等5个特性。
A.可行性、可移植性和可扩展性B.可行性、确定性和有穷性
C.确定性、有穷性和稳定性D.易读性、安全性和稳定性
-B
5.算法在发生非法操作时可以作出处理的特性称为()
A.正确性B.易读性C.健壮性D.可靠性
-C
6.数据结构是一门研究非数值计算的程序设计问题中计算机的()以及它们之间的()和运算的学科。
第一空A.操作对象B.计算方法C.逻辑存储D.数据映像
第二空A.结构B.关系C.运算D.算法
-A-B
7.在数据结构中,逻辑上数据结构可分为:
()
A.动态结构和静态结构B.线性结构和非线性结构
C.紧凑结构和非紧凑结构D.内部结构和外部结构
❑-B
8.数据结构主要研究数据的()
A.逻辑结构B.存储结构
C.逻辑结构和存储结构D.逻辑结构和存储结构及其运算的实现
❑-D
9.下面的程序段违反了算法的()原则
voidsam()
❑{intn=2;
❑while(!
odd(n))n+=2;
❑printf(n);
❑}
⏹A.有穷性B.确定性C.可行性D.健壮性
⏹-A
线性表习题课
1.在一个单链表中,若删除P结点的后继结点,则( )
A.p->next=p->next->next
B.p=p->next;p->next=p->next->next;
C.p->next=p->next;
D.p=p->next->next;
-A
2.试比较顺序存储结构和链式存储结构的优缺点。
在什么情况下用顺序表比链表好?
①顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。
⏹优点:
存储密度大(=1?
),存储空间利用率高。
缺点:
插入或删除元素时不方便。
②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
⏹优点:
插入或删除元素时很方便,使用灵活。
缺点:
存储密度小(<1),存储空间利用率低。
⏹顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。
⏹若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
⏹若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
3.描述以下三个概念的区别:
头指针、头结点、首元结点(第一个元素结点)。
在单链表中设置头结点的作用是什么?
⏹答:
首元结点是指链表中存储线性表中第一个数据元素a1的结点。
为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理。
头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。
若链表中附设头结点,则不管线性表是否为空表,头指针均不为空。
否则表示空表的链表的头指针为空。
这三个概念对单链表、双向链表和循环链表均适用。
是否设置头结点,是不同的存储结构表示同一逻辑结构的问题。
4.线性表是具有n个()的有限序列
⏹A.表元素B.字符C.数据元素D.数据项E.信息项
⏹-C
5.若语句S的执行时间为O
(1),那么下列程序段的时间复杂度为。
⏹For(i=0;i<=n;i++)
⏹For(j=0;j<=n;j++)
⏹s
A)O(n)B)O(n*n)C)O(n*log2n)D)O(n*i)
6.在一个单链表中,若要在指针P所指向的结点之后插入结点q,应执行的操作是。
❑A)P->next=q
❑B)P->next=q;q->next=P->next->next
❑C)q->next=P->next;P->next:
=q
❑D)P->next=q;q->next=P->next
7.用链表表示线性表的优点是。
❑A)便于随机存储
❑B)花费的存储空间较顺序存储少
❑C)便于插入和删除操作
❑D)数据元素的物理顺序与逻辑顺序相同
8.设长度为n的顺序线性表在任何位置上插入或删除操作都是等概率的,则插入一个元素时平均需要移动_______个元素,删除一个元素时平均需要移动______个元素。
⏹n/2,(n-1)/2
9.在顺序线性表中插入一个元素时,插入位置开始后的所有元素均需要________移动一个位置。
⏹向后
10.在顺序线性表中删除一个元素时,被删除元素后的所有元素均需要__________移动一个位置。
⏹向前
11.线性表的顺序存储结构中逻辑上相邻的元素,物理位置__________相邻;线性表的链式存储结构中逻辑上相邻的元素,物理位置____________相邻。
❑一定,不一定
12.已知单链表的长度为n,则在给定值为x的结点后插入一个新结点的时间复杂度为__________。
❑ O(n)
13.已知单链表的长度为n,则删除给定值为x的结点的时间复杂度为__________。
❑O(n)
14.在单链表中设置头结点的作用是_____________。
❑消除空表的特殊性,统一表示和处理空表和非空表的情形,从而简化插入和删除等操作的某些细节。
15.双向链表中每个结点含有两个指针域,其中一个指针域指向_______结点,另一个指针域指向______结点。
❑前驱,后继
16.在长度为n的线性表中顺序查找某个结点值为X的时间复杂度为______________。
❑O(n)
17.在长度为n的顺序线性表中删除第i个元素(1<=i<=n),则需要向前移动的元素个数为()。
1n-i⑵n+1-i⑶n-1-i⑷I
❑
(1)
18.建立一个长度为n的单链表的时间复杂度为()。
⏹⑴O(n)⑵O
(1)⑶O(n2)⑷((log2n)
❑
(1)
19.设指针p指向单链表中的结点A,结点A的后继结点是结点B,则删除结点B的操作为()。
1p->next=p⑵p=p->next⑶p=p->next->next⑷p->next=p->next->next
⏹(4)
20.在长度为n的顺序线性表中的第i个元素(1<=i<=n+1)之前插入一个新元素时,则需要向后移动的元素个数为()。
❑⑴n-i⑵n+1-i⑶n-1-i⑷I
⏹
(2)
21.在长度为n的有序线性表中插入一个元素后仍然保持有序的平均时间复杂度为()。
❑⑴O(log2n)⑵O
(1)⑶O(n2)⑷O(n)
❑(4)
22.设指针p指向双向链表中的结点A,指针s指向被插入的结点X,则在结点A之后插入结点X的操作为()。
⏹⑴p->rlink=s;s->llink=p;p->rlink->llink=s;s->rlink=p->rlink;
⏹⑵s->llink=p;s->rlink=p->rlink;p->rlink=s;p->rlink->llink=s;
⏹⑶p->rlink=s;p->rlink->llink=s;s->llink=p;s->rlink->p->rlink;
⏹⑷s->llink=p;s->rlink=p->rlink;p->rlink->llink=s;p->rlink=s;
❑(4)
23.指针p指向双向链表中的结点A,则删除结点A的操作是()。
❑⑴p->llink->rlink=p->rlink;p->rlink->llink=p->llink;
❑⑵p->rlink->llink=p->rlink;p->llink->llink=p->llink;
❑⑶p->llink->rlink=p->llink;p->rlink->llink=p->rlink;
❑⑷p->rlink->rlink=p->rlink;p->rlink->rlink=p->rlink;
❑
(1)
24.设head为单链表的头指针,则不带头结点的单链表为空的判定条件是()。
⏹⑴head==NULL
⏹⑵head->next==NULL
⏹⑶head->next==head
⏹⑷head!
=NULL
⏹
(1)
25.设head为单链表的头指针,则带头结点的单链表为空的判定条件是()。
⏹⑴head==NULL
⏹⑵head->next==NULL
⏹⑶head->next==head
⏹⑷head!
=NULL
⏹
(2)
26.设head和tail分别为单向循环链表的头指针和尾指针,则下列等式成立的是()。
⏹⑴head==tail
⏹⑵head->next==tail
⏹⑶tail->next==head
⏹⑷head->next==tail->next
⏹(3)
27.循环链表的主要优点是()
⏹A.不再需要头指针了
⏹B.已知某个结点的位置后,能很容易找到它的直接前驱结点
⏹C.在进行删除操作后,能保证链表不断开
⏹D.从表中任一结点出发都能遍历整个链表
❑-D
28.已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
⏹a.在P结点后插入S结点的语句序列是__________________。
⏹b.在P结点前插入S结点的语句序列是__________________。
⏹c.在表首插入S结点的语句序列是__________________。
d.在表尾插入S结点的语句序列是__________________
(1)P->next=S;
(2)P->next=P->next->next;(3)P->next=S->next;(4)S->next=P->next;
(5)S->next=L;(6)S->next=NULL;(7)Q=P;(8)while(P->next!
=Q)P=P->next;
(9)while(P->next!
=NULL)P=P->next;(10)P=Q;(11)P=L;(12)L=S;(13)L=P;
a.(4)
(1)
b.(7)(11)(8)(4)
(1)c.(5)(12)d.(9)
(1)(6)
1—3章习题
栈和队列习题
1.线性表、栈和队列从逻辑上来说都是____________结构。
可以在线性表的_______位置插入和删除元素;对于栈只能在__________插入和删除元素;对于队列只能在___________插入元素和在_________删除元素。
⏹线性,任何,栈顶,队尾,队头
2.栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,所以又把栈称为__________表;队列的插入和删除运算分别在队列的两端进行,进行插入的一端叫做__________,进行删除的一端叫做___________,先进队的元素必定先出队,所以又把队列称为____________表。
⏹先进后出(FILO),队尾,队头,先进先出(FIFO)
3.假设用向量S[1:
m]来存储顺序栈,指针top指向当前栈顶的位置。
则当栈为空时满足的条件是____________;当栈为满时满足的条件是_____________。
⏹top==0,top==m
4.设有一个空栈,现有输入序列1、2、3、4、5,经过push、push、pop、push、pop、push、push、pop、pop、pop后,输出序列为__________________。
⏹23541
5.在一个顺序循环队列中为了方便入队列和出队列的操作通常约定头指针front指向实际队头元素的____________,尾指针rear指向当前实际队尾元素的____________。
若该顺序循环队列有m个存储单元,则队列满时共有__________个元素。
⏹前一个位置,所在位置,m-1
⏹分析:
在顺序循环队列中约定头指针front和尾指针rear所指向的位置,是牺牲掉一个存储单元而方便表示队列空和队列满的条件,因此顺序循环队列中实际可用的存储单元只有m-1个
6.设有一个顺序循环队列如上题中的约定,则该队列满的条件是_________,队列空的条件是_________。
⏹(rear+1)%m==front,rear==front
7.不论是顺序栈(队列)还是链式栈(队列),插入(删除)运算的时间复杂度均为________。
⏹O
(1)
8.系统在函数调用前自动把调用后的____________压入堆栈;当函数调用结束后,系统又自动作退栈处理,并将程序执行流程无条件转移到所保存的_____________处继续执行。
⏹返回地址,返回地址
9.设元素进栈次序为A、B、C、D、E,则下列不可能的出栈序列是()。
⏹①ABCDE②BCDEA③EABCD④EDCBA
⏹(3)
10.设用一维数组s[m]表示栈的存储空间,用top指向当前栈顶元素(其初始值为-1),则进行出栈时的操作序列是()。
⏹①x=s[op];②x=s[top];top=0;
⏹③x=s[top];top==top-1;
⏹④x=s[top];top==top+1;
⏹(3)
11.设指针hs指向栈顶,指针s指向插入的结点A,则插入结点A时的操作为()。
⏹①hs->next=s;②s->next=hs;hs=s;
⏹③s->next=hs->next;hs->next=s;④s->next=hs;hs=hs->next;
⏹
(2)
12.设用一维数组s[m]表示栈的存储空间,用top指向当前栈顶元素(其初始值为-1),则进行入栈时的操作序列是()。
⏹①s[top]=x;②top=top+1;s[top]=x;
⏹③top==top-1;s[top]=x;④s[top]=x;top==top+1;
⏹
(2)
13.设front是链式队列的头指针,rear是链式队列的尾指针,s指向插入的结点A,则插入结点A的操作为()。
⏹①front->next=s;front=s;②s->next=rear;rear=s;
⏹③rear->next=s;rear=s;④s->next=front;front=s;
⏹(3)
14.设front是链式队列的头指针,rear是链式队列的尾指针,则删除队头元素的操作为()。
⏹①front=front->next;②rear=rear->next;
⏹③rear=front->next;④front=rear->next;
⏹
(1)
15.对于一个具有m个存储单元的顺序循环队列,设front为队头指针,rear为队尾指针,则该队列中队列元素的个数计算公式为()。
⏹①rear-front②front-rear
⏹③(rear-front)%m④(rear-front+m)%m
⏹(4)
⏹分析:
顺序循环队列中的元素个数=,整理合并可写成(rear-front+m)%m。
算法设计题
1.设有两个顺序栈S1和S2共享一个存储区S[0:
m-1],为了尽量利用存储空间减少溢出的可能性,采用栈顶相向、迎面增长的存储方式,要求分别设计两个栈的入栈和出栈操作。
⏹分析:
本题算法思想是引入形式参数flag,当形式参数flag的值为1时表示对栈1进行操作,flag的值为2时表示对栈2进行操作。
⏹typedefstruct{ints[m];inttop1;inttop2;}sqstack;
⏹voidpush(sqstack&stack,intx,intflag)
⏹{
⏹if(stack.top1+1==stack.top2)printf(“stackisfull\n”);
⏹else
⏹{
⏹if(flag==1){stack.top1++;stack.s[stack.top1]=x;}
⏹elseif(flag==2){stack.top2--;stack.s[stack.top2]=x;}elseprintf(“inputerror\n”);
⏹}
⏹}
⏹voidpop(sqstack&stack,int&y,intflag)
⏹{
⏹if(flag==1)
⏹if(stack.top1<0)printf(“empty\n”);else{y=stack.s[stack.top1];stack.top1--;}
⏹elseif(flag==2)
⏹if(stack.top2>=m)printf(“empty\n”);else{y=stack.s[stack.top2];stack.top2--;}
⏹elseprintf(“inputerror\n”);
⏹}
2.设用一个单向循环链表来表示队列(也称循环队列),该队列只设一个队尾指针rear,不设队头指针front,要求设计出该队列的入队列和出队列操作。
⏹设用一个单向循环链表来表示队列(也称链式循环队列),该队列只设一个队尾指针rear,不设队头指针front,要求设计出该队列的入队列和出队列操作。
⏹typedefstructnode{intdata;structnode*next;}lklist;
⏹voidinlkqueue(lklist*&rear,intx)
⏹{
⏹lklist*p;
⏹p=(lklist*)malloc(sizeof(lklist));p->data=x;
⏹if(rear==0){rear=p;rear->next=rear;}else{p->next=rear->next;rear->next=p;rear=p;}
⏹}
⏹voidoutlkqueue(lklist*&rear,int&y)
⏹{
⏹lklist*p;
⏹if(rear==0)printf(“queueisempty\n”);
⏹elseif{rear->next==rear}{y=rear->data;rear=0;}
⏹else{p=rear->next;y=p->data;rear->next=p->next;free(p);}
⏹}
数组与广义表习题课
⑴数组通常只有两种运算:
()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140
⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。
•【解答】d+41
【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。
⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。
•【解答】三元组顺序表,十字链表
⑸广义表((a),(((b),c)),(d))的长度是( ),深度是( ),表头是( ),表尾是( )。
•【解答】3,4,(a),((((b),c)),(d))
⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。
•【解答】Head(Head(Tail(LS)))
选择题
⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要( )个字节,A的第8列和第5行共占( )个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
A90B180C240D540E108F114G54
HA[8][5]IA[3][10]JA[5][8]KA[4][9]
【解答】D,E,K
⑵将数组称为随机存取结构是因为( )
A数组元素是随机的
•B对数组任一元素的存取时间是相等的
C随时可以对数组进行访问
•D数组的存储结构是不定
•【解答】B
⑶下面的说法中,不正确的是( )
A数组是一种线性结构B数组是一种定长的线性结构
•C除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等
•D数组的基本操作有存取、修改、检索和排序等,没有插入与删除操
•【解答】C
【分析】数组属于广义线性表,数组被创建以后,其维数和每维中的元素个数是确定的,所以,数组通常没有插入和删除操作。
⑷对特殊矩阵采用压缩存储的目的主要是为了()
•A表达变得简单
•B对矩阵元素的存取变得简单
•C去掉矩阵中的多余元素
•D减少不必要的存储空间
【解答】D
⑸下面( )不属于特殊矩阵。
•A对角矩阵B三角矩阵C稀疏矩阵D对称矩阵
•【解答】C
⑹若广义表A满足Head(A)=Tail(A),则A为()
•A()B(())C((),())D((),(),())
•【解答】B
⑺下面的说法中,不正确的是( )
•A广义表是一种多层次的结构
•B广义表是一种非线性结构
•C广义表是一种共享结构
•D广义表是一种递归
【解答】B
⑻下面的说法中,不正确的是( )
•A对称矩阵只须存放包括主对角线元素在内的下(或上)三角的元素即可。
•B对角矩阵只须存放非零元素即可。
•C稀疏矩阵中值为零的元素较多,因此可以采用三元组表方法存储。
•D稀疏矩阵中大量值为零的元素分布有规律,因此可以采用三元组表方法存储
【解答】D
判断
•⑴数组是一种复杂的数据结构,数组元素之间的关系既不是线性的,也不是树形的。
•【解答】错。
例如二维数组可以看成是数据元素为线性表的线性表。
•⑵使用三元组表存储稀疏矩阵的元素,有时并不能节省存储空间。
•【解答】对。
因为三元组表除了存储非零元素值外,还需要存储其行号和列号。
•⑶稀疏矩阵压缩存储后,必会失去随