解放军信息工程大学硕士研究生入学考试试题
数据结构
一、单项选择题(每小题2分,共30分)
1.将数组称为随机存储结构是因为( )
A. 数组元素是随机的;
B. 随时可以对数组元素进行访问;
C. 对数组的任一元素的存取时间是相等的;
D. 数组的存储结构是不定的。
2. 在索引顺序表中查找一个元素,可用的且最快的方法是( )
A. 用顺序查找法确定元素所在块,再用顺序查找法在相应块中查找
B. 用顺序查找法确定元素所在块,再用二分查找法在相应块中查找
C. 用二分查找法确定元素所在块,再用顺序查找法在相应块中查找
D. 用二分查找法确定元素所在块,再用二分查找法在相应块中查找
3.二叉排序树中,关键字值最大的结点( )
A. 左指针一定为空 B. 右指针一定为空
C. 左、右指针均为空 D. 左、右指针均不为空
4.最小生成树指的是( )
A. 由连通图所得到的边数最少的生成树
B. 由连通图所得到的顶点相对较少的生成树
C. 连通图的所有生成树中权值之和最小的生成树
D. 连通网的极小连通子图
5.采用散列技术实现表的存储和查找,需解决的主要问题是( )
A. 如何申请到足够大的空间
B. 如何正确认识元素之间的逻辑关系
C. 如何找到一个好的查找方法
D. 如何构造一个散列地址均匀分布的散列函数
6.将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度为( )
A.(1) B. O(n) C. O(m) D. O(m+n)
7.由两个栈共享一个向量空间的好处是( )
A.减少存取时间,降低下溢发生的机率
B.节省存储空间,降低上溢发生的机率
C.减少存取时间,降低上溢发生的机率
D.节省存储空间,降低下溢发生的机率
8.设数组data[m]作为循环队列SQ的存储空间,front为队头指针,rear为队未指针,则执行出队操作后其头指针front的值为( )
A.front=front+1 B.front=(front+1)%(m-1)
C.front=(front-1)%m D.front=(front+1)%m
9.若目标串的长度为n,模式串的长度为(int)n/3,则执行模式匹配算法时,在最坏情况下的时间复杂度是( )
A.O(n/3) B. O(n)
C. O(n*n) D. O(n*n*n)
10.一个非空广义表的表头( )
A.不可能是子表 B.只能是子表
C.只能是原子 D.可以是子表或原子
11.在一棵度为3的树中,度为3的结点个数为2,度为2的结点个数为1,则度为0的结点个数为( )
A. 4 B. 5 C. 6 D. 7
12.在含n个顶点和e条边的无向图的邻接矩阵中,零元素的个数为( )
A. e B. 2*e C. n*n-e D. n*n-2*e
13. 假设一个有n个顶点和e条边的有向图用邻接表表示,则删除与某个顶点Vi相关的所有弧的时间复杂度是( )
A.O(n) B. O(e)
C. O(n+e) D. O(n*e)
14.用某种排序方法对关键字序列(25,84,21,47,15,27,68,35,20)进行排序时,序列的变化情况如下:
20,15,21,25,47,27,68,35,84
15,20,21,25,35,27,47,68,84
15,20,21,25,27,35,47,68,84
则所采用的排序方法是( )
A.选择排序 B.希尔排序
C.归并排序 D.快速排序
15.不定长文件是指( )
A.文件的长度不固定 B.记录的长度不固定
C.字段的长度不固定 D.关键字项的长度不固定
二、判断题(每小题1分,共10分)
1. 数据结构中运算的实现和具体的存储结构无关。( )
2.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。( )
3.如果一个串中的所有字符都在另一个串中出现,则说前者是后者的子串。( )
4.堆中所有非终端结点的值均小于等于(大于等于)其左右子树的值。( )
5.理想情况下,在散列表中查找一个结点的时间复杂度为O(1)。( )
6.快速排序在每一趟排序中都能将一个元素放在最终位置上。( )
7.在二叉排序树上删除一个结点时,不必移动其它结点,只要将该结点的父结点的相应指针域置空即可。( )
8.连通分量是无向图中的极小连通子图。( )
9.先根遍历树和前序遍历与该树对应的二叉树,其结果不同。( )
10.若一个叶子结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的前序遍历序列中的最后一个结点。( )
三、填空(每小题1分,共10分)
1. 一个具有n个顶点的无向完全图的边数为( ) 。
2. 若以{4,5,6,7,8}作为叶子结点的权值构造哈夫曼树,则其带权路径长度是 ( )。
3. 如果一个有向图中没有( ) ,则该图的全部顶点可以排成一个拓扑序列。
4. 冒泡排序在最好的情况下的结点交换次数为( ) 。
5.在一个带头结点的单向循环链表中,p指向尾结点的直接前驱,则指向头结点的指针head可用p表示为head=( ) 。
6.在串S=“structure”中,以t为首字符的子串有( )个。
7.假设一个9阶的上三角矩阵A按列优先顺序压缩存储在一维数组B中,其中B[0]存储矩阵中第1个元素a1,1,则B[31]中存放的元素是( )。
8.已知一棵完全二叉树中共有768个结点,则该树中共有( ) 个叶子结点。
9.在单链表上难以实现的排序方法有( )和( ) 。
10.在有序表(12,24,36,48,60,72,84)中二分查找关键字72时所需进行的关键字比较次数为( )。
四、解答题(每小题3分,共12分)
1.一棵二叉树的先序、中序和后序遍历序列分别如下,其中一部分未标出,请构造出该二叉树(下面序列中每个“-”代表一个未标出的字母)。
先序: --CDE-GHI-K
中序: CB--FA-JKIG
后序: -EFDB-JIH-A
2.画出下列广义表的共享结构图形
P=(((z),(x,y)),((x,y),x),(z))
3.已知一表为(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec),按表中顺序依次插入初始为空的二叉排序树,要求:
(1)画出建立的二叉排序树;
(2)求出等概率情况下查找成功的平均查找长度。
4.对下图所示的AOE网,求出各项活动的最早开始时间e(i)和最迟开始时间l(i),并回答:工程完成的最短时间是多少?哪些活动是关键活动?

