数据结构习题集附答案.docx
《数据结构习题集附答案.docx》由会员分享,可在线阅读,更多相关《数据结构习题集附答案.docx(22页珍藏版)》请在冰豆网上搜索。
![数据结构习题集附答案.docx](https://file1.bdocx.com/fileroot1/2023-1/27/f09b8e25-5a2e-4394-b7d9-3af1d64e9e49/f09b8e25-5a2e-4394-b7d9-3af1d64e9e491.gif)
数据结构习题集附答案
【数据结构习题集附答案】
数据结构习题集附答案第一章绪论一、选择题1.组成数据的基本单位是()A.数据项B.数据类型C.数据元素D.数据变量2.数据结构是研究数据的()以及它们之间的相互关系。
A.理想结构,物理结构B.理想结构,抽象结构C.物理结构,逻辑结构D.抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成()。
A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。
①A.数据元素B.计算方法C.逻辑存储D.数据映像②A.结构B.关系C.运算D.算法5.算法分析的两个主要方面是()。
A.数据复杂性和程序复杂性B.正确性和简明性C.可读性和简明性D.空间复杂性和时间复杂性6.算法分析的目的是()。
A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性7.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。
①A.计算方法B.排序方法C.解决问题的有限运算序列D.调度方法②A.可执行性,可移植性和可扩充性B.可行性,确定性和有穷性C.确定性、有穷性和稳定性D.易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构。
()2.算法就是程序。
()3.数据元素是数据的最小单位。
()4.算法的五个特性为:
有穷性、输入、输出、完成性和确定性。
()5.算法的时间复杂度取决于问题的规模和待处理数据的初态。
()三、填空题1.数据逻辑结构包括________、________、________和________四种类型,其中树形结构和图形结构合称为________。
2.在线性结构中,第一个结点________前驱结点,其余每个结点有且只有________个前驱结点;
最后一个结点________后续结点,其余每个结点有且只有________个后续结点。
3.在树形结构中,树根结点没有________结点,其余每个结点有且只有________个前驱结点;
叶子结点没有________结点,其余每个结点的后续结点可以________。
4.在图形结构中,每个结点的前驱结点数和后续结点数可以________。
5.线性结构中元素之间存在________关系,树形结构中元素之间存在________关系,图形结构中元素之间存在________关系。
6.算法的五个重要特性是________、________、________、________、________。
7.数据结构的三要素是指________、________和________。
8.链式存储结构与顺序存储结构相比较,主要优点是________________________________。
9.设有一批数据元素,为了最快的存储某元素,数据结构宜用________结构,为了方便插入一个元素,数据结构宜用________结构。
四、算法分析题1.求下列算法段的语句频度及时间复杂度for(i=1;ii++)for(j=1;jj++)x=x+1;分析:
该算法为一个二重循环,执行次数为内、外循环次数相乘,但内循环次数不固定,与外循环有关,因些,时间频度T(n)=1+2+3+…+n=n*(n+1)/2有1/4≤T(n)/n2≤1,故它的时间复杂度为O(n2),即T(n)与n2数量级相同。
2.分析下列算法段的时间频度及时间复杂度for(i=1;ii++)for(j=1;jj++)for(k=1;kk++)x=i+j-k;分析算法规律可知时间频度T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+…+n)由于有1/6≤T(n)/n3≤1,故时间复杂度为O(n3)第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。
A.110B.108C.100D.1202.向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
A.64B.63C.63.5D.73.线性表采用链式存储结构时,其地址()。
A.必须是连续的B.部分地址必须是连续的C.一定是不连续的D.连续与否均可以4.在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()。
A.s-next=p;p-next=s;B.s-next=p-next;p-next=s;C.s-next=p-next;p=s;D.p-next=s;s-next=p;5.在一个单链表中,若删除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;6.下列有关线性表的叙述中,正确的是()。
A.线性表中的元素之间隔是线性关系B.线性表中至少有一个元素C.线性表中任何一个元素有且仅有一个直接前趋D.线性表中任何一个元素有且仅有一个直接后继7.线性表是具有n个()的有限序列(n≠0)。
A.表元素B.字符C.数据元素D.数据项二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。
()2.如果没有提供指针类型的语言,就无法构造链式结构。
()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。
()4.语句p=p-next完成了指针负值并使p指针得到了p指针所指后继结点的数据域值。
()5.要想删除p指针的后继结点,我们应该执行q=p-next;
p-next=q-next;
free(q)。
()三、填空题1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:
________。
2.顺序表中逻辑上相邻的元素物理位置()相邻,单链表中逻辑上相邻的元素物理位置________相邻。
3.线性表L=(a1,a2,...,an)采用顺序存储,假定在不同的n+1个位置上插入的概率相同,则插入一个新元素平均需要移动的元素个数是________。
4.在非空双向循环链表中,在结点q的前面插入结点p的过程如下:
p-prior=q-prior;q-prior-next=p;p-next=q;________;5.已知L是无表头结点的单链表,是从下列提供的答案中选择合适的语句序列,实现:
表尾插入s结点的语句序列是________。
A.p-next=s;B.p=L;C.L=s;D.p-next=s-next;E.s-next=p-next;F.s-next=L;G.s-next=null;H.while(p-next!
=0)p=p-next;I.while(p-next!
=null)p=p-next;四、算法设计题1.试编写一个求已知单链表的数据域的平均值的函数(数据域数据类型为整型)。
2.已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数。
3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。
现出库(销售)m台价格为h的电视机,试编写算法修改原链表。
4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。
现新到m台价格为h的电视机,试编写算法修改原链表。
5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与b(a≤b)之间的元素。
6.设A=(a0,a1,a2,...,an-1),B=(b0,b1,b2,...,bm-1)是两个给定的线性表,它们的结点个数分别是n和m,且结点值均是整数。
若n=m,且ai=bi(0≤in),则A=B;
若nm,且ai=bi(0≤in),则AB;
若存在一个j,jm,jn,且ai=bi(0≤ij),若ajbj,则AB,否则AB。
试编写一个比较A和B的C函数,该函数返回-1或0或1,分别表示AB或A=B或AB。
7.试编写算法,删除双向循环链表中第k个结点。
8.线性表由前后两部分性质不同的元素组成(a0,a1,...,an-1,b0,b1,...,bm-1),m和n为两部分元素的个数,若线性表分别采用数组和链表两种方式存储,编写算法将两部分元素换位成(b0,b1,...,bm-1,a0,a1,...,an-1),分析两种存储方式下算法的时间和空间复杂度。
9.用循环链表作线性表(a0,a1,...,an-1)和(b0,b1,...,bm-1)的存储结构,头指针分别为ah和bh,设计C函数,把两个线性表合并成形如(a0,b0,a1,b1,…)的线性表,要求不开辟新的动态空间,利用原来循环链表的结点完成合并操作,结构仍为循环链表,头指针为head,并分析算法的时间复杂度。
10.试写出将一个线性表分解为两个带有头结点的循环链表,并将两个循环链表的长度放在各自的头结点的数据域中的C函数。
其中,线性表中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表中。
11.试写出把线性链表改为循环链表的C函数。
12.己知非空线性链表中x结点的直接前驱结点为y,试写出删除x结点的C函数。
第三章栈和队列一、选择题1.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是()。
A.edcbaB.decbaC.dceabD.abcde2.栈结构通常采用的两种存储结构是()。
A.线性存储结构和链表存储结构B.散列方式和索引方式C.链表存储结构和数组D.线性存储结构和非线性存储结构3.判定一个栈ST(最多元素为m0)为空的条件是()。
A.ST-〉top!
=0B.ST-〉top==0C.ST-〉top!
=m0D.ST-〉top=m04.判定一个栈ST(最多元素为m0)为栈满的条件是()。
A.ST-top!
=0B.ST-top==0C.ST-top!
=m0-1D.ST-top==m0-15.一个队列的入列序列是1,2,3,4,则队列的输出序列是()。
A.4,3,2,1B.1,2,3,4C.1,4,3,2D.3,2,4,16.循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear则当前队列中的元素个数是()。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front7.栈和队列的共同点是()A.都是先进后出B.都是先进先出C.只允许在端点处插入和删除元素D.没有共同点8.表达式a*(b+c)-d的后缀表达式是()。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd9.4个元素a1,a2,a3和a4依次通过一个栈,在a4进栈前,栈的状态,则不可能的出栈序是()。
A.a4,a3,a2,a1B.a3,a2,a4,a1C.a3,a1,a4,a2D.a3,a4,a2,a110.以数组Q[0..m-1]存放循环队列中的元素,变量rear和qulen分别指示循环队列中队尾元素的实际位置和当前队列中元素的个数,队列第一个元素的实际位置是()。
A.rear-qulenB.rear-qulen+mC.m-qulenD.1+(rear+m-qulen)%m二、填空题1.栈的特点是________,队列的特点是________。
2.线性表、栈和队列都是________结构,可以在线性表的________位置插入和删除元素,对于栈只能在________插入和删除元素,对于队列只能在________插入元素和________删除元素。
3.一个栈的输入序列是*****,则栈有输出序列*****是________。
(正确/错误)4.设栈S和队列Q的初始状态皆为空,元素a1,a2,a3,a4,a5和a6依次通过一个栈,一个元素出栈后即进入队列Q,若6个元素出队列的顺序是a3,a5,a4,a6,a2,a1则栈S至少应该容纳________个元素。
三、算法设计题1.假设有两个栈s1和s2共享一个数组stack[M],其中一个栈底设在stack处,另一个栈底设在stack[M-1]处。
试编写对任一栈作进栈和出栈运算的C函数push(x,i)和pop(i),i=l,2。
其中i=1表示左边的栈,,i=2表示右边的栈。
要求在整个数组元素都被占用时才产生溢出。
2.利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?
写出模拟队列的插入和删除的C函数。
一个栈s1用于插入元素,另一个栈s2用于删除元素。
第四章串一、选择题1.下列关于串的叙述中,正确的是()A.一个串的字符个数即该串的长度B.一个串的长度至少是1C.空串是由一个空格字符组成的串D.两个串S1和S2若长度相同,则这两个串相等2.字符串“abaaabab“的nextval值为()A.(0,1,01,1,0,4,1,0,1)B.(0,1,0,0,0,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)3.字符串满足下式,其中head和tail的定义同广义表类似,如head(‘xyz’)=‘x’,tail(‘xyz’)=‘yz’,则s=()。
concat(head(tail(s)),head(tail(tail(s))))=‘dc’。
A.abcdB.acbdC.acdbD.adcb4.串是一种特殊的线性表,其特殊性表现在()A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符5.设串S1=‘*****’,s2=‘PQRST’,函数CONCAT(X,Y)返回X和Y串的连接串,SUBSTR(S,I,J)返回串S从序号I开始的J个字符组成的字串,LENGTH(S)返回串S的长度,则CONCAT(SUBSTR(S1,2,LENGTH(S2)),SUBSTR(S1,LENGTH(S2),2))的结果串是()。
A.BCDEFB.BCDEFGC.*****D.*****二、算法设计1.分别在顺序存储和一般链接存储两种方式下,用C语言写出实现把串s1复制到串s2的串复制函数strcpy(s1,s2)。
2.在一般链接存储(一个结点存放一个字符)方式下,写出采用简单算法实现串的模式匹配的C语言函数intL_index(t,p)。
第五章数组与广义表一、选择题1.常对数组进行的两种基本操作是()A.建立与删除B.索引和修改C.查找和修改D.查找与索引2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M的起始地址与M按列存储时元素()的起始地址相同。
A.MB.MC.MD.M3.数组A中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数是()。
A.80B.100C.240D.2704.数组A中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A的起始地址为()。
A.SA+141B.SA+144C.SA+222D.SA+2255.数组A中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A的起始地址为()。
A.SA+141B.SA+180C.SA+222D.SA+2256.稀疏矩阵一般的压缩存储方法有两种,即()。
A.二维数组和三维数组B.三元组和散列C.三元组和十字链表D.散列和十字链表7.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点()。
A.正确B.错误8.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i=j),在一组数组B的下标位置k的值是()。
A.i(i-1)/2+j-1B.i(i-1)/2+jC.i(i+1)/2+j-1D.i(i+1)/2+j二、填空题1.己知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A),则A的地址是________。
2.二维数组A采用列序为主方式存储,每个元素占一个存储单元,并且A的存储地址是200,则A的地址是________。
3.有一个10阶对称矩阵A,采用压缩存储方式(以行序为主,且LOC(A)=1),则A的地址是________。
4.设n行n列的下三角矩阵A已压缩到一维数组S[1..n*(n+1)/2]中,若按行序为主存储,则A[i][j]对应的S中的存储位置是________。
5.若A是按列序为主序进行存储的4×6的二维数组,其每个元素占用3个存储单元,并且A的存储地址为1000,元素A的存储地址为________,该数组共占用________个存储单元。
三、算法设计1.如果矩阵A中存在这样的一个元素A[i][j]满足条件:
A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。
编写一个函数计算出1×n的矩阵A的所有马鞍点。
算法思想:
依题意,先求出每行的最小值元素,放入min[m]之中,再求出每列的最大值元素,放入max[n]之中,若某元素既在min[i]中,又在max[j]中,则该元素A[i][j]便是马鞍点,找出所有这样的元素,即找到了所有马鞍点。
2.n只猴子要选大王,选举办法如下:
所有猴子按1,2,...,n编号围坐一圈,从1号开始按1、2、...、m报数,凡报m号的退出到圈外,如此循环报数,直到圈内剩下只猴子时,这只猴子就是大王。
n和m由键盘输入,打印出最后剩下的猴子号。
编写一程序实现上述函数。
算法思想:
本题用一个含有n个元素的数组a,初始时a[i]中存放猴子的编号i,计数器似的值为0。
从a[i]开始循环报数,每报一次,计数器的值加1,凡报到m时便打印出a[i]值(退出圈外的猴子的编号),同时将a[i]的值改为O(以后它不再参加报数),计数器值重新置为0。
该函数一直进行到n只猴子全部退出圈外为止,最后退出的猴子就是大王。
因此,现本题功能的程序如下:
3.数组和广义表的算法验证程序编写下列程序:
(1)求广义表表头和表尾的函数head()和tail()。
(2)计算广义表原子结点个数的函数count_GL()。
(3)计算广义表所有原子结点数据域(设数据域为整型〉之和的函数sum_GL()。
#include“stdio.h“#include“malloc.h“typedefstructnode{inttag;union{structnode*sublist;chardata;}dd;structnode*link;}NODE;NODE*creat_GL(char**s){NODE*h;charch;ch=*(*s);(*s)++;if(ch!
='\0'){h=(NODE*)malloc(sizeof(NODE));if(ch=='('){h-tag=1;h-dd.sublist=creat_GL(s);}Else{h-tag=0;h-dd.data=ch;}}elseh=NULL;ch=*(*s);(*s)++;if(h!
=NULL)if(ch==',')h-link=creat_GL(s);elseh-link=NULL;return(h);}voidprn_GL(NODE*p){if(p!
=NULL){if(p-tag==1){printf(“(“);if(p-dd.sublist==NULL)printf(““);elseprn_GL(p-dd.sublist);}elseprintf(“%c“,p-dd.data);if(p-tag==1)printf(“)“);if(p-link!
=NULL){printf(“,“);prn_GL(p-link);}}}NODE*copy_GL(NODE*p){NODE*q;if(p==NULL)return(NULL);q=(NODE*)malloc(sizeof(NODE));q-tag=p-if(p-tag)q-dd.sublist=copy_GL(p-dd.sublist);elseq-dd.data=p-dd.data;q-link=copy_GL(p-link);return(q);}NODE*head(NODE*p)/*求表头函数*/{return(p-dd.sublist);}NODE*tail(NODE*p)/*求表尾函数*/{return(p-link);}intsum(NODE*p)/*求原子结点的数据域之和函数*/{intm,n;if(p==NULL)return(0);else{if(p-tag==0)n=p-dd.data;elsen=sum(p-dd.sublist);if(p-link!
=NULL)m=sum(p-link);elsem=0;return(n+m);}}intdepth(NODE*p)/*求表的深度函数*/{inth,maxdh;NODE*q;if(p-tag==0)return(0);elseif(p-tag==1p-dd.sublist==NULL)return1;else{maxdh=0;while(p!
=NULL){if(p-tag==0)h=0;else{q=p-dd.sublist;h=depth(q);}if(hmaxdh)maxdh=h;p=p-link;}return(maxdh+1);}}main(){NODE*hd,*hc;chars,*p;p=gets(s);hd=creat_GL(prn_GL(head(hd));prn_GL(tail(hd));hc=copy_GL(hd);printf(“copyafter:
“);prn_GL(hc);printf(“sum:
%d\n“,sum(hd));printf(“depth:
%d\n“,depth(hd));}第六章树一、选择题1.在线索化二叉树中,t所指结点没有左子树的充要条件是()。
A.t-〉left==NULLB.t-〉ltag==1C.t-〉ltag=1且t-〉left=NULLD.以上都不