一、单项选择题(本大题共12小题,每小题2分,共24分) 1.数据结构是( D )。 A.一种数据类型 B.数据的存储结构
C.一组性质相同的数据元素的集合
D.相互之间存在一种或多种特定关系的数据元素的集合 2.算法分析的目的是( B )。 A.辨别数据结构的合理性 B.评价算法的效率
C.研究算法中输入与输出的关系 D.鉴别算法的可读性
3.在线性表的下列运算中,不改变数据元素之间结构关系的运算是( D )。 .A.插入 C.排序
B.删除 D.定位
4.若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则可能出现的出栈序列为( B )。 A.3,2,6,1,4,5 C.1,2,5,3,4,6
B.3,4,2,1,6,5 D.5,6,4,2,3,1
5.设串sl=″Data Structures with Java″,s2=″it″,则子串定位函数index(s1,s2)的值为( D )。 A.15 C.17
B.16 D.18
6.二维数组A[8][9]按行优先顺序存储,若数组元素A[2][3]的存储地址为1087,A[4][7]的存储地址为1153,则数组元素A[6][7]的存储地址为( A )。 A.1207 C.1211
B.1209 D.1213
7.在按层次遍历二叉树的算法中,需要借助的辅助数据结构是( A )。
A.队列 C.线性表
B.栈 D.有序表
8.在任意一棵二叉树的前序序列和后序序列中,各叶子之间的相对次序关系( B )。 A.不一定相同 C.都不相同
B.都相同 D.互为逆序
9.若采用孩子兄弟链表作为树的存储结构,则树的后序遍历应采用二叉树的( C )。 A.层次遍历算法 C.中序遍历算法
B.前序遍历算法 D.后序遍历算法
10.若用邻接矩阵表示一个有向图,则其中每一列包含的″1″的个数为( A )。 A.图中每个顶点的入度 C.图中弧的条数
B.图中每个顶点的出度 D.图中连通分量的数目
11.图的邻接矩阵表示法适用于表示( C )。 A.无向图 C.稠密图
B.有向图 D.稀疏图
12.在对n个关键字进行直接选择排序的过程中,每一趟都要从无序区选出最小关键字元素,则在进行第i趟排序之前,无序区中关键字元素的个数为( D )。 A.i C.n-i
B.i+1 D.n-i+1
二、填空题(本大题共10小题,每小题2分,共20分)
1.栈是___操作受限(或限定仅在表尾进行插入和删除操作) ____的线性表,其运算遵循___后进先出 ____的原则。
2.___栈 ____是限定仅在表尾进行插入或删除操作的线性表。
3. 一个栈的输入序列是:1,2,3则不可能的栈输出序列是__3 1 2 _____。
4.二叉树由_(1)根结点、、 __,__(2)左子树_,_(3)右子树 __三个基本单元组成。 5.在二叉树中,指针p所指结点为叶子结点的条件是_p->lchild==null && p->rchlid==null _____。
6.具有256个结点的完全二叉树的深度为___9___。
7.已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该
树有___12___个叶子结点。
8.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的___比较___和记录的___移动__。
9.分别采用堆排序,快速排序,冒泡排序和归并排序,对初态为有序的表,则最省时间的是__简单选择排序___算法,最费时间的是___直接插入排序___算法。
10.不受待排序初始序列的影响,时间复杂度为O(N)的排序算法是_____,在排序算法的最后一趟开始之前,所有元素都可能不在其最终位置上的排序算法是_____。 三、解答题(本大题共3小题,第一题4分,第二题8分,第三题8分,共20分) 1.某广义表的表头和表尾均为(a,(b,c)),画出该广义表的图形表示。
2
2.已知二叉树的先序序列和中序序列分别为HDACBGFE和ADCBHFEG。 (1)画出该二叉树;
(2)画出与(1)求得的二叉树对应的森林。
3.已知带权图的邻接表如下所示,其中边表结点的结构为:
依此邻接表从顶点C出发进行深度优先遍历。 (1)画出由此得到的深度优先生成树;
(2)写出遍历过程中得到的从顶点C到其它各顶点的带权路径及其长度。
四、算法阅读题(本大题共2大题,7个小题,每小题3分,共21分) 1.已知用有序链表存储整数集合的元素。阅读算法f30,并回答下列问题:
(1)写出执行f30(a,b)的返回值,其中a和b分别为指向存储集合{2,4,5,7,9,12}和{2,4,5,7,9}的链表的头指针; (2)简述算法f30的功能; (3)写出算法f30的时间复杂度。 int f30(LinkList ha,LinkList hb) {
//LinkList是带有头结点的单链表
//ha和hb分别为指向存储两个有序整数集合的链表的头指针 LinkList pa,pb; pa=ha->next; pb=hb->next;
while(pa && pb && pa->data==pb->data) { pa=pa->next; }
if(pa==NULL && pb==NULL) return 1;
pb=pb->next;
else return 0; }
2.已知稀疏矩阵采用带行表的三元组表表示,其形式说明如下: #define MaxRow 100 typedef struct { int i,j,v; }TriTupleNode; typedef struct{
TriTupleNode data[MaxSize]; int RowTab[MaxRow+1]; //行表 int m,n,t;
//矩阵的行数、列数和非零元个数
//行号、列号、元素值
//稀疏矩阵的最大行数
}RTriTupleTable;
下列算法f31的功能是,以行优先的顺序输入稀疏矩阵的非零元(行号、列号、元素值),建立稀疏矩阵的带行表的三元组表存储结构。请在空缺处填入合适内容,使其成为一个完整的算法。(注:矩阵的行、列下标均从1起计) void f31(RTriTupleTable *R) { int i,k;
scanf(″%d %d %d″,&R->m,&R->n,&R->t); R->RowTab[1]=0;
k=1; //k指示当前输入的非零元的行号 for(i=0; ① ;i++)
{ scanf(″%d %d %d″, ② , ③ ,&R->data[i].v);
while(k { ④ ; R->RowTab[k]=i; } } } 五、算法设计题(本大题共2小题,第一小题题7分,第二小题8分,共15分) 1.已知中序线索二叉树T右子树不空。设计算法,将S所指的结点作为T的右子树中的 一个叶子结点插入进去,并使之成为TT的右子树的(中序序列)第一个结点(同时要修改 相应的线索关系)。 2.写出在中序线索二叉树里;找指定结点在后序下的前驱结点的算法。 1.算法源代码如下: int flag=1; int max; void sortbitree(bitree T) { if(T) { sortbitree(T->lchild); k++; if(k==1) max=T->data; else { if(T->data>max) max=T->data; else flag=0; } sortbitree(T->rchild); } } 2.算法源代码如下: int pathed[MAX_VERTEX_NUM]; int top=0; int path[MAX_VERTEX_NUM]; int ispath(algraph graph,int vi,int vj) { arcptr p; int j; pathed[vi]=1; path[++top]=vi;/*将顶点vi加入当前路径path */ if(path[top]==vj) /*存在顶点vi到顶点vj的路径*/ return 1; else /*将顶点vi的邻接点加入当前路径*/ for(p=graph.vertices[vi].firstarc;p;p=p->nextarc) if(!pathed[p->adjvex]) return ispath(graph,p->adjvex,vj); pathed[vi]=0; top--; /*将顶点vi从当前路径path中删除 */ if(top==0) return 0; /*不存在vi到vj的简单路径*/ } 3.算法源代码如下: bithrtree insucc(bithrtree p)/*找p结点的后继*/ { if(p->rtag==1) /*后继线索*/ return p->rchild; else /*右子树的最左下结点*/ { p=p->rchild; while(p->ltag==0) p=p->lchild; return p; } } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务