ImageVerifierCode 换一换
格式:DOCX , 页数:71 ,大小:613.88KB ,
资源ID:17188185      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17188185.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(13年电大数据结构1到9章过程性测试习题答案解析.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

13年电大数据结构1到9章过程性测试习题答案解析.docx

1、13年电大数据结构1到9章过程性测试习题答案解析数据结构基础教程习题解答第1章习题解答一、填空1数据是指所有能够输入到计算机中被计算机加工、处理的 符号 的集合。2可以把计算机处理的数据,笼统地分成 数值 型和 非数值 型两大类。 3数据的逻辑结构就是指数据间的 邻接关系 。4数据是由一个个 数据元素 集合而成的。5数据项是数据元素中 不可再分割 的最小标识单位,通常不具备完整、确定的实际意义,只是反映数据元素某一方面的属性。6数据是以 数据元素 为单位存放在内存的,分配给它的内存区域称为 存储结点 。7每个数据元素都具有 完整 、 确定 的实际意义,是数据加工处理的对象。8如果两个数据结点之

2、间有着逻辑上的某种关系,那么就称这两个结点是 邻接 的。9在一个存储结点里,除了要有数据本身的内容外,还要有体现 数据间邻接关系 的内容。 10从整体上看,数据在存储器内有两种存放的方式:一是集中存放 在一个连续的 内存存储区中;一是利用存储器中的零星区域, 分散地存放在 内存的各个地方。11在有些书里,数据的“存储结构”也称为数据的“ 物理结构 ”。 12“基本操作”是指算法中那种所需时间与操作数的具体取值 无关 的操作。二、选择1在常见的数据处理中, B 是最基本的处理。 A删除 B查找 C读取 D插入 2下面给出的名称中, A 不是数据元素的同义词。 A字段 B结点 C顶点 D记录 3

3、D 是图状关系的特例。 A只有线性关系 B只有树型关系 C线性关系和树型关系都不 D线性关系和树型关系都 4链式存储结构中,每个数据的存储结点里 D指向邻接存储结点的指针,用以反映数据间的逻辑关系。 A只能有1个 B只能有2个 C只能有3个 D可以有多个5本书将采用 C 来描述算法。 A自然语言 B流程图(即框图) C类C语言 DC语言 6有下面的算法段: for (i=0; in; i+) k+;其时间复杂度为 B 。 AO(1) BO(n) CO(log2n) DO(n2)三、问答 1中国百家姓中的赵、钱、孙、李、周、吴、郑、王等姓氏数据之间,是一种什么样的邻接关系,为什么?答:是一种线性

4、关系,因为这些姓氏之间符合关系的“有头有尾,顺序排列”的特点。 2什么是数据结点?什么是存储结点?它们间有什么关系?答:数据结点即是数据集合中的一个数据元素,存储结点是存放数据结点的内存单位。在存储结点里,不仅要存放数据结点的内容,还要(显式或隐式地)存放数据结点间的逻辑关系。 3为什么说链式存储既提高了存储的利用率,又降低了存储的利用率?答:由于链式存储是通过指针来体现数据元素之间的逻辑关系的,因此,存储结点可以不占用存储器的连续存储区。从这个意义上说,链式存储能够充分利用存储器中小的存储区,因此提高了存储器的利用率。另一方面,链式存储中的存储结点不仅要存放数据元素,还要占用适当的存储区来存

5、放指针,这是一种额外的存储开销。从这个意义上说,链式存储降低了存储器的利用率。 4列举几个数据之间具有树型结构的实际例子。答:学校各级管理之间,是一种分支层次结构;一本书的书目,是一种分支层次结构。 5判断如下除法过程是否是一个算法,为什么: (1)开始; (2)给变量m赋初值5,给变量n赋初值0; (3)m=m/n; (4)输出m; (5)结束。答:因为0不能为除数,本题第(3)步不具有有效性,所以它不是一个算法。但如果n的初值不为0,则是一个正确的算法。四、应用 1用类C语言中的do-while语句,描述输出整数1、2、3、9、10的过程。答:算法编写如下。void num () i=1;

6、 do printf (“i = %dn”, i ); i = i +1; while (i=0) printf (“输入的是正数”); else printf (“输入的是负数”); 3分析算法段中标有记号“#1”和“#2”的基本操作的执行次数: for ( i=0; in; i+) for (j=0; jn; j+) #1 y=1; for (k=0; kn; k+) #2 y=y+1;答:标有记号“#1”的基本操作的执行次数是:n2;标有记号“#2”的基本操作的执行次数是:n3。 4给出下面3个算法段的时间复杂度: (1)x+; (2)for (j=1; jn; j+) x+; (3)f

7、or (j=1; j=n; j+) printf (“j=%”, j); for (k=j; kPrior-Next = ptr-Next; ptr-Next-Prior = ptr-Prior; 。 7设tail是指向非空、带表头结点的循环单链表的表尾指针。那么,该链表起始结点的存储位置应该表示成 tail-Next-Next 。 8在一个不带表头结点的非空单链表中,若要在指针qtr所指结点的后面插入一个值为x的结点,则需要执行下列操作: ptr = malloc (size); ptr-Data = x ; ptr-Next = qtr-Next ; qtr-Next = ptr ; 9顺

8、序表Sq = (a1,a2,a3,an)(n1)中,每个数据元素需要占用w个存储单元。若m为元素a1的起始地址,那么元素an的存储地址是 m+(n-1)*w 。 10当线性表的数据元素个数基本稳定、很少进行插入和删除操作,但却要求以最快的速度存取表中的元素时,我们应该对该表采用 顺序 存储结构。二、选择1下面,对非空线性表特点的论述, C 是正确的。 A所有结点有且只有一个直接前驱 B所有结点有且只有一个直接后继 C每个结点至多只有一个直接前驱,至多只有一个直接后继 D结点间是按照1对多的邻接关系来维系其逻辑关系的 2一般单链表Lk_h为空的判定条件是 A 。 ALk_h = NULL BLk

9、_h-Next = NULLCLk_h-Next = Lk_h DLk_h != NULL 3带表头结点的单链表Lk_h为空的判定条件是 B 。 ALk_h = NULL BLk_h-Next = NULLCLk_h-Next = Lk_h DLk_h != NULL 4往一个顺序表的任一结点前插入一个新数据结点时,平均而言,需要移动 B个结点。 An Bn/2 Cn+1 D(n+1)/2 5在一个单链表中,已知qtr所指结点是ptr所指结点的直接前驱。现要在qtr所指结点和ptr所指结点之间插入一个rtr所指的结点,要执行的操作应该是 C 。 Artr-Next = ptr-Next; pt

10、r-Next = rtr; Bptr-Next = rtr-Next;Cqtr-Next = rtr; rtr-Next = ptr;Dptr-Next = rtr; rtr-Next = qtr-Next; 6在一个单链表中,若现在要删除ptr指针所指结点的直接后继结点,则需要执行的操作是 A 。 Aptr-Next = ptr-Next-Next ; Bptr = ptr-Next; ptr-Next = ptr-Next-Next ;Cptr = ptr-Next-Next ;Dptr-Next ptr ; 7在长度为n的顺序表中,往其第i个元素(1in)之前插入一个新的元素时,需要往后

11、移动 B 个元素。 An-i Bn-i+1 Cn-i-1 Di 8在长度为n的顺序表中,删除第i个元素(1in)时,需要往前移动 A 个元素。 An-i Bn-i+1 Cn-i-1 Di 9设tail是指向一个非空带表头结点的循环单链表的尾指针。那么,删除链表起始结点的操作应该是 D 。 Aptr = tail ; Btail = tail-Next ; tail = tail-Next ; free (tail) ; free (ptr);Ctail = tail-Next-Next ; Dptr = tail-Next-Next ; Free (tail); tail-Next-Next

12、= ptr-Next ; Free (ptr); free (ptr); 10在单链表中,如果指针ptr所指结点不是链表的尾结点,那么在ptr之后插入由指针qtr所指结点的操作应该是 B 。 Aqtr-Next = ptr ; Bqtr-Next = ptr-Next ; ptr-Next = qtr ; ptr-Next = qtr ; Cqtr-Next = ptr-Next ; Dptr-Next = qtr ; ptr = qtr ; qtr-Next = ptr ;三、问答 1试问,如下的线性表: L = (29,25,21,17,13,11,7,5,3,1)是有序线性表还是无序线性

13、表?答:L是一个有序线性表。 2线性表L第i个存储结点ai的起始地址LOC(ai)可以通过下面的公式计算得到: LOC(ai)= LOC(ai-1)+k其中k表示存储结点的长度。这个公式对吗?为什么? 答:这个公式是对的,因为第i个存储结点ai的起始地址LOC(ai),实际上就是等于第i-1个存储结点ai-1的起始地址LOC(ai-1)加上一个存储结点的长度k得到。3试说明创建顺序表算法Create_Sq ()中,Sq_max和Sq_num的不同之处。答:Sq_max代表的是顺序表的最大长度,也就是它最多可以容纳下多少个数据元素,顺序表创建后,Sq_max是一个保持不变的常量;Sq_num代表

14、的是顺序表内当前拥有的数据元素个数,在顺序表创建后,随着对数据元素进行的插入、删除操作,Sq_num将会不断地发生变化。 4如何判断一个顺序表是否为空? 答:只需判定Sq_num的当前值是多少,如果Sq_num为0,则表示顺序表Sq为空,否则表示该顺序表里有数据元素存在。5在算法2-3里,操作“Sq_num=Sq_num -1”的作用是什么?没有它行吗? 答:该操作是非常重要的,因为顺序表里当前拥有的元素个数是通过Sq_num来记录的,删除了一个元素,Sq_num必须减1,这样才能正确反映出删除后表中元素的个数。所以,没有这个操作是不行的。6在算法2-9里,如果现在是把一个结点插入到单链表尾结

15、点的后面。按照算法的描述,能够保证插入后最后一个结点的Next域为“”吗?答:能够。因为原来ptr-Next里是“”,做了第1步操作: qtr-Next = ptr-Next ;后,就是把插入结点的Next域置为“”。 7在一个单链表中,为了删除指针ptr所指的结点,有人编写了下面的操作序列。读懂并加以理解。试问,编写者能够达到目的吗?其思想是什么? x = ptr-Data ; qtr = ptr-Next ; ptr-Data = ptr-Next-Data ; ptr-Next = ptr-Next-Next ; free (qtr); 答:能够达到删除指针ptr所指结点的目的。编写者的

16、思想是不去直接删除ptr所指的结点,而是在把ptr直接后继的Data域内容写入ptr所指结点的Data域之后,把它的直接后继删除。对于单链表来说,得到一个结点的直接后继容易,得到它的直接前驱难,所以这样的设计是有其可取之处的。 8在一个单链表中,为了在指针ptr所指结点之前插入一个由指针qtr所指的结点,有人编写了下面的操作序列,其中temp是一个临时工作单元。读懂并加以理解。试问,编写者能够达到目的吗?其思想是什么? qtr-Next = ptr-Next ; ptr-Next = qtr ; temp = ptr-Data ; p-Data = qtr-Data ; qtr-Data =

17、temp ; 答:能够达到在指针ptr所指结点之前插入一个由指针qtr所指结点的目的。编写者的思想是考虑到在单链表中得到一个结点的前驱信息较为困难,因此在这里先把qtr所指结点插入到ptr所指结点的后面,暂时成为它的直接后继。然后通过临时工作单元temp,将ptr及qtr所指结点的Data域内容进行交换,从而达到插入的目的。 9打算形成一个有表头结点的循环双链表,初始时除了每个结点的Next域已经链接好外,它们的Prior域还都是空的。有人编写了下面的算法,试图完成Prior域的链接:Com_Cd (Cd_h) ptr = Cd_h-Next ; qtr = Cd_h ; while (ptr

18、 != Cd_h) ptr -Prior = qtr ; qtr = ptr ; ptr = ptr-Next ;Cd_h-Prior = qtr ; 读懂并理解它,解释为什么能够完成各结点的Prior域的链接? 答:算法中用两个指针ptr和qtr配合,从头到尾扫描这个循环双链表,以达到让每个结点的Prior域指向其直接前驱的目的。四、应用1设计一个计算表头指针为Lk_h的单链表长度(即结点个数)的算法。答:算法设计如下:Length_Lk (Lk_h)n = 0 ; ptr = Lk_h ; /* ptr指向起始结点 */ while (ptr != NULL) ptr = ptr-Next

19、 ; n=n+1 ; /* n为结点计数单元 */return (n) ; 2用总是在表的头部插入整数结点的方法建立一个单链表,当输入为0时,建表过程结束。 答:算法设计如下:Clink() Lk_h = NULL; scanf (%d, &x); while (x != “0”) ptr = malloc (size); ptr-Data = x; ptr-Next = Lk_h; Lk_h = ptr; scanf (%d, &x);return Lk_h; 3一个不带表头结点的循环双链表Ck的表头指针为Ck_h,要在指针ptr指向处前插入一个rtr所指结点。模仿图2-21,对一般插入位置

20、标示出下面4个操作步骤:rtr-Next = ptr ;rtr-Prior = ptr-Prior ;ptr-Prior-Next = rtr ;ptr-Prior = rtr ; 答:4个操作步骤的具体功能体现如下图所示。 4试设计一个算法copy (Ck_h1, Ck_h2),将一个带表头结点的、以Ck_h1为表头指针的单链表Ck1的内容,复制到一个不带表头结点的、以Ck_h2为表头指针的单链表Ck2中。 答:算法具体如下。Copy (Ck_h1, Ck_h2) ptr = Ck_h1-Next ; qtr = Ck_h2 ; while ( ptr != NULL) rtr = mall

21、oc (size); rtr-Data = ptr-Data ; qtr-Next = rtr ; qtr = rtr ; ptr = ptr-Next ;qtr-Next = NULL ; 5已知一个带表头结点的递增单链表。试编写一个算法,功能是从表中去除值大于min、且值小于max的数据元素。(假定表中存在这样的元素) 答:所需算法编写如下。Del_Sq(Lk_h, nim, max) ptr = Lk_h-Next ; /* ptr指向链表的起始结点 */ while ( (ptr != NULL) & (ptr-Data = min) ) /* 跳过所有值Next ;while ( (

22、ptr != NULL) & (ptr-Data max) ) /* 若结点值Next ;qtr-Next = ptr ; /* qtr指出第1个大于max的结点位置,完成链接 */ 6已知一个带表头结点的无序单链表。试编写一个算法,功能是从表中去除所有值大于min、且值小于max的数据元素。 答:所需算法编写如下,其中指针ptr总是指向当前被检查的结点,qtr总是指向被检查结点的直接前驱。Del_Lk (Lk_h, min, max) ptr = Lk_h-Next ; /* ptr指向单链表的起始结点 */ while (ptr != NULL) /* 扫视直到链尾结点 */ if ( (

23、ptr-Data Data = max) /* 不满足删除条件 */ qtr = ptr ; /* 往后移动qtr和ptr */ ptr = ptr-Next ;else /* 删除ptr所指结点,往后移动ptr */ qtr-Next = ptr-Next ; free (ptr); ptr = qtr-Next ; 7一个单链表Lk的表头指针为Lk_h,不同结点的Data域值有可能相同。编写一个算法,功能是计算出Data域值为x的结点的个数。 答:算法应该遍历链表的每一个结点,遇到一个结点的Data域值为x时,计数器n就加1。最后返回计数器n。Count_Lk (Lk_h) n = 0 ;

24、 ptr = Lk_h ; while (ptr != NULL) if (ptr-Data = x) n = n+1 ; ptr = ptr-Nextreturn (n) ;第3章习题解答一、填空1限定插入和删除操作只能在一端进行的线性表,被称为是 栈 。2如果在顺序栈满时仍打算进行进栈操作,就称为发生了“ 上溢 ”出错。3如果在顺序栈空时仍打算进行出栈操作,就称为发生了“ 下溢 ”出错。 4在具有n个数据结点的循环队列中,队满时共有 n-1 个数据元素。 5如果操作顺序是先让字母A、B、C进栈,做两次出栈;再让字母D、E、F进栈,做一次出栈;最后让字母G进栈,做三次出栈。最终这个堆栈从栈顶

25、到栈底的余留元素应该是 DA 。 6中缀表达式(a+b)-(c/(d+e)对应的后缀表达式是 ab+cde+/- 。 7函数的递归调用有两种形式:如果一个函数是直接调用自己,就称其为 直接 递归调用;如果一个函数是通过另一个函数来调用自己,就称其为 间接 递归调用。 8设某栈的元素输入顺序是1、2、3、4、5,想得到4、3、5、2、1的输出顺序。那么push、pop的操作序列应该是 push、push、push、push、pop、pop、push、pop、pop、pop 。 9设链栈的栈顶指针为Ls_top,那么它非空的条件应该是 Ls_top != NULL 。 10队列中,允许进行删除的一

26、端称为 队首 。二、选择1一个栈的元素进栈序列是a、b、c、d、e,那么下面的 C 不能做为一个出栈序列。 Ae、d、c、b、a Bd、e、c、b、a Cd、c、e、a、b Da、b、c、d、e 2判定一个顺序队列Qs(最多有n个元素)为空的条件是 C 。 AQs_rear-Qs_front = n*size BQs_rear-Qs_front+1 = n*size CQs_front = Qs_rear DQs_front = Qs_rear+size 3判定一个顺序队列Qs(最多有n个元素)真满的条件是 A 。 AQs_rear-Qs_front = n*size BQs_rear-Qs_

27、front+1 = n*size CQs_front = Qs_rear DQs_front = Qs_rear+size 4在一个链式队列Lq中,Lq_front和Lq_rear分别为队首、队尾指针。现在由指针ptr所指结点要进队,则插入操作应该是 B 。 ALq_front-Next = ptr; Lq_front = ptr; BLq_rear-Next = ptr; Lq_rear = ptr; Cptr-Next = Lq_rear; Lq_rear = ptr; Dptr-Next = Lq_front; Lq_front = ptr; 5链栈与顺序栈相比,一个较为明显的优点是 D 。 A通常不会出现栈空的情形 B插入操作更加便利 C删除操作更加便利 D通常不会出现栈满的情形 6向链栈插入一个结点时,操作顺序应该是 C 。 A先修改栈顶指针,再插入结点 B无须修改栈顶指针 C先插入

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2