数据结构c版课后习题解析.docx
- 文档编号:26972896
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:140
- 大小:93KB
数据结构c版课后习题解析.docx
《数据结构c版课后习题解析.docx》由会员分享,可在线阅读,更多相关《数据结构c版课后习题解析.docx(140页珍藏版)》请在冰豆网上搜索。
数据结构c版课后习题解析
第1章绪论
1.1本章导学
1.知识结构图
本章的知识结构如图1-1所示,其中第二层的椭圆代表本章的学习主线。
⑴数据
⑵数据元素
⑶数据结构
⑷抽象数据类型
⑴逻辑结构
⑵数据结构
的分类
⑴存储结构
⑵常用存储
方法
⑴算法
⑵算法特性
⑶评价算法
⑷描述算法
⑴问题规模
⑵基本语句
⑶时间复杂度
⑷大O记号
图1-1知识结构图
绪论
数据结构
算法
基本概念
逻辑结构
存储结构
基本概念
算法分析
关系
2.学习要点
对本章的学习要从两条主线出发,一条主线是数据结构,包括数据结构的相关概念及含义,另一条主线是算法,包括算法的相关概念、描述方法以及时间复杂度的分析方法。
在学习数据结构时要抓住两个方面:
逻辑结构和存储结构,并注意把握二者之间的关系。
在学习算法时,要以算法的概念和特性为基本点,并在以后的学习中注意提高算法设计的能力。
对于算法时间性能的分析,要将注意力集中在增长率上,即基本语句执行次数的数量级,在设计算法时,养成分析算法时间性能的习惯,进而有效地改进算法的效率。
1.2习题解析
1.填空
(1)()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
【解答】数据元素
(2)()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。
【解答】数据项,数据元素
【分析】数据结构指的是数据元素以及数据元素之间的关系。
(3)从逻辑关系上讲,数据结构主要分为()、()、()和()。
【解答】集合,线性结构,树结构、图结构
(4)数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:
()和()。
【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系
(5)算法具有五个特性,分别是()、()、()、()、()。
【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性
(6)算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。
【解答】自然语言,程序设计语言,流程图,伪代码,伪代码
(7)在一般情况下,一个算法的时间复杂度是()的函数。
【解答】问题规模
(8)设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为2n*log25n+8n,则表示成数量级的形式为()。
【解答】Ο
(1),Ο(nlog2n)
【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。
2.选择题
(1)顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。
A线性结构B非线性结构C存储位置D指针
【解答】C,D
【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。
(2)假设有如下遗产继承规则:
丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承遗产。
则表示该遗产继承关系的最合适的数据结构应该是()。
A树B图C线性表D集合
【解答】B
【分析】将丈夫、妻子和子女分别作为数据元素,根据继承关系画出逻辑结构图如图1-2
丈夫
妻子
子女n
子女1
图1-2遗产继承逻辑结构图
所示。
(3)计算机所处理的数据一般具有某种内在联系,这是指()。
A数据和数据之间存在某种关系B元素和元素之间存在某种关系
C元素内部具有某种结构D数据项和数据项之间存在某种关系
【解答】B
【分析】数据结构是指相互之间存在一定关系的数据元素的集合,数据元素是讨论数据结构时涉及的最小数据单位,元素内部各数据项一般不予考虑。
(4)对于数据结构的描述,下列说法中不正确的是()。
A相同的逻辑结构对应的存储结构也必相同
B数据结构由逻辑结构、存储结构和基本操作三方面组成
C对数据结构基本操作的实现与存储结构有关
D数据的存储结构是数据的逻辑结构的机内实现
【解答】A
【分析】相同的逻辑结构可以用不同的存储结构实现,一般来说,在不同的存储结构下基本操作的实现是不同的,例如线性表可以顺序存储也可以链接存储,在顺序存储和链接存储结构下插入操作的实现截然不同。
(5)可以用()定义一个完整的数据结构。
A数据元素B数据对象C数据关系D抽象数据类型
【解答】D
【分析】抽象数据类型是一个数据结构以及定义在该结构上的一组操作的总称。
(6)算法指的是()。
A对特定问题求解步骤的一种描述,是指令的有限序列。
B计算机程序C解决问题的计算方法D数据处理
【解答】A
【分析】计算机程序是对算法的具体实现;简单地说,算法是解决问题的方法;数据处理是通过算法完成的。
所以,只有A是算法的准确定义。
(7)下面()不是算法所必须具备的特性。
A有穷性B确切性C高效性D可行性
【解答】C
【分析】高效性是好算法应具备的特性。
(8)算法分析的目的是(),算法分析的两个主要方面是()。
A找出数据结构的合理性B研究算法中输入和输出的关系
C分析算法的效率以求改进D分析算法的易读性和文档性
E空间性能和时间性能F正确性和简明性
G可读性和文档性H数据复杂性和程序复杂性
【解答】C,E
3.判断题
⑴算法的时间复杂度都要通过算法中的基本语句的执行次数来确定。
【解答】错。
时间复杂度要通过算法中基本语句执行次数的数量级来确定。
⑵每种数据结构都具备三个基本操作:
插入、删除和查找。
【解答】错。
如数组就没有插入和删除操作。
此题注意是每种数据结构。
⑶所谓数据的逻辑结构指的是数据之间的逻辑关系。
【解答】错。
是数据之间的逻辑关系的整体。
⑷逻辑结构与数据元素本身的内容和形式无关。
【解答】对。
因此逻辑结构是数据组织的主要方面。
⑸基于某种逻辑结构之上的基本操作,其实现是唯一的。
【解答】错。
基本操作的实现是基于某种存储结构设计的,因而不是唯一的。
4.分析以下各程序段,并用大O记号表示其执行时间。
⑴i=1;k=0;
while(i<=n)
{
k=k+10*i;
i++;
}
⑵i=1;k=0;
do
{
k=k+10*i;
i++;
}while(i<=n);
⑷y=0;
while((y+1)*(y+1)<=n)
y=y+1;
⑶i=1;j=0;
while(i+j<=n)
if(i>j)j++;
elsei++;
⑸for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x++;
【解答】⑴基本语句是k=k+10*i,共执行了n-2次,所以T(n)=O(n)。
⑵基本语句是k=k+10*i,共执行了n次,所以T(n)=O(n)。
⑶分析条件语句,每循环一次,i+j整体加1,共循环n次,所以T(n)=O(n)。
⑷设循环体共执行T(n)次,每循环一次,循环变量y加1,最终T(n)=y,即:
(T(n)+1)2≤n,所以T(n)=O(n1/2)。
⑸x++是基本语句,所以
5.解答下列问题
(1)设有数据结构(D,R),其中D={1,2,3,4,5,6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。
试画出其逻辑结构图并指出属于何种结构。
1
4
2
5
6
3
图1-3逻辑结构图
【解答】其逻辑结构图如图1-3所示,它是一种图结构。
(2)为整数定义一个抽象数据类型,包含整数的常见运算,每个运算对应一个基本操作,每个基本操作的接口需定义前置条件、输入、功能、输出和后置条件。
【解答】整数的抽象数据类型定义如下:
ADTinteger
Data
整数:
可以是正整数(1,2,3,…)、负整数(-1,-2,-3,…)和零
Operation
Constructor
前置条件:
整数a不存在
输入:
一个整数b
功能:
构造一个与输入值相同的整数
输出:
无
后置条件:
整数a具有输入的值
Set
前置条件:
存在一个整数a
输入:
一个整数b
功能:
修改整数a的值,使之与输入的整数值相同
输出:
无
后置条件:
整数a的值发生改变
Add
前置条件:
存在一个整数a
输入:
一个整数b
功能:
将整数a与输入的整数b相加
输出:
相加后的结果
后置条件:
整数a的值发生改变
Sub
前置条件:
存在一个整数a
输入:
一个整数b
功能:
将整数a与输入的整数b相减
输出:
相减的结果
后置条件:
整数a的值发生改变
Multi
前置条件:
存在一个整数a
输入:
一个整数b
功能:
将整数a与输入的整数b相乘
输出:
相乘的结果
后置条件:
整数a的值发生改变
Div
前置条件:
存在一个整数a
输入:
一个整数b
功能:
将整数a与输入的整数b相除
输出:
若整数b为零,则抛出除零异常,否则输出相除的结果
后置条件:
整数a的值发生改变
Mod
前置条件:
存在一个整数a
输入:
一个整数b
功能:
求当前整数与输入整数的模,即正的余数
输出:
若整数b为零,则抛出除零异常,否则输出取模的结果
后置条件:
整数a的值发生改变
Equal
前置条件:
存在一个整数a
输入:
一个整数b
功能:
判断整数a与输入的整数b是否相等
输出:
若相等返回1,否则返回0
后置条件:
整数a的值不发生改变
endADT
(3)求多项式A(x)的算法可根据下列两个公式之一来设计:
①A(x)=anxn+an-1xn-1+…+a1x+a0
②A(x)=(…(anx+an-1)x+…+a1)x)+a0
根据算法的时间复杂度分析比较这两种算法的优劣。
【解答】第二种算法的时间性能要好些。
第一种算法需执行大量的乘法运算,而第二种算法进行了优化,减少了不必要的乘法运算。
(4)选择和评价数据结构的标准与方法是什么?
【解答】首先,对给定的实际问题可以建立不同的数据结构;其次,对于给定的数据结构,可以选择不同的存储实现,即采用不同的存储结构;再次,在给定数据结构和存储结构的条件下,对同一基本操作可以设计出不同算法。
因此,数据的逻辑结构、存储结构和操作(特别是基本操作)的实现这三者是密切相关的。
一般地,在建立数据结构时应该考虑以下三个方面:
①确定表示问题所需的数据及其特性;
②确定必须支持的基本操作,并度量每种操作所受的时、空资源限制,某些重要的操作,例如查找、插入和删除的资源限制通常决定了数据结构的选择;
③选择(或设计)最接近这些开销的数据结构。
6.算法设计(要求:
用伪代码和C++描述两种方法描述算法,并分析时间复杂度)
⑴对一个整型数组A[n]设计一个排序算法。
【解答】下面是简单选择排序算法的伪代码描述。
1.对n个记录进行n-1趟简单选择排序:
1.1在无序区[i,n-1]中选取最小记录,设其下标为index;
1.2将最小记录与第i个记录交换;
伪代码
下面是简单选择排序算法的C++描述。
voidSelectSort(intr[],intn)
{
for(i=0;i { index=i; for(j=i+1;j if(r[j] if(index! =i)r[i]←→r[index];//交换元素 } } 简单选择排序算法SelectSort 分析算法,有两层嵌套的for循环,所以, 。 ⑵找出整型数组A[n]中元素的最大值和次最大值。 【解答】算法的伪代码描述如下: 1.将前两个元素进行比较,较大者放到max中,较小者放到nmax中; 2.从第3个元素开始直到最后一个元素依次取元素A[i],执行下列操作: 2.1如果A[i]>max,则A[i]为最大值,原来的最大值为次最大值; 2.2否则,如果A[i]>nmax,则最大值不变,A[i]为次最大值; 3.输出最大值max,次最大值nmax; 伪代码 算法的C++描述如下: voidMax_NextMax(intA[],intn,int&max,int&nmax) { if(A[0]>=A[1]){ max=A[0];nmax=A[1]; } else{ max=A[1];nmax=A[0]; } for(i=2;i if(A[i]>=max){ nmax=max;max=A[i]; } elseif(A[i]>nmax) nmax=A[i]; cout<<"最大值为: "< "< } 最大值和次最大值算法Max_NextMax 分析算法,只有一层循环,共执行n-2次,所以,T(n)=O(n)。 第2章线性表 2.1本章导学 1.知识结构图 本章的知识结构如图2-1所示,其中第二层的椭圆代表本章的学习主线。 线性表 逻辑结构 存储结构 基本概念 抽象 数据 类型 定义 ⑴线性表定义 ⑵逻辑特征 ⑴ADT定义 ⑵基本操作 顺序存储结构 链接存储结构 其他存储方法 ⑴顺序表类定义 ⑵基本操作的实现及时间性能 ⑴单链表 ⑵循环链表 ⑶双链表 比较 ⑴静态链表 ⑵间接寻址 图2-1知识结构图 2.学习要点 本章虽然讨论的是线性表,但涉及的许多问题都具有一定的普遍性,因此,本章是本课程的重点之一,也是其它后续章节的重要基础。 对于本章的学习要从两条明线、一条暗线出发。 两条明线是线性表的逻辑结构和存储结构,一条暗线是算法(即基本操作的实现)。 注意线性表的ADT定义、顺序表类定义和单链表类定义三者之间的关系;注意在不同的存储结构下,相同操作的不同实现算法;注意对顺序表和链表从时间性能和空间性能等方面进行综合对比,在实际应用中能为线性表选择或设计合适的存储结构。 2.2习题解析 1.填空 ⑴在顺序表中,等概率情况下,插入和删除一个元素平均需移动()个元素,具体移动元素的个数与()和()有关。 【解答】表长的一半,表长,该元素在表中的位置 ⑵顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的存储地址是()。 【解答】108 【分析】第5个元素的存储地址=第1个元素的存储地址+(5-1)×2=108 ⑶设单链表中指针p指向结点A,若要删除A的后继结点(假设A存在后继结点),则需修改指针的操作为()。 【解答】p->next=(p->next)->next ⑷单链表中设置头结点的作用是()。 【解答】为了运算方便 【分析】例如在插入和删除操作时不必对表头的情况进行特殊处理。 ⑸非空的单循环链表由头指针head指示,则其尾结点(由指针p所指)满足()。 【解答】p->next=head 【分析】如图2-8所示。 head a1 a2 an^ p 图2-8尾结点p与头指针head的关系示意图 ⑹在由尾指针rear指示的单循环链表中,在表尾插入一个结点s的操作序列是();删除开始结点的操作序列为()。 【解答】s->next=rear->next;rear->next=s;rear=s; q=rear->next->next;rear->next->next=q->next;deleteq; 【分析】操作示意图如图2-9所示: a1 a2 an^ rear s q 图2-9带尾指针的循环链表中插入和删除操作示意图 rear ⑺一个具有n个结点的单链表,在指针p所指结点后插入一个新结点的时间复杂度为();在给定值为x的结点后插入一个新结点的时间复杂度为()。 【解答】Ο (1),Ο(n) 【分析】在p所指结点后插入一个新结点只需修改指针,所以时间复杂度为Ο (1);而在给定值为x的结点后插入一个新结点需要先查找值为x的结点,所以时间复杂度为Ο(n)。 ⑻可由一个尾指针唯一确定的链表有()、()、()。 【解答】循环链表,循环双链表,双链表 2.选择题 ⑴线性表的顺序存储结构是一种()的存储结构,线性表的链接存储结构是一种()的存储结构。 A随机存取B顺序存取C索引存取D散列存取 【解答】A,B 【分析】参见2.2.1。 ⑵线性表采用链接存储时,其地址()。 A必须是连续的 B部分地址必须是连续的 C一定是不连续的 D连续与否均可以 【解答】D 【分析】线性表的链接存储是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以连续,也可以不连续,甚至可以零散分布在内存中任意位置。 ⑶单循环链表的主要优点是()。 A不再需要头指针了 B从表中任一结点出发都能扫描到整个链表; C已知某个结点的位置后,能够容易找到它的直接前趋; D在进行插入、删除操作时,能更好地保证链表不断开。 【解答】B ⑷链表不具有的特点是()。 A可随机访问任一元素B插入、删除不需要移动元素 C不必事先估计存储空间D所需空间与线性表长度成正比 【解答】A ⑸若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋,则采用()存储方法最节省时间。 A顺序表B单链表C双链表D单循环链表 【解答】A 【分析】线性表中最常用的操作是取第i个元素,所以,应选择随机存取结构即顺序表,同时在顺序表中查找第i个元素的前趋也很方便。 单链表和单循环链表既不能实现随机存取,查找第i个元素的前趋也不方便,双链表虽然能快速查找第i个元素的前趋,但不能实现随机存取。 ⑹若链表中最常用的操作是在最后一个结点之后插入一个结点和删除第一个结点,则采用()存储方法最节省时间。 A单链表B带头指针的单循环链表C双链表D带尾指针的单循环链表 【解答】D 【分析】在链表中的最后一个结点之后插入一个结点需要知道终端结点的地址,所以,单链表、带头指针的单循环链表、双链表都不合适,考虑在带尾指针的单循环链表中删除第一个结点,其时间性能是O (1),所以,答案是D。 ⑺若链表中最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用()存储方法最节省运算时间。 A单链表B循环双链表C单循环链表 D带尾指针的单循环链表 【解答】B 【分析】在链表中的最后一个结点之后插入一个结点需要知道终端结点的地址,所以,单链表、单循环链表都不合适,删除最后一个结点需要知道终端结点的前驱结点的地址,所以,带尾指针的单循环链表不合适,而循环双链表满足条件。 ⑻在具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。 AO (1)BO(n)CO(n2)DO(nlog2n) 【解答】B 【分析】首先应顺序查找新结点在单链表中的位置。 ⑼对于n个元素组成的线性表,建立一个有序单链表的时间复杂度是()。 AO (1)BO(n)CO(n2)DO(nlog2n) 【解答】C 【分析】该算法需要将n个元素依次插入到有序单链表中,而插入每个元素需O(n)。 ⑽使用双链表存储线性表,其优点是可以()。 A提高查找速度B更方便数据的插入和删除 C节约存储空间D很快回收存储空间 【解答】B 【分析】在链表中一般只能进行顺序查找,所以,双链表并不能提高查找速度,因为双链表中有两个指针域,显然不能节约存储空间,对于动态存储分配,回收存储空间的速度是一样的。 由于双链表具有对称性,所以,其插入和删除操作更加方便。 ⑾在一个单链表中,已知q所指结点是p所指结点的直接前驱,若在q和p之间插入s所指结点,则执行()操作。 As->next=p->next;p->next=s;Bq->next=s;s->next=p; Cp->next=s->next;s->next=p;Dp->next=s;s->next=q; 【解答】B 【分析】注意此题是在q和p之间插入新结点,所以,不用考虑修改指针的顺序。 ⑿在循环双链表的p所指结点后插入s所指结点的操作是()。 Ap->next=s;s->prior=p;p->next->prior=s;s->next=p->next; Bp->next=s;p->next->prior=s;s->prior=p;s->next=p->next; Cs->prior=p;s->next=p->next;p->next=s;p->next->prior=s; Ds->prior=p;s->next=p->next;p->next->prior=s;p->next=s 【解答】D 【分析】在链表中,对指针的修改必须保持线性表的逻辑关系,否则,将违背线性表的逻辑特征,图2-10给出备选答案C和D的图解。 (a)备选答案C操作示意图(第4步指针修改无法进行)(b)备选答案D操作示意图 图2-10双链表插入操作修改指针操作示意图 s ① ③ ② ③ ai-1 ai x p s ④ ① ③ ② ③ ai-1 ai x p ④ (13)用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中某结点,则j后移的操作语句为()。 Aj=r[j].nextBj=j+1Cj=j->nextDj=r[j]->next 【解答】A 【分析】注意next是数组下标,因此排除C和D,对于备选答案B,假设工作指针j指向某结点p,则j+1不一定指向结点p的后继结点。 (14)设线性表有n个元素,以下操作中,()在顺序表上实现比在链表上实现的效率更高。 A输出第i(1≤i≤n)个元素值B交换第1个和第2个元素的值 C顺序输出所有n个元素D查找与给定值x相等的元素在线性表中的序号 【解答】A 【分析】在顺序表上输出第i(1≤i≤
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构c 版课后习题解析 数据结构 课后 习题 解析