数据结构习题1.docx
《数据结构习题1.docx》由会员分享,可在线阅读,更多相关《数据结构习题1.docx(74页珍藏版)》请在冰豆网上搜索。
![数据结构习题1.docx](https://file1.bdocx.com/fileroot1/2023-6/8/4fa34151-0aaf-421a-9bfc-7c1bb4ce3d1d/4fa34151-0aaf-421a-9bfc-7c1bb4ce3d1d1.gif)
数据结构习题1
数据结构习题册
(仅供计算机和信息专业同学参考)
计算机科学技术教研室
二OO八年十一月
基础篇
习题1
一、选择题
1计算机算法必须具备输入、输出、(B)等5个特性。
A可行性、可移植性和可扩展性B可行性、确定性和有穷性
C确定性、有穷性和稳定性D易读性、安全性和稳定性
2在数据结构中,从逻辑上可以把数据结构分为(D)
A动态结构和静态结构B紧凑结构和非紧凑结构
C内容结构和外部结构D线性结构和非线性结构
3下面程序段的时间复杂性的量级为(D)
For(i=1;i<=n;i++)
For(j=1;j<=I;j++)
For(k=1;k<=j;k++)
x=x+1;
AO
(1)BO(n)CO(n2)DO(n3)
4在数据结构中,与所使用的计算机无关的是数据的(A)结构
A逻辑B存储C逻辑和存储D物理
5数据结构在计算机中的表示是指(C)
A数据的逻辑结构B数据结构C数据的存储结构D数据元素之间的关系
6下面(B)的时间复杂性最好,即执行时间最短。
AO(n)BO(logn)CO(nlogn)DO(n2)
7下面程序段的时间复杂性的量级为(D)。
Intfun(intn){
I=1,s=1;
While(ss+=++I;
returnI;
}
AO(n/2)BO(logn)CO(n)DO(n1/2)
8下面程序段的时间复杂性的量级为(C)。
For(inti=0;iFor(intj=0;jA[i][j]=i*j;
AO(m3)BO(n2)CO(m*n)DO(m+n)
9执行下面程序段时,S语句的执行次数为(A)。
For(inti=1;iFor(intj=i+1;j<=n;j++)
S;
An(n-1)/2Bn2/2Cn(n-1)/2Dn
二、简答题
1数据的逻辑结构有哪几种?
常用的存储有哪几种?
集合线性结构树形结构图状结构顺序存储结构链式存储结构
2举一个数据结构的例子,叙述其逻辑结构、存储结构和运算三方面的内容。
3什么叫算法?
它有哪些特性
4有下列几种用二元组表示的数据结构,画出它们分别对应的逻辑结构图,并指出它们分别以属于何种结构。
(1)A=(K,R),其中
K={a,b,c,d,e,f,g,h}
R={r}
r={,,,,,,}
(2)B=(K,R),其中
K={a,b,c,d,e,f,g,h}
R={r}
r={,,,,,,}
(3)B=(K,R),其中
K={1,2,3,4,5,6}
R={r}
r={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}
三、计算题
设n为整数,求下列各程序段的时间复杂度
(1)i=1;k=2;
While(ik=k+10*I;
i=i+1;
}
(2)i=1;j=0;
While(i+j<=n)
If(i>j)j=j+1;
Elsei=i+1;
(3)x=91;y=100
While(y>0)
If(x>100){
x=x-10;
y=y-1;
}elsex=x+1;
习题1参考答案
一、选择题
1.B2.D3.D4.A5.C6.B7.D8.C9.A
二、简答题
1.答:
数据的逻辑结构通常有四种,即集合、线性结构、树形结构和图状结构。
存储结构主要有顺序存储结构和链式存储结构。
2.答:
比如一分通讯录,记录了相关人员的电话号码,将其按姓名一人占一行构成表,这个表就是一个数据结构。
每一行是一个记录,对于整个表来说,只有一个开始结点和一个终端结点,其它结点也只有一个前驱和一个后继。
这几个关系就确定了表的逻辑结构。
3.答:
算法是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
算法具有有穷性、确定性、可行性、输入和输出5个特性。
4.答:
(1)A对应的逻辑图形如下图左,它是一种线性结构。
(2)B对应的逻辑图形如上图右所示,它是一种树型结构。
(3)C对应的逻辑图形如下图所示,它是一种图型结构。
三、计算题
解:
(1)O(n);
(2)O(n);(3)O(n1/2)。
习题2
一、选择题
1线性表是(A)
A一个有限序列,可以为空B一个有限序列,不能为空
C一个无限序列,可以为空D一个无限序列,不能为空
2在一个长度为n的顺序表中,向第iI个元素(1≤i≤n+1)位置插入一个新元素时,需要从后向前依次后移(B)个元素。
An-iBn-i+1Cn-i-1Di
3在一个顺序表的表尾插入一个元素的时间复度的量级为(B)。
AO(n)BO
(1)CO(n2)DO(logn)
4表长为n的顺序存储的线性表,当在任意位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为(C),删除一个元素需要移动元素的平均个数为(D)
A(n-1)/2BnC(n+1)/2Dn/2
5设单链表中指针p指向结点a,若要删除p之后的结点(若存在),则需修改指针的操作为(A)。
Ap->next=p->next->nextBp=p->next
Cp=p->next->nextDnext=p
6单链表的存储密度为(C)。
A大于1B等于5C小于1D不能确定
7在一个单链表中,若要在p所指向的结点之后插入一个新结点,则需要相继修改(B)个指针域的值。
A1B2C3D4
8在一个单链表中,若要在p所指向的结点之前插入一个新结点,则此算法的时间复杂度的量级为(A)。
AO(n)BO(n/2)CO
(1)DO(n1/2)
9在一个带头结点的双向循环链表中,若要在p所指向的结点之前插入一个新结点,则需要相继修改(C)个指针域的值。
A2B3C4D6
二、简答题
1什么叫线性表?
它有哪些特点?
2在链表的设计中,为什么通常采用带头结点的链表结构?
3对比顺序表与单链表,说明顺序表与单链表的主要优点和主要缺点。
4试编写算法实现顺序表的逆置,即把顺序表A中的数据元素(a1,a2,…,an)逆置为(an,an-1,…,a1)。
5已知A和B为两个非递减的线性表,现要求实现如下操作:
从A中删除在B中出现的元素。
试编写在顺序表中实现上述操作的算法。
6试编写算法实现链表的就地逆置(不增加存储空间),即把链表A中的数据元素(a1,a2,…,an)逆置为(an,an-1,…,a1)。
7假设有两个非递减的线性表A和B,均采用链式存储结构,试编写算法将A和B归并成一个按元素非递减的线性表C。
8试编写算法求单循环链表的表长。
1.A2.B3.B4.DA5.A6.C7.B8.A9.C
二、简答题
1.答:
线性表是具有n个数据元素的一个有限序列。
线性表的特点是:
数据元素之间是一对一的关系。
除第一个元素外,每个元素有且只有一个直接前驱;除最后一个元素外,每个元素有且只有一个直接后继。
2.答:
头指针是链表的一个标识,它用来指向带头结点的链表中的头结点。
头结点是在链表的第一个数据元素之前附加的一个结点,它的作用是使对第一个结点的操作和其它结点一致,表空与非空时处理一致,不需要特殊处理,简化了操作。
3.答:
顺序表的特点是逻辑位置相邻的数据元素其物理位置也相邻,因此可以进行随机存储,是一种随机存储结构。
其插入和删除操作的时间复杂度均为O(n)。
链表中的数据元素使用一组任意的存储单元存储,不要求逻辑位置相邻的数据元素物理位置也相邻,而是采用附加的指针表示元素之间的逻辑关系。
链表的插入和删除结点均不需要移动其他结点,但是,其查找运算必须从头指针开始顺序查找,其时间复杂度为O(n)。
4.答:
算法如下
voidConvert(SqList&L){
inti,j,temp;
j=L.length-1;
i=0;
while(itemp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
i++;
j--;
}
}
5.答:
算法如下
voidDelete(SqList&La,SqListLb){
inti,j,k;
i=0;j=0;
while(iif(La.elem[i]elseif(La.elem[i]>Lb.elem[j])j++;
elseListDelete_Sq(La,i+1,k);
}
}
6.答:
算法如下
voidInvertList(LinkList&L){
LinkListp,q,r;
p=L->next;
q=p->next;
p->next=NULL;
while(q!
=NULL){
r=q->next;
q->next=p;
p=q;
q=r;
}
L->next=p;
}
7.答:
算法如下
voidMergeOrder(LinkListLa,LinkListLb){
LinkListpa,pb,Lc,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(!
pa)pc->next=pb;
elsepc->next=pa;
}
8.答:
算法如下
intLength(LinkListL){
inti=0;
LinkListp;
p=L->next;
while(p){
p=p->next;
i++;
}
returni;
}
习题3
一、选择题
1在栈顶一端可进行的全部操作是()。
A插入B删除C插入和删除D进栈
2栈的特点是()。
A先进先出B后进先出C后进后出D不进不出
3顺序栈是空栈的条件是()。
Atop==0Btop==1Ctop==-1Dtop==m
4假定利用数组A[N]顺序存储一个栈,top表示栈顶指针,已知栈未满,则x入栈时所执行的操作是()。
Aa[--top]=x;Ba[top--]=xCa[++top]=xDa[top++]=x
5一个栈的入栈序列是a,b,c,d,e,则不可能的出栈序列是()。
AedcdaBdceabCdecbaDabcde
6经过下列栈的运算后EmptyStack(s)的值是()。
InitStack(s);Push(s,a);Push(s,b);Pop(s,x);Pop(s,x);
AaBbC1D0
7若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。
AiBn-iCn-i+1D不确定
8队列的特点是()。
A先进先出B后进先出C先进后出D不进不出
9循环队列S为满的条件是()。
AS->rear==S->front
BS->rear+1)%maxsiae==s->front
CS->rear==0
Ds->front==0
10经过下列运算后GetHead(Q)的值是()。
InitQueue(Q);EnQueue(Q,a);EnQueue(Q,b);DeQueue(Q,x);
AaBbC1D2
二、简答题
1简述栈与队列的相同点与不同点。
2在顺序队列中,什么叫真溢出?
什么叫假溢出?
为什么顺序队列常都采用循环队列结构?
3设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针),试编写相应的入队列、出队列算法。
4设计一个输出如下形式数值的递归算法。
4444
333
22
1
5编写一个算法,利用栈的基本运算返回指定栈中的栈底元素。
习题3参考答案
一、选择题
1.C2.B3.A4.D5.B6.C7.C8.A9.B10.B
二、简答题
1.答:
栈是限定在表的一端进行插入和删除操作的线性表。
队列是只允许在表的一端进行插入,而在另一端进行删除元素的线性表。
栈的操作是按照后进先出原则进行的,因此又称作后进先出的线性表。
队列的操作是按照先进先出原则进行的,因此又称作先进先出的线性表。
2.答:
当front0,rear=M时,再有元素入队发生溢出,称之为“假溢出”,存储空间还有剩余。
为了改进这种状况,可以将顺序队列想象为一个首尾相接的环状空间,称之为循环队列。
3.答:
(1)相应入队列操作
StatusEnQueue_L(LinkQueue&Q,ElemTypee){
p=(QLink)malloc(sizeof(QNode));
p->data=e;p->next=Q->next;
Q->next=p;
Q=p;
returnOK;
}
(2)相应出队列的操作
StatusDeQueue_L(LinkQueue&Q,ElemType&e){
if(Q->next==Q)returnERROR;
p=Q.next->next;
e=p->data;
Q->next->next=p->next;
free(p);
returnOK;
}
4.答:
算法如下
voidPrint(intn){
inti;
if(n==0)
return;
for(i=1;i<=n;i++)
printf("%3d",n);
printf("\n");
Print(n-1);
}
5.答:
算法如下
ElemTypeBottom(StackS){
ElemTypex,y;
StackT;
InitStack(T);
while(!
StackEmpty(S)){
pop(S,x);
push(T,x);
}
while(!
StackEmpty(T)){
pop(T,y);
push(S,y);
}
returnx;
}
习题4
一、选择题
1串是一种特殊的线性表,其特殊性体现在()
A唯一可以顺序存储B数据元素是一个字符
C可以链接存储D数据元素可以是多个字符
2下面()是C语言中“abcd321ABCD”的子串。
AabcdB321ABC“abcAB”D“21AB”
3设有两个串p和q,求p和q首次出现的位置的运算称作()
A连接B模式匹配C求子串D求串长
4设有一个字符串S=“windows”,求子串的数目是()
A25B26C27D28
二、简答题
1空串与空格串有什么区别?
字符串中的空格有什么意思?
空串在串的处理中有什么作用?
2串是由字符组成的,长度为1的串和字符是否相同?
为什么?
3简述串的静态顺序存储结构与动态顺序存储结构有什么区别,分别写出它们的结构体定义。
4字符串采用静态顺序存储结构。
编写一个算法删除S中地i个字符到第j个字符。
5编写一个算法判断s2是否是s1的子串。
习题4参考答案
一、选择题
1.B2.D3.B4.D
二、简答题
1.答:
长度为零的串称为空串,记作""。
空格也是串的字符集合中的一个元素,由一个或多个空格组成的串称为空格串。
例如"",其长度为串中空格的个数。
2.答:
虽然串是由字符组成的,但串和字符是两个不同的概念。
串是长度不确定的字符序列,而字符只是一个字符。
即使是长度为1的串也与字符不同。
例如,串"a"和字符'a'就是两个不同的概念,因为在存储时串的结尾通常加上串结束标志'\0'。
3.答:
在串的顺序存储结构是用一维数组存放串中的字符。
一种方法是用静态内存分配的方法定义的数组,数组元素的个数是在编译时确定的,在运行时是不可改变的,称之为静态顺序存储。
另一种方法是用动态内存分配的方法定义的数组,数组元素的个数是在程序运行时用户申请确定的,称之为动态顺序存储。
4.答:
StatusStrDelete(String&S,inti,intj){
intlen;
len=j-i+1;
if(i<1||i>S[0]||j>S[0])//非法情况的处理
returnERROR;
S[pos..S[0]-len]=S[pos+len..S[0]];//将S中从下标从pos+len开始的元素前移len位
S[0]=S[0]-len;//串长的处理
returnOK;
}
5.答:
StatusSubString(StringS1,StringS2){
inti,j,k,flag=0;
i=1;
while(iflag){
j=1;
if(S1[i]==S2[j]){
k=i+1;j++;
while(S1[k]==S2[j]){
k++;j++;
}
if(j==s2[0])flag=1;
elsei++;
}
elsei++;
}
returnflag;
}
习题5
一、选择题
1.二维数组A行下标i的范围从1到12,列下标j的范围从3到10,采用行序为主序存储,每个数据元素占用4个存储单元,该数组的首地址(即A[1][3]的地址)为1200,则A[6][5]的地址为()。
A1400B1404C1372D1368
2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[3][5]的起始地址与M按列存储时元素()的起始地址相同。
AM[2][4]BM[3][4]CM[3][5]DM[4][4]
3.数组A中,每个元素A的长度为3个字节,行下标i从1到5,列下标j从1到6,从首地址开始连续存放在存储器内,存放该数组至少需要的单元数是()。
A90B70C50D30
4.设有10阶矩阵A,其对角线以上的元素aij均取值为-3,其他矩阵元素为正整数,现在将矩阵A压缩存放在一维树组F[m]中,则m为()。
A45B46C55D56
5.若广义表A满足head(A)=tail(A),则A为()。
A()B(())C((),())D((),(),())
6.递归函数f(n)=f(n-1)+n(n>1)的递归出口是()
Af
(1)=0Bf
(1)=1Cf(0)=1Df(n)=n
二、简答题
1.什么叫二维数组的行序优先存储?
什么叫二维数组的列序优先存储?
2.什么样的矩阵叫特殊矩阵?
特殊矩阵压缩存储的基本思想是什么?
3.什么样的矩阵叫稀疏矩阵?
稀疏矩阵压缩存储的基本思想是什么?
三、计算题
设有二维数组A(6*8),每个元素占4个字节,A[0][0]的起始地址为1000,计算
(1)数组A共占多少个字节;
(2)数组的最后一个元素A[5][7]的起始地址;
(3)按行优先存放时,元素A[1][4]的起始地址;
(4)按列优先存放时,元素A[4[7]的起始地址;
四、设计题
1.对于二维数组A[m][n],其中m<=80,n<=80,先读入m和n,然后读该数组的全部元素,对如下三种情况分别编写相应函数:
(1)求数组A靠边元素之和;
(2)求从A[0][0]开始的互不相邻的各元素之和;
(3)当m=n时,分别求两条对角线上的元素之和,否则打印出m!
=n的信息。
2.有数组A[4][4],把1到16个整数分别按顺序放入A[0][0],……,A[0][3],A[1][0],……,A[1][3],A[2][0],……,A[2][3],A[3][0],……,A[3][3]中,编写一个函数获得数据并求出两条对角线元素的乘积。
习题5参考答案
一、选择题
1.D2.B3.A4.D5.B6.B
二、简答题
1.答:
所谓行序优先存储,其基本思想为:
从第1行的元素开始按顺序存储,第1行元素存储完成后,再按顺序存储第2行的元素,然后依次存储第3行,……直到最后一行的所有元素存储完毕为止。
而列序优先存储即为:
依次按顺序存储第1列,第2列,……直到最后一列的所有元素存储完毕为止。
2.答:
我们把相同的元素或零元素在矩阵中的分布有一定的规律的称为特殊矩阵。
压缩存储的原则是:
对多个值相同的元素只存储一次,对零元素甚至不分配存储空间。
3.答:
矩阵中非零元素的个数远远小于矩阵元素的总数,这样的矩阵称为稀疏矩阵。
稀疏存储的原则是只存储非零元。
三、计算题
(1)228
(2)1282(3)1072(4)1276
四、设计题
1.voidproc1(matrixA)/*第
(1)题解*/
{
ints=0,i,j;
for(i=0;is=s+A[i][1];
for(i=0;is=s+A[i][n];
for(j=0;js=s+A[1][j];
for(j=0;js=s+A[m][j];
s=s-A[0][0]-A[0][n-1]-A[m-1][0]-A[m-1][n-1];/*减去4个角的重复元素值*/
printf("s=%d\n",s);
}
voidproc2(matrixA)/*第
(2)题解*/
{
ints=0,i,j;
i=0;
while(i{
j=0;
while(j{
s=s+A[i][j];
j=j+2;/*跳过一列*/
}
i=i+2;/*跳过一行*/
}
printf("s=%d\n",s);
}
voidp