2009-2010-1_数据结构期中试卷答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
班级:
学号:


姓名: 线
9.若有一整数数组 data[10](data[0…9]),其中值依次为{1, 4, 10, 20, 34, 59, 67, 87, 110, 129},则 用二分法查该表中元素 20 需( D )元素比较。 A. 1 B. 2 C.3 D. 4 10.具有 100 个结点的完全二叉树(Complete Binary Tree)的深度为 ( B )。 A. 6 B. 7 C. 8 D. 9 11.在用二叉链表表示的具有 n 个结点的二叉树中,空指针域的个数为( C )。 A. n – 1 B. 2n – 1 C. n + 1 D. 2n + 1 12.在下图所示的 4 棵二叉树中,( C )不是完全二叉树(Complete Binary Tree)。
3.(15 分)对右图所示的二叉树,要求: (1).给出其数组表示时的存储示意图;
B
A
C
2
D E H
F
G
(2).给出其二叉链表表示(每个结点有三个域:数据域、 指向左孩子和指向右孩子的指针域)时的存储 示意图; (3).给出其先序、中序和后序遍历结果. 答: (1). 0 (2). 见右图.
bt
1 A
得分
4
{ __________D____________; Q->Array[Q->Rear] = X; } } int Dequeue(Queue Q, ElementType &X) { if (_____E_____) return FALSE; else { _________F_________; Q->Front = Succ(Q->Front, Q); } } A._((Q->Rear + 1)% Q->Capacity == Q->Front) B._ ((Q->Rear + 2) % Q->Capacity == Q->Front) C. ____ IsFull(Q)__ E. __ IsEmpty(Q)__ 四、编写程序(24 分) D. _Q->Rear = Succ(Q->Rear, Q)或 Q->Rear = (Q->Rear + 1)_% Q->Capacity F. __ X = Q->Array[Q->Front]____ 得分
2 B
3 C
4 D
5 E
6
7 H
8
9
10 F
11 G
(3).先序:ABDEFGCH 中序:DBFEGACH 后序:DFGEBHCA
B
A
^ C ^ H ^
ቤተ መጻሕፍቲ ባይዱ^ D ^
E
^ F ^
^ G ^
4.(12 分)已知一棵树的双亲表示如下表所示: 0 1 2 3 4 5 R -1 A 0 B 0 C 1 D 1 E 1
C R A D E B F G
A C D H I J B F E G
H
I J
3
三、程序填空(共 12 分,每空格 2 分) 下面是循环队列的存储结构描述及队列各基本操作的实现,请在空白处填上正 确的代码以完成 Queue ADT。 #define MaxElements 20 #define MinQueueSize (5) #define TRUE 1 #define FALSE 0 struct QueueRecord; typedef struct QueueRecord *Queue; struct QueueRecord { int Capacity; int Front; int Rear; ElementType *Array; }; int IsEmpty(Queue Q) { return__________A____________; } int IsFull(Queue Q) { return __________B___________;} Queue CreateQueue(int MaxElements) { Queue Q; if (MaxElements < MinQueueSize) return NULL; Q = (Queue)malloc(sizeof(struct QueueRecord)); if (Q == NULL) return NULL; Q->Array = (ElementType *)malloc(sizeof(ElementType) * MaxElements); if (Q->Array == NULL) return NULL; Q->Capacity = MaxElements; MakeEmpty(Q); return Q; } void MakeEmpty(Queue Q) { Q->Front = 1; Q->Rear = 0; } int Succ(int Value, Queue Q) { if (++Value == Q->Capacity) Value = 0; return Value; } int Enqueue(ElementType X, Queue Q) { if ( C ) return FALSE; else
已知一个带有表头结点的单链表,结点由数据域和指向后继的指针域组成,假设该链表只给出 了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中的倒数第 k 个 位置上的结点(k 为正整数) 。若查找成功,算法输出该结点的数据域的值,并返回 1;否则,只返 回 0.要求: (1) 给出单链表的存储结构定义; (2) 描述算法的基本设计思想; (3) 描述算法的详细实现步骤) ; (4) 根据设计思想和实现步骤,用 C 语言实现描述算法) ,关键之处请给出简要注释。 答: (1) struct _Node{ ElementType Element; struct Node *Next; }; typedef struct _Node Node; typedef struct _Node *PtrToNode; typedef PtrToNode List; (2) 算法的基本思想如下:从头至尾遍历单链表,并用指针 p 指向当前结点的前 k 个结点。当遍历 到链表的最后一个结点时,如果表中存在 k 个结点,则指针 p 所指的结点即为所查找的结点。 (3) 详细实验步骤: 增加两个指针变量和一个整型变量,从链表头向后遍历,其中指针 p1 指向当前遍历的结点,指 针 p 指向 p1 所指向结点的前 k 个结点,如 p1 之前没有 k 个结点,那么 p 指向表头结点。用整型变 量 i 表示当前遍历了多少个结点,当 i>k 时,说明表中有 k 个结点,所以让 p 与 p1 之间保持 k 个结 点的间距,让 p=p->Next。当遍历完成时,p 或者指向表头结点,或者指向链表中倒数第 k 个位置
A.
B.
C.
D.
13.若用数组 S[N](S[0…N-1])作为两个栈 S1 和 S2 的共用存储结构,对任何一个栈,只有当 S 数组全满时才不能入栈操作。为这两个栈分配空间的最佳初始方案是( A )。 A. S1 的栈底位置为-1,S2 的栈底位置为 N; B. S1 的栈底位置为-1,S2 的栈底位置为 N / 2; C. S1 的栈底位置为 0, S2 的栈底位置为 N / 2; D. S1 的栈底位置为 N/2 -1,S2 的栈底位置为 N/2; 得分 二、问答题(共 38 分) 1.(6 分)什么是算法,如何评价算法的好坏? 答:算法是为计算机处理问题而编制的一组指令集。 评价算法的好坏: (1) 、通过将算法用某种具体的语言编写出程序,执行程序,测量运行时间来评价算法的好坏。 (2) 、分别算法的渐近时间和空间复杂度来分析算法的好坏。 2.(5 分)给出下列程序的运行结果(CreateStack(), Push(), Pop(), IsEmpty()均为 Stack 的基本操作) 。 void main(){ Stack S; char x,y; S = CreateStack( ); x=’c’;y=’k’; Push(S,x) ;Push(S,’a’) ;Push(S,y) ; Pop(S,x) ;Push(S,’t’) ;Push(S,x) ; Pop(S,x) ;Push(S,’s’) ; while(! IsEmpty(S) ){ Pop(S,y) ;printf(”%c”, y) ;} printf(”%c “, x) ; } stack
杭州师范大学信息科学与工程学院 2009-2010 学年第 1 学期期中考试
《数据结构》参考答案
题号 得分 一 二 三 四 总分
一、单项选择题(共 26 分,每小题 2 分) 得分 1.下列程序段的时间复杂度为( B ) void InsertionSort ( ElementType A[ ], int N ) { int j, P; ElementType Tmp; for ( P = 1; P < N; P++ ) { Tmp = A[ P ]; for ( j = P; j > 0 && A[ j - 1 ] > Tmp; j-- ) A[ j ] = A[ j - 1 ]; A[ j ] = Tmp; } } A. O(n) B. O(n2) C. O(n3) D. O(n4) 2.下列说法哪个正确( A ) A. n*logn+1000*n =O(nlogn) B. n*logn+1000*n =O(n) C. n(n – 1) / 2 =O(n) D. logn+1000*n =O(logn), 1000*n+2n =O(2n) 3.设一个栈的入栈序列为 a,b,c,d,e, 则不可能的输出序列为( B )。 A. e, d, c, b, a B. d, c, e, a, b C. d, e, c, b, a D. a, b, c, d, e 4.将递归算法转换成对应的非递归算法时,通常需要使用( A )保存中间结果。 A. 栈 B. 队列 C. 链表 D. 树 5.若某链表中最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用 ( D )存储方式最节省运算时间。 A. 单链表 B. 单向循环链表 C. 双向不循环链表 D. 带头结点的双向循环链表 6.带头结点的非循环单链表 head 的尾结点(由 p 所指向,结点的数据域为 Element,指针域为 Next)满足( D )。 A. p = = head B. p = = NULL C. p->Next = = head D. p->Next = = NULL 7.若非空单链表的数据域为 Element,指针域为 Next,指针 p 指向单链表中第 i 个结点,s 指向 已生成的新结点,现要将 s 结点插入到单链表中 p 结点后,使其成为第 i + 1 个结点,则下列 算法段能正确完成上述要求的是( A )。 A. s->Next = p->Next; p->Next = s; B. p->Next = s; s->Next = p->Next; C. p = s; s->Next = p; D. s->Next = p; p ->Next = s; 8.数据结构是带结构的数据元素的集合,它可以形式化的定义为{D,S},其中 D 是( B ) 的有限集合,R 是 D 上的( E )的有限集合。 A. 算法 B. 数据元素 C.数据操作 D.逻辑结构 E. 数据关系
6 F 2
7 G 2 4
8 H I
9 5
10 J 9
树的双亲表示法:利用树中的每个结点(除根结点外)只有唯一双亲的特点,用数组来存储一棵一般 的树,数组的每个元素有二个分量,其一存储该元素的值,其二存储该元素的双亲位置(即下标),根结 点的双亲位置为-1. 树的孩子兄弟表示法: 树中的每个元素用一个结点来表示,结点的结构由数据域和二个指针域组 成,第一个指针域指向该元素的第一个孩子,第二个指针域指向该元素的下一个兄弟。 (1).试画出此树; (2).画出此树的孩子兄弟表示时的示意图; R (3).将此树转化为相应的二叉树并画出. 答: (1). 见右图. (2). 见右图: (3). 见右图.
相关文档
最新文档