五、算法阅读题(每小题4分,共8分)
1.下列算法的功能是比较两个链串的大小,其返回值为:
请在空白处填入适当的内容。
int comstr(LinkString s1, LinkString s2)
{//s1,s2为两个链串的头指针
while (s1&&s2) {
if (s1->data<s2->data) return –1;
if (s1->data>s2->data) return 1;
(1) ;
(2) ;
}
if ( (3) ) return –1;
if ( (4) ) return 1;
(5) ;
}
(1):
(2):
(3):
(4):
(5):
2.已知二叉树的存储结构为二叉链表,阅读下面算法。
Typedef struct node {
DataType data;
Struct node *next;
}ListNode;
ListNode *Leafhead=NULL;
Void Inorder(BinTree T)
{ LinkNode *s;
if (T) {
Inorder(T->lchild);
if ((!T->lchild)&&(!T->rchild)) {
s=(ListNode *)malloc(sizeof(ListNode));
s->data=T->data;
s->next=Leafhead;
Leafhead=s;
}
Inorder(T->rchild);
}
}
对于如下所示的二叉树

(1) 画出执行上述算法后所建立的结构;
(2) 说明该算法的功能。
六、(10分)已知A、B 和C为三个递增有序的线性表,现要求编写算法对A表作如下运算:删去那些既在B表中出现又在C表中出现的结点。
七、(10分)已知一棵二叉树的前序遍历序列和中序遍历序列,写出可以唯一确定一棵二叉树的算法。
八、(10分)设有一个关键字取值范围为正整数的散列表,值 –1表示空表项,用开放定址法解决冲突。现有两种删除策略:一是将待删表项的关键字置为 –1;二是将探查序列上的关键字顺序递补,即用探查序列上下一个关键字覆盖待删关键字,后面的依次递补,并将原序列上最后一个关键字置为 –1。这两种方法是否可行?为什么?给出一种可行的方法,并叙述它对查找和插入算法所产生的影响。
信息工程大学硕士研究生《数据结构》试卷答案
一.单项选择题(2*15=30分)
1C 2C 3B 4C 5D 6C 7B 8D 9C 10D 11C 12D 13B 14D 15B
二.判断题(1*10=10分)
1 错 2错 3错 4对 5对 6对 7错 8错 9错 10对
三.填空题(1*10=10分)
1:n(n-1)/2; 2:69 ; 3: 回路 ; 4: 0 ;
5:p->next->next; 6:11 ; 7: a5,6 ; 8: 384 ;
9:堆排序和希尔排序; 10: 2次。
四.解答题(3*4=12分)
1.

2.
设:A=(z);
B=(x,y);
C=((z),(x,y));
D=((x,y),x)=(B,x)
3.
APL=(1*1+2*2+3*3+4*3+5*2+6*1)/12=42/12=3.5
4. 活动 a1 a2 a3 a4 a5 a6 a7 a8
e 0 0 6 4 7 7 16 14
l 0 2 6 6 7 7 16 14
l-e 0 2 0 2 0 0 0 0
工程完成的最短时间是18;
关键活动是:a1,a3,a5,a6,a7,a8。
五.算法阅读题(2*4=8分)
1. (1) s1=s1->next
(2) s2=s2->next
(3) s2
(4) s1
(5) return 0
2. (1)
(2)用头插法建立二叉树叶结点的单链表。
六.(10分)
void DELETE(A,B,C)
sequenlist A,*B,*C;
{int i,j,k,v;
i=0;
While (i<=(*A).last)
{ j=0;
While ((j<=(*B).last)&&((*B).data[j]<(*A).data[i]))
j++;
if ((j<=(*B).last)&&((*B).data[j]==(*A).data[i]))
{ k=0;
While ((k<=(*C).last)&&((*C).data[k]<(*A).data[i]))
k++;
if ((k<=(*C).last)&&((*C).data[k]==(*A).data[i]))
{ for(v=i;v<(*A).last;v++)
(*A).data[v]=(*A).data[v+1];
(*A).last--;
}
}
i++;
}
七.(10分)
typedef struct {
int lchild,rchild;
char ch;
}node;
void QDECS(A,B,n)
char A[ ];
node B[ ];
int n;
{seqstack s;
int i,j,t;
s.top=-1;
for(i=0;i<n;i++)
{ j=0;
while (B[j].ch!=A[i])
j++;
if (s.top==-1)
{ s.top++;
s.data[s.top]=j;
}
else if (j<s.data[s.top])
{ B[s.data[s.top]].lchild=j;
s.top++;
s.data[s.top]=j;
}
else
{ while((j>s.data[s.top])&&(s.top!=-1))
t=s.data[s.top--];
B[t].rchild=j;
s.data[++s.top]=j;
}
}
}
八.(10分)
答:两种策略都不行。前者切断了探查链,后者可能移动了非同义词。
一种可行的做法是将待删表项的关键字置为0,以区别空表项。
查找时若遇到0,则继续往下找,直到找到或遇到-1为止。
插入时若遇到0,则即可插入。
发表于 @ 2006年12月04日 22:04:00|评论(loading...)|编辑