2015年厦门大学903数据结构真题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2015年厦门大学招收硕士研究生入学考试试题参考
答案
(考生注意:全部答案必须写在答题纸上否则后果自负!)
考试科目代码:903 考试科目:数据结构B
【一】选择
1、B(线性结构是一对一,树形结构一对多,网状结构是多对多)
2、A(顺序是B>A>D>C)
3、C(即每次插入
在最后,比较次数为n 次)
4、C
5、D(要求一个带尾指针的循环链表,才能模拟锁定队列头部和尾部,尾指针指向队头,队头指针指向链表第一个结点即队尾)
6、C
7、D((1001+1)/2 再向下取整,为501;)
8、A(26-1=63)
9、A(一共5 个结点,(*,/,+,A,B)和6 条边)
10、D
【二】填空
1、n2
2、n+1-i;
3、(Q.rear+1)%MAXSIZE=Q.front;(判断队满队空的表达式要
记牢,代码题如果考队列基本要写到);
4、填123AAA/7 ;函数用法:replace(s1,s2,s3)表示把s1 中的s2字符替换成s3;substr用来返回一个从指定位置开始的指定长度的字符串,concat用于连接两个字符串,index用来找出参数S字符串第一次出现字符’a’的位
置;index(s2,’a’)=1,length(s2)=4; concat(...)返回‘AAA/’(15级大部分考生都说没有做出这道题,包括我= =!)5、(h)步骤:((g,h))->(g,h)->(h); 6、WPL=7*4+19*2+2*5+6*4+32*2+5*3+21*2+10*4=261
7、DBEAC(很重要基础题,每年几乎都考)
8、3.最左边的点是一个,最右边的点是另一个,中间4个点是一个,一共3个。
强连通分量的定义是:当a,b两个点满足a能走到 b && b 能走到a就说明a b属于同一个强连通分量。
9、Kruscal。(复试的时候有人抽到一题是描述Kruscal 的算法过程,Prim算法一样重要。)
10、54(f(1) = 1,f(2) = 2, f(n) = f(n-1)+f(n-2)+1);
【三】简答题堆排序用的数据结构表面是一棵二叉树,实际存储用的是线性数组,数据结构如:
#define max 100
Int heap[max];
这样对二叉树的操作,只需每个节点标号,任何一个节点左子树节点位2i,右子树节点为2i+1;线性表的操作节省大量时间,只要知道预定的节点数目,也不会浪费太多空间。
【四】应用题
1、略
2、27
1264
9163972
ASL = (1*1+2*2+4*3)/7=17/7
3、(1)ABCEGDF
(2)
(3)ve(c)= 7; l(FC)=7
4、考试时这道题做满了一整页,题目没有难度,比较花时间。细心排出每趟状态。
(1){12,19,10,47,58,30,51,25}
{12,19,10,47,25,30,51,58}
{10,12,19,25,30,47,51,58}
(2){30,19,25,47,58,12,51,10}
{10,19,25,12,30,58,51,47}
{10,19,25,12,30,47,51,58}
{10,12,19,25,30,47,51,58}
(3){58,47,51,30,19,12,25,10}
{51,47,25,30,19,12,10,58}
{47,30,25,10,19,12,51,58}
{30,19,25,10,12,47,51,58}
{25,19,12,10,30,47,51,58}
{19,10,12,25,30,47,51,58}
{10,12,19,25,30,47,51,48}
(4){30,10,51,12,25,47,58,19}
{10,12,19,25,30,47,51,58}
【五】程序设计题
1、寻找N 个数中最大的K 个数,本质上就是寻找最大的K 个数中最小的那个,也就是第K大的数。可以使用二分搜索的策略来寻找N个数中的第K大的数。
用数组a[max]作为存储数据结构,在数组a中查找。
算法代码如下:
//快速排序的划分函数
int partition(int a[],int l,int r)
{
int i,j,x,temp;
i = l;
j = r+1;
x = a[l];
//将>=x 的元素换到左边区域
//将<=x 的元素换到右边区域
while (1)
{
while(a[++i] > x);
while(a[--j] < x);
if(i >= j) break;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
a[l] = a[j]; a[j] = x; return j;
}
//随机划分函数
int random_partition(int a[],int l,int r)
{
int i = l+rand()%(r-l+1);//生产随机数int temp = a[i];
a[i] = a[l]; a[l] = temp;
return partition(a,l,r);//调用划分函数}
//线性寻找第k 大的数
int random_select(int a[],int l,int r,int k)
{
int i,j;
if (l == r) //递归结束