数据结构期末考卷12-13级
![数据结构期末考卷12-13级](https://img.360docs.net/imgdf/06piyuplpuebe3czzzht-f1.webp)
![数据结构期末考卷12-13级](https://img.360docs.net/imgdf/06piyuplpuebe3czzzht-92.webp)
诚信应考 考出水平 考出风格 浙江大学城市学院 2012 — 2013 学年第 一 学期期末考试试卷 《 数据结构基础 》 开课单位: 计算分院 ;考试形式:闭卷;考试时间: 2013 年 1 月 12 日; 所需时间: 120 分钟
一.选择题 (本大题共 15 题,每题 1 分,共 15 分) 1. 数据结构形式地定义为(K ,R ),其中K 是 的有限集合,R 是K 上的关系的有限集合。 A. 算法 B. 数据元素 C. 数据操作 D. 逻辑结构 2.数据在计算机内存中的表示是指 。 A. 数据的存储结构 B. 数据结构 C. 数据的逻辑结构 D. 数据元素之间的关系 3. 某算法的时间复杂度为f(n)= 8log 2n+5n+2,若采用数量级的形式表示,应该是 。 A .O(8log 2n+5n+2)
B
.O(log 2n+n) C .O(n) D .O(log 2n) 4. 与单链表相比,双链表的优点之一是 。 A. 插入、删除操作更加简单 B. 可随机访问 C. 可以省略表头指针或表尾指针 D. 顺序访问相邻结点更加灵活 5. 设线性表L=(a1,a2,……an),下列关于线性表的叙述正确的是 。 A .每个元素都有一个直接前驱和一个直接后继 B .线性表中至少有一个元素 C .表中元素排列顺序必须按由小到大或由大到小 D .除第一个和最后一个元素外,其余每个元素都有且只有一个直接前驱和一个直接后继
6. 以下关于顺序存储结构的叙述中,是不正确的。
A.空间利用率高
B.逻辑上相邻的结点物理上不必邻接
C.可以通过计算机直接确定第i个结点的存储地址
D.插入、删除运算操作不方便
7.以下不是栈的基本运算的是。
A.删除栈顶元素 B. 删除栈底元素
C.判断栈是否为空 D. 将栈置为空栈
8. 向一个栈指针为HS的链式栈中插入一个s所指的结点时,则执行。
A. HS->NEXT=S;
B. S->NEXT=HS->NEXT;HS->NEXT=S;
C. S->NEXT=HS;HS=S;
D. S->NEXT=HS;HS=HS->NEXT;
9.在一个非空的链式队列中,假设f和r分别为队头和队尾指针,则插入s所指的结点运算
是。
A. f->next=s;f=s;
B. r->next=s;r=s;
C. s->next=s;r=s;
D. s->next=f;f=s;
10. 数组Q[0..n-1]用来表示一个环形队列,f为当前队头元素的前一位置,r为队尾元素的位置,假定队列中元素个数的总数小于n,计算队列中元素个数的公式为。
A. r-f
B. n+f-r
C. n+r-f
D. (n+r-f)mod n
11. 递归函数调用时,为保存局部变量及返回地址,要用一种称为的数据结构。
A. 队列
B. 栈
C. 多维数组
D. 线性表
12.将一棵有1000个结点的完全二叉树从上到下,从左到右依次进行编号,根结点的编号为1,则编号为49的结点的右孩子编号为。
A. 98
B. 99
C. 50
D. 没有右孩子
13.对二叉树的结点从1开始进行编号,要求每个结点的编号大于其左右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用遍历实现编号。
A. 先序
B. 中序
C. 后序
D. 层序
14.假设一个有n个顶点和e条边的有向图用邻接表表示,则删除与某个顶点相关联的所有边的时间复杂度是___________。
A. O(n)
B. O(e)
C. O(n+e)
D. O(n*e)
15.分析下面的无向图,从顶点A出发的深度优先搜索序列可以为___________。
A. ABDGEHFC
B. ABCDEFGH
C. ABDEGCFH
D. ACEHFDBG
二.填空题 (本大题共 20 个空,每个空 1 分,共 20 分) 1.
线性结构中元素之间存在着 ⑴ 关系,图形结构中元素之间存在着 ⑵ 关系。 2.
数据的逻辑结构包括 ⑶ 和 ⑷ 两大类。 3.
算法评价的五个方面是:正确性、稳健性、可读性、 ⑸ 和 ⑹ 。 4. 下面程序段的时间复杂度为 ⑺ 。
for (i=0;i for (j=0; j A[i][j]=0; 5. 对于一个长度为n 的顺序存储的线性表,在表头插入元素的时间复杂度为 ⑻ , 在表尾插入元素的时间复杂度为 ⑼ 。 6. 对于双向链表,删除一个结点需修改的指针域共有 ⑽ 个。 7.若对线性表进行的操作主要不是插入和删除,则该线性表宜采用 ⑾ 存储结构; 若需频繁地对线性表进行插入和删除操作,则该线性表宜采用 ⑿ 存储结构。 8.栈和队列是一种特殊的线性表,根据栈和队列的特征,栈是一种 ⒀ 的线性表, 队列是一种 ⒁ 的线性表。 9.一个栈的输入序列是12345,则43512是否可能是栈的输出序列?(回答是或否) ⒂ 。 10.对一棵具有n 个结点的二叉树,当它为一棵 ⒃ 二叉树时具有最小高度;当它 为一棵 ⒄ 二叉树时,具有最大高度。 11.在一个无向图中,所有顶点的度数之和等于所有边数 ⒅ 倍,在一个有向图中, 所有顶点的入度之和等于所有顶点出度之和的 ⒆ 倍。 12. 图的广度优先搜索遍历算法需借助于哪一种数据结构? ⒇ 。 三.解答题 ( 本大题共 3 题,每题 6 分,共 18 分) 1. 设有一个单循环链表p 如下图所示, ① 请画出执行p->next=p->next->next 语句后的新链表图; ② 若现有一个新结点q ,如下图所示,则请在①基础上画出接着执行q->next=p->next; p->next=q; p=q; 语句序列后的新链表图。 2.已知一棵二叉树的后序遍历序列为“a 、b 、c 、*、+、d 、e 、/、f 、-、-”,中序遍历序列为“a 、+、b 、*、c 、-、d 、/、e 、-、f”, ① 请画出该二叉树的二叉链表结构示意图; ② 写出它的后序遍历序列。 3.设有向图G如下图所示, ①请给出该图的邻接矩阵存储结构示意图; ②画出该图的强连通分量; void func1( ) { int x; Statck s; //定义栈s cin >> x; while (x<>0) { push(s,x); cin>>x; } while (!EmptyStack(s)) cout< } 2.阅读下列程序,说明算法的功能: typedef struct { ElemType *list; int size; int MaxSize; }SeqList; void func2(SeqList A, SeqList B, SeqList &C) { //A和B是两个分别以值递增有序排列的有序表,C是需返回的新表int i=A.size-1, j=B.size-1, k=A.size+B.size-1; C.size=k; while (i>=0 && j>=0 ) { if ( A.list[i] C.list[k]= B.list[j]; k--; j--; } else { C.list[k]= A.list[i]; k--; i--; } } while (i>=0) { C.list[k]= A.list[i]; k--; i--; } while (j>=0) { C.list[k]= B.list[j]; k--; j--; } } 3.阅读下列程序,说明算法的功能: int func3(BTreeNode *BT) { if(BT==NULL) return 0; else if(BT->left ==NULL&&BT->right ==NULL) return 1; else return func3(BT->left ) + func3(BT->right ) + 1; } 1. 下列算法是输出邻接矩阵存储结构的有向图G各顶点的入度和出度,请在空白处填入适当的语句,使该算法完整。 typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; void Graph( adjmatrix G, int n) { //G是n个顶点的邻接矩阵存储结构的有向图 int i, j, k, d; for(i = 0 ; i < n; i++) { d = 0; for(j=0; j < n; j++) if( ①) d++; cout<<”顶点i的出度是”< d = ②; for(k=0; k < n; k++) if( ③) d++; cout<<”顶点i的入度是”< } } 2. 一个双端队列是限定在两端end1和end2都可以进行插入和删除的线性表。若用顺序方式来组织双端队列(构成一个循环队列),示意图如下图所示,Q.end1指向一端的头元素的前一个位置,Q.end2指向另一端的头元素位置,队列空条件为:Q.end1==Q.end2;队列满条件为:(Q.end2+1)%MAXSIZE==Q.end1(此时有一个元素空间为空)。初始状态时,Q.end1=Q.end2=0。入队列时,end1按照逆时针方向进行,end2按照顺时针方向进行;出队列时方向相反。下列算法是在指定端K(K为1或2)进行双端队列的插入操作,当k==1时,在左端Q.end1操作;k==2时,在右端Q.end2操作,请在空白处填入适当的语句,使该算法完整。 #define MAXSIZE 100 typedef struct { ElemType data[MAXSIZE]; int end1; int end2; }DQueue; int En_DoubleQueue( DQueue &Q, ElemType x, int k ) { //将元素x入队列Q,k==1时入左端Q.end1,k==2时入右端Q.end2, //若入队成功,返回1,否则返回0 if( (Q.end2+1)%MAXSIZE == Q.end1 ) //队列满 return 0; if( k==1 ) { ④= x; Q.end1 = (Q.end1 - 1) % MAXSIZE; } else if( k==2 ) { Q.end2 = (Q.end2 + 1) % MAXSIZE; ⑤= x; } else return 0; return ⑥; } 1. 有一个带表头附加结点的有序单链表L,其结点元素值类型为int类型,要求: ①写出该单链表的结点结构定义; ②写一算法(函数),将值为x的元素插入到单链表适当位置上,以保持单链表的有序性。 2. 有一以二叉链表方式存储的二叉树BT,要求: ①写出二叉链表的结点结构定义; ②写一算法(函数),判断二叉树BT是否是一棵正则二叉树。注:正则二叉树是指在二叉树中 不存在子树个数为1的结点(即不存在度为1的结点)。