2015年厦门大学903数据结构真题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) //递归结束

相关文档
最新文档