练习题.docx
《练习题.docx》由会员分享,可在线阅读,更多相关《练习题.docx(46页珍藏版)》请在冰豆网上搜索。
练习题
第一章习题
一、名词解释
数据数据元素数据结构数据类型数据的逻辑结构和存储结构线性结构非线性结构算法算法时间复杂度算法空间复杂度
二、单项选择题
1、数据结构通常是研究数据的()及它们之间的相互联系。
A、存储和逻辑结构B、存储和抽象C、理想与抽象D、理想与逻辑
2、数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为()。
A、存储结构B、逻辑结构C、顺序存储结构D、链式存储结构
3、非线性结构是数据元素之间存在一种()。
A、一对多关系B、多对多关系C、多对一关系D、一对一关系
4、非线性结中,每个节结点()。
A、无直接前驱B、只有一个直接前驱和后继C、只有一个直接前驱和个数不受限的直接后继D、数不受限的直接前驱和后继
5、除了考虑存储数据结构本身所占用的空间外,实现算法所用辅助空间的多少称为算法的()。
A、时间效率B、空间效率C、硬件效率D、软件效率
6、链式存储的存储结构所占空间()。
A、分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针B、只有一部分存放结点值C、只有一部分存放结点间关系的指针D、分两部分,一部分存放结点值,另一部分存放结点所占单元数
7、设语句x++的时间是单位时间,则语句:
for(i=1;i<=n;i++)
x++;
的时间复杂度为()
A、O
(1)B、O(n)C、O(n2)D、链式存储结构O(n3)
三、填空题
1、数据结构包括数据的、数据的和数据的这三方面内容。
2、数据结构按逻辑结构分为两大类,它们分别是和。
3、数据的运算(操作)最常用的有五种,它们分别是、、、和。
4、线性结构反映结点间的逻辑关系是的,非线性结构反映结点间的逻辑关系是的。
5、一个算法的效率可分为效率和效率。
四、简答题
1、什么是数据结构?
有关数据结构的讨论涉及哪三个方面?
2、什么是算法?
算法的5个特性是什么?
试根据这些特性解释算法与程序的区别。
五、阅读理解题
1、设n为正整数,分析下列各程序段中加下划线的语句的程序步数并利用大“O”记号,将下列程序段的执行时间表示为n的函数。
(1)x=0;
(2)x=0;
for(i=1;i<=n;i++)for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)for(j=1;j<=n-i;j++)
x++;x++;
(3)for(inti=1;i<=n;i++)(4)x=0;y=0;
for(intj=1;j<=n;j++){for(inti=1;i<=n;i++)
c[i][j]=0.0;for(intj=1;j<=i;j++)
for(intk=1;k<=n;k++)for(intk=1;k<=j;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];x=x+y;
}
(5)inti=1,j=1;(6)inti=1;
while(i<=n&&j<=n){do{
i=i+1;j=j+i;for(intj=1;j<=n;j++)
}i=i+j;
}while(i<100+n);
第二章练习题
一、名词解释
线性表顺序表单链表
双链表循环链表头结点
二、单项选择题
1.用单链表方式存储的线性表,存储每个结点需要两个域,一个是数据域,另一个是()。
A.当前结点所在地址域B.指针域C.空指针域D.空闲域.
2.在具有n个结点的单链表中,实现()的操作,其算法的时间复杂度都是O(n)。
A.遍历链表和求链表的第i个结点B.在地址为p的结点之后插入一个结点
C.删除开始结点D.删除地址为p的结点的后继结点
A30
3.设a1、a2、a3为三个结点,整数p0,3,4代表地址,则如下的链式存储结构称为()
a13
a24
p0
p0
A.循环链表B.双向循环链表C.单链表D.双向链表
4.已知一个顺序存储的线性表,设每个结点需占m个存储单元,若第一个结点的地址为da1,则第i个结点的地址为()。
A.da1+(i-1)*mB.da1+i*mC.da1-i*mD.da1+(i+1)*m
5.在n个结点的顺序表中,算法的时间复杂度是O
(1)的操作是()。
A.访问第i个结点(1≤i≤n)和求第i个结点的直接前趋(2≤i≤n)
B.在第i个结点后插入一个新结点(1≤i≤n)
C.删除第i个结点(1≤i≤n)
D.将n个结点从小到大排序
三、填空题
1.按顺序存储方法存储的线性表称为,按链式存储方法存储的线性表称为.
2.线性表中结点的集合是,结点间的关系是.3.顺序表相对于链表的优点有和
4.链表相对于顺序表的优点有和.
5.在n个结点的顺序表中插入一个结点需平均移动数为。
6.在n个结点的顺序表中删除一个结点需平均移动数为。
7.在顺序表中访问任意一结点的时间复杂度均为,因此,顺序表也成为存取的数据结构。
8.在n个结点的单链表中要删除已知结点*p,需找到,其时间复杂度为。
9.在双链表中要删除已知结点*p,其时间复杂度为。
10.在单链表中要在已知结点*p之前插入一新结点,仍需找到,其时间复杂度为;而在双链表中,完成同样操作其时间复杂度为。
11在循环链表中,可根据在一结点的地址遍历整个链表,而简单链表中需要知道,才能遍历整个链表。
四、简答题
1.简述线性表的存储结构及各自的长处。
2.简述头指针、头结点的作用。
3.为什么在单循环链表中设置尾指针比设置头指针更好?
4.在双链表中,若仅知道指针p指向某结点,不知头指针,能否根据p遍历整个链表?
五、阅读理解题
1.下述算法的功能是什么?
(1)ListNode*Demo1(LinkListL,ListNode*p),
{//L是有头结点的单链表
ListNode*q=L->next;
while(q&&q->next!
=p)
q=q->next;
if(q);
,returnq;
elseError(”*pnotinL“);
}
(2)voidDemo2(ListNode*p,ListNode*q)
{//*p,*q是某个链表中的两结点
ElemTypetemp;
temp=p->data;
p->data=q->data;
q->data=temp;
}
(2)LinkListDemo3(LinkListL)
{//L是无头结点的单链表
ListNode*Q,*P;
if(L&&L->next){
Q=L;L=L->next;P=L;
while(P->next)P=P->next;
P->next=Q;Q->next=NULL;
}
returnL;
}//Demo3
六、程序设计题
1.用顺序表作为存储结构,实现将线性表(a1,a2,...an)重新排列为以a1为界的两部分,前一部分之值均小于a1,后一部分之值均大于a1(假设结点值可以比较大小)的一个算法。
2.写一个对单循环链表进行遍历(打印每个结点的值)的算法,已知链表中任一结点的地址p0。
3.对给定的单链表L,编写一个删除L中值为x的结点的直接前趋结点算法。
4.试分别用顺序表和单链表作为存储结构,实现将线性表(a0,a1,...,an-1)就地逆置的操作。
所谓“就地”指辅助空间应为O
(1)。
5.设顺序表L是一个递增有序表,试写一算法将x插到L中,并是L仍是一个有序表。
6.已知单链表L是一个递增有序表,试写一高效算法,删除表中值大于min且小于max的结点(若表中有这样的结点),同时释放被删结点的空间(这里min和max是两个给定的参数)。
请分析你的算法时间复杂度。
7.写一算法将单链表中值重复的结点删除,使得到的结果表中各结点值均不相同。
8.假设在长度大于1的单循环链表中,既无头结点也无头指针。
S为指向表中某个结点的指针,试编写算法删除结点*s的直接前驱结点。
9.已知由单链表表示的线性表中,含有三类字符的数据元素(如:
字母字符、数字字符和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间;头结点可另辟空间。
10.设有一个双链表,每个结点中除有prior、data和next三个域外,还有一个访问频度域freq,在链表被起用之前,其值均初始化为零;每当在链表进行一次LocateNode(L,x)运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。
试写一符合上述要求的LocatNode运算的算法。
第三章练习题
一、名词解释
栈、LIFO表、顺序栈、链栈、队列、FIFO表、顺序队列、循环队列、链队列
二、单项选择题
1.在栈中存取数据的原则是()。
A.先进先出B.后进先出C.后进后出D.随意进出
2.在队列中存取数据的原则是()。
A.先进先出B.后进先出C.先进后出D.随意进出
3.插入和删除只能在一端进行的线性表,称为()。
‘.
A.队列B.循环队列C.栈D.循环栈
4.在栈中,出栈操作的时间复杂度为()。
A.O
(1)B.O(Log2n)C.O(n)D.O(n2)
5.设长度为n的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度
为()。
A.O
(1)B.O(10Log2n)C.O(n)D.O(n2)
6.设长度为n的链队列用单循环链表表示,若只设尾指针,则出队操作的:
时间复杂度
为()。
A.O
(1)B.O(Log2n)C.O(n)D.O(n2)
7.设队Q为空,栈S的状态为hello,其中h为栈顶元素,经过下面两个操作后,栈的状态是_______。
1)删除栈S中元素,将删除的元素插入队Q,直至栈为空;
2)依次将队Q中的元素插入栈S,直至Q为空。
A、helloB、ollehC、lloehD、holle
三、填空题
1.在栈中存取数据遵从的原则是。
2.在栈结构中,允许插入、删除的一端称为—,另一端称为—————。
3.在有n个元素的栈中,进栈和退栈操作的时间复杂度为——和——。
4.在队列中存取数据应遵从的原则是——o
5.在队列结构中,允许插入的一端称为——,允许删除的一端称为——。
6.设长度为n的链队列用单循环链表表示,若只设头指针,则人队和出队操作的时间
复杂度分别为——和——;若只设尾指针,则人队和出队操作的时间复杂度分别为——和——。
7.设循环向量有m个元素,循环向量中有一个循环队列。
在循环队列中,设队头指针
front指向队头元素,队尾指针指向队尾元素后的一个空闲元素。
(1)在循环队列中,队空标志为——;队满标志为——。
(2)当rear≥front时,队列长度为——;当rear8.对于下面的程序调用过程(数字为返回地址),请问入栈序列是(),出栈序列是
()。
…
callB
1:
…
callD
3:
Begin
…
…
…
return
Begin
…
…
…
return
…
callC
2:
…
return
程序A程序B程序C程序D
四、简答题
1.线性表、栈、队列有什么异同?
2.在顺序栈中简述进栈、退栈操作的过程。
3.在循环队列中简述人队弋出队操作的过程(用“少用一个元素空间”的方法)。
4.在什么情况下,才能使用栈、队列等数据结构?
5.设有一个双端队列,元素进入该队列的顺序是1,2,3,4。
试分别求出满足下列条件的输出序列。
(1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列;
(2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列;
(3)既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列。
6.指出下述程序段的功能是什么?
(1)voidDemol(SeqStack*S){
inti,arr[64],n=0;
while(!
StackEmpty(S))arr[n++]=Pop(S);
for(i=0;i}//Demol
(2)SeqStackSi,S2,tmp;
DataTypex;.
//假设栈tmp和S2已初始化
while(!
StackEmpty(&S1)){x=Pop(&S1);Push(&tmp,x);}
while(!
StackEmpty(&tmp)){x=Pop(&tmp);Push(&Sl,x);Push(&S2,x);}
(3)voidDemo2(SeqStack*S,intm)
{//设DataT为int型
SeqStackT;inti;
InitStack(&T);
while(!
StackEmpty(S))
if((i=Pop(S))!
=m)Push(&T,i);
while(!
StackEmpty(&T)){i=Pop(&T);Push(S,i);}
)
(4)voidDemo3(CirQueue*Q)
{//设DataType为int型
intx;SeqStackS;
InitStack(&S);
while(!
QueueEmpty(Q)){x=DeQueue(Q);Push(&S,x);}
while(!
StackEmpty(&S)){x=Pop(&S);EnQueue(Q,X);}
}
(5)CirQueueQl,Q2;//DataType为int型
intx,i,m=0;…//设Q1已有内容,Q2已初始过
while{!
QueueEmpty(&Q1)){x=DeQueue(&Ql);EnQueue(aQ2,x);m++}
for(i=O;i{X=DeQueue(&Q2);EnQueue(&Q1,x);EnQueue(aQ2,X);}
五、程序设计题
1.有一链栈,每个结点放一个字符。
试编写一个程序,具有下列功能:
(1)从键盘输入一个字符串人栈,以“!
”结束,但“!
”不入栈;
(2)遍历及显示栈中内容;
(3)执行退栈操作,使栈为空。
2.有一链队列,每个结点放一个字符。
试编一个程序,具有下列功能:
(1)从键盘输入一个字符串人队列,以“!
”结束,但“!
”不入队列;
(2)遍历及显示队列中内容;
(3)执行出队操作,使队列为空。
3.假设一算术表达式存放在数组A[1..n]中,表达式中包含花括号“{”和“{”、方括号“[”和“]”,编写利用栈的运算判别表达式中的括号是否匹配的算法。
第四章练习题
一、名词解释
字符串空白串空串顺序串链式串模式匹配
二、选择题
1.设有如下说明,其中MAXN为一足够大的常数:
chars1[MAXN]="",s2[MAXN]="",s3[MAXN]="Todayis";charS4[MAXN]="30July,2000";
char*p;inti;
(1)Strlen(s1)=();strlen(s2)=()。
A.0B.1C.2D.3
(2)Strcat(s3,s4)=()。
A."Todayis30July,2000"B."30July,2000"C."Todayis"D.”Todayis30July,2000"
(3)Strcpy(s3,s4)=()。
A."Todayis30July,2000"B."30July,2000"C."Todayis"D."Todayis30July,2000"
(4)Strcmp(s3,s4)=()。
A.0B.小于0C.大于0D.不确定
(5)Strchr(s3,"")的返回值是()。
A.5B.6C.8D.9
2.设目标串T="aabaababaabaa",模式P="abab"。
(1)朴素匹配算法的外层循环进行了()次。
A.1B.9C.4D.5
(2)若采用顺序存储结构,则该算法的运行时间是()(以一次内循环为单位)。
A;20B.7C.12D.36
(3)若采用链式存储结构,则该算法的运行时间是()(以一次内循环为单位)。
A.20B.7C.12D.36
3.朴素模式匹配算法在最好的情况下的运行时间是()(以一次内循环为单位)。
A.MB.NC.M+ND.M*N
4.以下论断正确的是()。
A.""是空串,""是空白串B."BEIJING"是"BEIJING"的子串
C."something"<"Something"D."BIT"="BITE"
5.字符串”VARTYPEunsignedint"若采用动态分配的顺序存储方法需要()个字节(假
设每种数据均占用2个字节)。
A.38B.动态产生,视情况而定C.40D.42
6.上题若采用静态的顺序存储方法,则需要()个字节。
A.38B.与字符数组的大小有关C.40D.42
7.若字符串"1234567"采用链式存储,假设每个字符占用1个字节,每个指针占用2个字
节,则该字符串的存储密度为()。
A.20%B.40%C.50%D.33.3%
8.上题若需提高存储密度至50%,则每个结点应存储()个字符(假设字符串的结
束标志也占用1个字节)。
A.2B.3C.4D.5
三、填空题
1.串是由字符组成的序列,一般记为,
2.称为空串;称为空白串。
3.通常在程序中使用串可分为和;而串按存储方,式又可分为和
4.设S="A:
/document/Mary.doc"则strlen(s)=,"/"的字符定位的位置为
5.称为串的模式匹配;称为目标串,称为模式。
6.链式存储与顺序存储的朴素串匹配算法的效率。
8.串的朴素匹配算法最坏的情况下需要比较字符的总次数为,为主串长,为子串长。
9.设目标T="abccdcdccbaa",模式P="cdcc"则第次匹配成功。
四、简答题
1.试举例说明链式串在哪些串操作上比顺序串有更高的效率。
2.设a="Heisastudent"b="She"c="good",d="not",e="worker"f="",请用教材上的串运算构造出字符串G="Sheisagoodstudent"。
3.设目标T="ababcabcacbab",模式P="abcac"试说明朴素算法的匹配过程。
五、算法设计题
1.设计一算法将串逆置。
2.设计一算法判断字符串是否为回文(即正读和倒读相同)
3.设计一算法从字符串中删除所有与字串"del"相同的子串
4.设计一算法统计字符串中否定词"not"的个数。
5.设计一算法统计字符串中可匹配的可重叠子串的个数。
第五章练习题
一、名词解释
1、对称矩阵
2、三角矩阵
3、稀疏矩阵
4、广义表
5、三元组
二、单项选择题
1.设二维数组A[0..m-1][0..n-1)按行优先顺序存储在内存中,每个元素…占d个
字节,则元素aij的地址为()。
A.LOC(a11)+[(i-1)*n+j-1]*d
B.LOC(a00)+[(i-1)*n+j-1]*d
C.LOC(a11)+[(j-1)*n+i-1]*d
D.LOC(a00)十[(j-1)*n+i-1]*d
2.已知二维数组A8*10中,元素a12的地址为1000,则元素a00的地址为()。
A.972B.979C.980D.982
3.若数组A定义为A[2..m][2...n],则元素aij的地址为()。
A.LOC(a11)+[(i-2)*(n-1)+j-2]
B.LOC(a00)+[(i-1)*n+j-1]
C.LOC(a22)+[(i-2)*(n-1)+j-2]
D.LOC(a11)+[(i-1)*(n-1)+j-1]
4.矩阵是一个()。
A.对称矩阵B.三角矩阵
C.带状矩阵D.稀疏矩阵
5.现有矩阵设压缩存储后元素1的地址为2000,则
-1的地址为()。
A.2000B.2015C.2016D.1999
6.若数组A[0..mJ[0..n]按列优先顺序存储,则aij的地址为()。
A.LOC(a00)+[j*m+i]B.LOC(a00)+[j*n+i]
C.LOC(a00)+[(j-1)*n+i-1)D.LOC(a00)+[(j一1)*m+i-1]
7.若下三角矩阵An*n按列顺序压缩存储在数组Sa[0..(n+1)n/2]中,则非零元素aij的地址为()。
(设每个元素占d个字节)
A.LOC(a00)+[(j-1)j/2+i]*d
B.LOC(a00)+[(i-1)i/2+j]*d
C.LOC(a00)+[(j-1)j/2+i-1]*d
D.LOC(a00)+[(i-1)i/2+j-1]*d
8.广义表A=(a),则表尾为()。
A.aB.(())C.空表D.(a)
9.广义表A=((x,(a,b)),(x,(a,b),y)),则运算head(head(tail(A)))为()。
A.xB.(a,b)C.(x,(a,b))D.A
三、填空题
1.多维数组的存储方式有。
:
2.对于数组An*n。
,其元素aij按行优先与列优先存储时地址之差为(设两次存储的LOC(a11)相同)。
,
3.对称矩阵按列优先存放于Sa[0..n(n+1)/2],元素Sa与Sa[k]对应关系为.
4.特殊矩阵是指。
5.稀疏矩阵对应的三元组表为。
6.任何一个非空广义表的表头是表中第个元素,它可以是,也可以是,而表尾必定是。
四、简答及算法题
1、┌───┬───────┬────┐
│tag│data/link│n