数据结构课程课后习题答案Word文档格式.docx
《数据结构课程课后习题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程课后习题答案Word文档格式.docx(54页珍藏版)》请在冰豆网上搜索。
①前驱②1③后继④任意多个
(6)在图形结构中,每个结点的前驱结点数和后继结点数可以是()。
任意多个
(7)数据的存储结构主要有四种,它们分别是①、②、③和④存储结构。
①顺序②链式③索引④哈希
(8)一个算法的效率可分为①效率和②效率。
)
①时间②空间
3.简答题
(1)数据结构和数据类型两个概念之间有区别吗
简单地说,数据结构定义了一组按某些关系结合在一起的数组元素的集合。
数据类型不仅定义了一组数据元素,而且还在其上定义了一组操作。
(2)简述线性结构、树形结构和图形结构的不同点。
线性结构反映结点间的逻辑关系是一对一的,树形线性结构反映结点间的逻辑关系是一对多的,图在结构反映结点间的逻辑关系是多对多的。
(3)设有采用二元组表示的数据逻辑结构S=(D,R),其中D={a,b,…,i},R={(a,b),(a,c),(c,d),(c,f),(f,h),(d,e),(f,g),(h,i)},问相对于关系R,哪些结点是开始结点,哪些结点是终端结点
该逻辑结构为树形结构,其中a结点没有前驱结点,称为根结点,b、e、g、i结点没有后继结点,是终端结点,也称为叶子结点。
(4)以下各函数是算法中语句的执行频度,n为问题规模,给出对应的时间复杂度:
T1(n)=nlog2n-1000log2n
/
T2(n)=
-1000log2n
T3(n)=n2-1000log2n
T4(n)=2nlog2n-1000log2n
T1(n)=O(nlog2n),T2(n)=O(),T3(n)=O(n2),T4(n)=O(nlog2n)。
(5)分析下面程序段中循环语句的执行次数。
intj=0,s=0,n=100;
do
{j=j+1;
s=s+10*j;
}while(j<
n&
&
s<
n);
,
j=0,第1次循环:
j=1,s=10。
第2次循环:
j=2,s=30。
第3次循环:
j=3,s=60。
第4次循环:
j=4,s=100。
while条件不再满足。
所以,其中循环语句的执行次数为4。
(6)执行下面的语句时,语句s++的执行次数为多少
ints=0;
for(i=1;
i<
n-1;
i++)
for(j=n;
j>
=i;
j--)
s++;
语句s的执行次数
。
(7)设n为问题规模,求以下算法的时间复杂度。
voidfun1(intn)
{intx=0,i;
]
for(i=1;
=n;
for(j=i+1;
j<
j++)
x++;
}
其中x++语句属基本运算语句,
=O(n2)。
(8)设n为问题规模,是一个正偶数,试计算以下算法结束时m的值,并给出该算法的时间复杂度。
voidfun2(intn)
{intm=0;
for(j=2*i;
m++;
由于内循环j的取值范围,所以i≤n/2,则
,该程序段的时间复杂度为O(n2)。
上机实验题1
有一个整型数组a,其中含有n个元素,设计尽可能好的算法求其中的最大元素和次大元素,并采用相关数据测试。
解:
maxs算法用于返回数组a[0..n-1]中的最大元素值max1和次大元素值max2,max1和max2设计为引用类型。
对应的程序如下:
#include<
>
voidmaxs(inta[],intn,int&
max1,int&
max2)
{inti;
max1=max2=a[0];
;
n;
if(a[i]>
max1)
{max2=max1;
max1=a[i];
}
elseif(a[i]>
max2=a[i];
voidmain()
{inta[]={1,4,10,6,8,3,5,7,9,2};
#
intn=10;
intmax1,max2;
maxs(a,n,max1,max2);
printf("
最大元素值=%d,次大元素值=%d\n"
max1,max2);
练习题2
(1)数据在计算机存储器内表示时,物理地址与逻辑地址相对顺序相同并且是连续的,称之为()。
A.存储结构B.逻辑结构C.顺序存储结构D.链式存储结构
~
(2)在n个结点的顺序表中,算法的时间复杂度是O
(1)的操作是()。
A.访问第i个结点(1≤i≤n)和求第i(2≤i≤n)个结点的前驱结点
B.在第i(1≤i≤n)个结点后插入一个新结点
C.删除第i个结点(1≤i≤n)
D.将n个结点从小到大排序
(3)向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
(4)链式存储结构所占存储空间()。
A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
B.只有一部分,存放结点值
C.只有一部分,存储表示结点间关系的指针
D.分两部分,一部分存放结点值,另一部分存放结点所占单元数
(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。
A.必须是连续的B.部分地址必须是连续的
C.一定是不连续的D.连续或不连续都可以
(6)一个线性表在()情况下适用于采用链式存储结构。
^
A.需经常修改其中的结点值B.需不断对其进行删除插入
C.其中含有大量的结点D.其中结点结构复杂
(7)单链表的存储密度()
A.大于1B.等于1C.小于1D.不能确定
(1)在顺序表中插入或删除一个元素时,需要平均移动(①)元素,具体移动的元素个数与(②)有关。
①表中一半②表长和该元素在表中的位置
(2)向一个长度为n的顺序表的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动()个元素。
-
n-i+1
(3)向一个长度为n的顺序表中删除第i个元素(1≤i≤n)时,需向前移动()个元素。
n-i
(4)在顺序表中访问任意一个元素的时间复杂度均为(①),因此顺序表也称为(②)的数据结构。
①O
(1)②随机存取
(5)顺序表中逻辑上相邻的元素的物理位置(①)相邻。
单链表中逻辑上相邻的元素的物理位置(②)相邻。
①一定②不一定
(6)在带头结点的单链表中,除头结点外,任一结点的存储位置由()指示。
其前驱结点的链域的值
(7)在含有n个数据结点的单链表中要删除已知结点*p,需找到它的(①),其时间复杂度为(②)。
①前驱结点的地址②O(n)
(8)含有n(n>
1)个结点的循环双向链表中,为空的指针域数为()。
(1)试比较顺序存储结构和链式存储结构的优缺点。
在什么情况下用顺序表比链表好
顺序存储结构中,相邻数据元素的存放地址也相邻,并要求内存中可用存储单元的地址必须是连续的。
其优点是存储密度大,存储空间利用率高;
缺点是插入或删除元素时不方便。
链式存储结构中,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。
其优点是插入或删除元素时很方便,使用灵活;
缺点是存储密度小,存储空间利用率低。
顺序表适宜于做查找这样的静态操作;
链表宜于做插入、删除这样的动态操作。
若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
(2)对于表长为n的顺序表,在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需要移动的元素的平均个数为多少删除一个元素所需要移动的平均个数为多少
插入一个元素所需要移动的元素的平均个数为(n-1)/2,删除一个元素所需要移动的平均个数为n/2。
》
(3)在链表中设置头结点的作用是什么
在链表中设置头结点后,不管链表是否为空表,头结点指针均不空,并使得对链表的操作(如插入和删除)在各种情况下统一,从而简化了算法的实现过程。
(4)对于双链表和单链表,在两个结点之间插入一个新结点时需修改的指针各为多少个
对于双链表,在两个结点之间插入一个新结点时,需修改前驱结点的next域、后继结点的prior域和新插入结点的next、prior域。
所以共修改4个指针。
对于单链表,在两个结点之间插入一个新结点时,需修改前一结点的next域,新插入结点的next域。
所以共修改两个指针。
(5)某含有n(n>
1)结点的线性表中,最常用的操作是在尾结点之后插入一个结点和删除第一个结点,则采用以下哪种存储方式最节省运算时间。
①单链表;
②仅有头指针不带头结点的循环单链表;
③双链表;
④仅有尾指针的循环单链表。
在单链表中,删除第一个结点的时间复杂度为O
(1)。
插入结点需找到前驱结点,所以在尾结点之后插入一个结点,需找到尾结点,对应的时间复杂度为O(n)。
在仅有头指针不带头结点的循环单链表中,删除第一个结点的时间复杂度O(n),因为删除第一个结点后还要将其改为循环单链表;
在尾结点之后插入一个结点的时间复杂度也为O(n)。
在双链表中,删除第一个结点的时间复杂度为O
(1);
在尾结点之后插入一个结点,也需找到尾结点,对应的时间复杂度为O(n)。
在仅有尾指针的循环单链表中,通过该尾指针可以直接找到第一个结点,所以删除第一个结点的时间复杂度为O
(1);
在尾结点之后插入一个结点也就是在尾指针所指结点之后插入一个结点,时间复杂度也为O
(1)。
因此④最节省运算时间。
4.算法设计题
(1)设计一个高效算法,将顺序表的所有元素逆置,要求算法空间复杂度为O
(1)。
遍历顺序表L的前半部分元素,对于元素[i](0≤i<2),将其与后半部分对应元素[]进行交换。
对应的算法如下:
voidreverse(SqList&
L)
ElemTypex;
for(i=0;
2;
{x=[i];
j](j的初值为0)中没有重复的元素。
检测[i](j<
),若[i]和[0..j]中任何一个元素都不相同,则将[i]存入[j+1]中。
voiddelsame(SqList&
L)j]中所有元素都不相同
{j++;
[j]=[i];
}
=j+1;
0],置e=[0],用i从1开始遍历L的所有元素:
当[i]≠e时,将它放在[k]中,k增1,置e=[i],最后将L的length置为k。
voiddelsame1(SqList&
L)单项选择题
(1)栈中元素的进出原则是()。
A.先进先出B.后进先出C.栈空则进D.栈满则出
(2)设一个栈的进栈序列是A、B、C、D(即元素A~D依次通过该栈),则借助该栈所得到的输出序列不可能是()。
B,C,D,C,B,A,C,D,B,A,B,C
(3)一个栈的进栈序列是a、b、c、d、e,则栈的不可能的输出序列是()。
(4)已知一个栈的进栈序列是1,2,3,…,n,其输出序列的第一个元素是i(1≤i≤n)则第j(1≤j≤n)个出栈元素是()。
+1D.不确定
(5)设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st栈为栈空的条件为()。
答:
(6)设顺序栈st的栈顶指针top的初始时为-1,栈空间大小为MaxSize,则判定st栈为栈满的条件是。
(7)队列中元素的进出原则是()。
A.先进先出B.后进先出C.栈空则进D.栈满则出
(8)元素A、B、C、D顺序连续进入队列qu后,队头元素是(①),队尾元素是(②)。
①A②D。
(9)一个队列的入列序列为1234,则队列可能的输出序列是()。
(10)循环队列qu(队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置)的队满条件是()。
A.+1)%MaxSize==+1)%MaxSize
B.+1)%MaxSize==+1
C.+1)%MaxSize==
(11)循环队列qu(队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置)的队空条件是()。
(12)设循环队列中数组的下标是0~N-1,其头尾指针分别为f和r(队头指针f指向队首元素的前一位置,队尾指针r指向队尾元素的位置),则其元素个数为()。
C.(r-f)%N+1D.(r-f+N)%N
"
(13)设有4个数据元素a、b、c和d,对其分别进行栈操作或队操作。
在进栈或进队操作时,按a、b、c、d次序每次进入一个元素。
假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;
这时,第一次出栈得到的元素是(①),第二次出栈得到的元素是(②);
类似地,考虑对这4个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;
这时,第一次出队得到的元素是(③),第二次出队得到的元素是(④)。
经操作后,最后在栈中或队中的元素还有(⑤)个。
①~④:
⑤:
①B②D③A④B⑤B
(14)设栈S和队列Q的初始状态为空,元素e1~e6依次通过栈S,一个元素出后即进队列Q,若6个元素出队的序列是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是()。
(1)栈是一种特殊的线性表,允许插入和删除运算的一端称为(①)。
不允许插入和删除运算的一端称为(②)。
①栈顶②栈底
(2)一个栈的输入序列是12345,的输出序列为12345,其进栈出栈的操作为()。
1进栈,1出栈,2进栈,2出栈,3进栈,3出栈,4进栈,4出栈,5进栈,5出栈。
(3)有5个元素,其进栈次序为A、B、C、D、E,在各种可能的出栈次序中,以元素C、D最先出栈(即C第一个且D第二个出栈)的次序有()。
CDBAE、CDEBA、CDBEA。
(4)顺序栈用data[0..n-1]存储数据,栈顶指针为top,其初始值为0,则元素x进栈的操作是()。
data[top]=x;
top++;
(5)顺序栈用data[0..n-1]存储数据,栈顶指针为top,其初始值为0,则出栈元素x的操作是()。
top--;
x=data[top];
(6)()是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
队列
*
(7)设有数组A[0..m]作为循环队列的存储空间,front为队头指针(它指向队首元素的前一位置),rear为队尾指针(它指向队尾元素的位置),则元素x执行入队的操作是()。
rear=(rear+1)%(m+1);
A[rear]=x;
(8)设有数组A[0..m]作为循环队列的存储空间,front为队头指针(它指向队首元素的前一位置),rear为队尾指针(它指向队尾元素的位置),则元素出队并保存到x中的操作是()。
front=(front+1)%(m+1);
x=A[rear];
(1)简要说明线性表、栈与队的异同点。
相同点:
都属地线性结构,都可以用顺序存储或链表存储;
栈和队列是两种特殊的线性表,即受限的线性表,只是对插入、删除运算加以限制。
不同点:
①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是后进先出表LIFO;
队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。
②用途不同,栈用于子程调用和保护现场等,队列用于多道作业处理、指令寄存及其他运算等等。
(2)顺序队的“假溢出”是怎样产生的如何知道循环队列是空还是满
一般的一维数组队列的尾指针已经到了数组的上界,不能再有进队操作,但其实数组中还有空位置,这就叫“假溢出”。
:
采用循环队列是解决假溢出的途径。
另外,解决循环队列是空还是满的办法如下:
①设置一个布尔变量以区别队满还是队空;
②浪费一个元素的空间,用于区别队满还是队空。
③使用一个计数器记录队列中元素个数(即队列长度)。
通常采用法②,让队头指针front指向队首元素的前一位置,队尾指针rear指向队尾元素的位置,这样判断循环队列队空标志是:
front=rear,队满标志是:
(rear+1)%MaxSize=front。
(1)假设采用顺序栈存储结构,设计一个算法,利用栈的基本运算返回指定栈中栈底元素,要求仍保持栈中元素不变。
这里只能使用栈st的基本运算来完成,不能直接用[0]来得到栈底元素。
假定采用顺序栈结构。
先退栈st中所有元素,利用一个临时栈tmpst存放从st栈中退栈的元素,最后的一个元素即为所求,然后将临时栈tmpst中的元素逐一出栈并进栈到st中,这样恢复st栈中原来的元素。
对应算法如下:
intGetBottom(SqStackst,ElemType&
x)
{ElemTypee;
?
SqStacktmpst;
单项选择题
(1)串是一种特殊的线性表,其特殊性体现在()。
A.可以顺序存储B.数据元素是一个字符
C.可以链式存储D.数据元素可以是多个字符
(2)以下()是"
abcd321ABCD"
串的子串。
A.abcdC."
abcABC"
D."
21AB"
(3)两个串相等必有串长度相等且()。
A.串的各位置字符任意B.串中各对应位置字符均相等
C.两个串含有相同的字符D.两个所含字符任意
(1)空串是指(①),空白串是指(②)。
①不包含任何字符(长度为0)的串②由一个或多个空格(仅由空格符)组成的串
(2)对于带头结点的链串s,串为空的条件是()。
s->
next==NULL。
(3)对于一个含有n个字符的链串s,查找第i个元素的算法的时间复杂度为()。
O(n)
(1)设s为一个长度为n的串,其中的字符各不相同,则s中的互异的非平凡子串(非空且不同于s本身)的个数是多少
由串s的特性可知,1个字符的子串有n个,2个字符的子串有n-1个,3个字符的子串有n-2个,…,n-2个字符的子串有3个,n-1个字符的子串有2个。
所以,非平凡子串的个数=n+(n-1)+(n-2)+…+2=
(2)若s1和s2为串,给出使s1算法设计题
(1)设计一个算法RepChar(s,x,y),将顺序串s中所有字符x替换成字符y。
要求空间复杂度为O
(1)。
因要求算法空间复杂度为O
(1),所以只能对串s直接替换。
从头开始遍历串s,一旦找到字符x便将其替换成y。
voidRepStr(SqString&
s,charx,chary)
if[i]==x)
[i]=y;
;
(2)设计一个算法,判断链串s中所有元素是否为递增排列的。
用p和q指向链串s的两个连续结点,p先指向开始结点,当q->
data≥p->
data时,p和q同步后移一个结点;
否则返回0。
当所有元素是递增排列时返回1。
intincrease(LinkString*s)
{LinkString*p=s->
next,*q;
if(p!
=NULL)
{while(p->
next!
{q=p->
next;
单项选择题
(1)假设有60行70列的二维数组a[1..60,1..70](数组下标从1开始)以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为()。
D.以上都不对
(2)对特殊矩阵采用压缩存储的目的主要是为了()。
A.表达变得简单B.对矩阵元素的存取变得简单
C.去掉矩阵中的多余元素D.减少不必要的存储空间
(3)一个n×
n的对称矩阵,如果采用压缩存储以行或列为主序放入内存,则压缩存储的容量是()。
A.n2B.n2/2C.n(n+1)/2D.(n+1)2/2
(4)设矩阵a是一个对称矩阵,为了节省存储,将其下