北航2011年硕士研究生入学考试数据结构与C语言试题与答案.docx
《北航2011年硕士研究生入学考试数据结构与C语言试题与答案.docx》由会员分享,可在线阅读,更多相关《北航2011年硕士研究生入学考试数据结构与C语言试题与答案.docx(10页珍藏版)》请在冰豆网上搜索。
![北航2011年硕士研究生入学考试数据结构与C语言试题与答案.docx](https://file1.bdocx.com/fileroot1/2022-10/22/b0d47a9f-7306-4d7a-9043-7d1ffc242249/b0d47a9f-7306-4d7a-9043-7d1ffc2422491.gif)
2011年硕士研究生入学考试
“数据结构与C语言程序设计”(科目代码:
991)试题与答案
一、单项选择题(本题共20分,每小题各2分)
1.下列关于线性表的存储结构的叙述中,错误的是。
A.线性表的顺序存储结构中隐式地存储了数据元素之间的逻辑关系
B.线性表的顺序存储结构一定需要占用一片地址连续的存储空间
C.线性表的链式存储结构通过指针来反映数据元素之间的逻辑关系
D.线性表的链式存储结构占用的存储空间一定不连续
2.若front和rear分别表示链接队列的队头指针与队尾指针,则向队列中插入一个由p
指的新元素的过程是依次执行。
A.rear=p;front=p;B.front=p;rear=p;
C.rear->link=p;rear=p;D.front->link=p;rear=p;
3.下列关于二叉树的叙述中,正确的是。
A.二叉树的度可以小于2B.二叉树的度等于2
C.二叉树中至少有一个结点的度为2D.二叉树中每一个结点的度都为2
4.若某二叉树有40个叶结点,则该二叉树的结点总数最少是。
A.78B.79C.80D.81
5.若采用邻接矩阵存储一个有向图,且邻接矩阵主对角线以下元素均为0,则该有向
图的拓扑序列。
A.存在且惟一B.存在但可能不惟一
C.不存在D.无法确定
6.下面关于AOE网的叙述中,正确的是。
A.AOE网是一个带权的连通图
B.AOE网是一个带权的强连通图
C.AOE网是一个带权的无回路的连通图
D.AOE网是一个带权且无回路的有向图
7.下列关于线性表查找方法的叙述中,错误的是。
A.顺序查找法适合于采用顺序存储结构和链式存储结构的线性表的查找
B.对于相同元素,顺序查找法一定能够查找到表中首次出现的元素
C.对于相同元素,折半查找法一定能够查找到表中首次出现的元素
D.对于相同元素,折半查找法不一定能够查找到表中首次出现的元素
8.在二叉排序树中进行查找的平均时间效率主要与下列因素之一有关,该因素是。
A.二叉排序树的深度B.二叉排序树中结点的个数的多少
C.被查找结点的度D.二叉排序树的存储结构
9.下列4种排序方法中,每一趟排序结束时不一定能够确定一个元素排序最终位置的
是。
A.插入排序B.快速排序
C.堆积(Heap)排序D.二路归并排序
2
10.下列4种排序方法中,当待排序的序列中元素初始时已经按值有序,排序所花费的
时间反而有可能最多的是。
A.泡排序B.谢尔(Shell)排序
C.快速排序D.堆积(Heap)排序
二、简答题(本题共20分,每小题各5分)
1.等概率情况下,在长度为n的顺序表中插入和删除一个数据元素分别需要平均移动
多少个元素?
移动的元素个数主要取决于哪几个因素?
2.在采用循环单链表作为某队列的存储结构时,可以只设置一个队头指针,也可以只
设置一个队尾指针。
请问:
从操作的时间效率考虑,采用哪种方案更合适?
为什么?
3.对于具有n个顶点、e条边的稀疏图和稠密图,就空间性能而言,采用邻接矩阵存
储方法和邻接表存储方法哪一种更合适?
为什么?
4.什么是小顶堆积(Heap)?
在小顶堆积中,值最大的元素可能处在什么位置?
(可以
借助一棵二叉树描述)
三、综合题(本题共20分,每小题各5分)
1.下列算法的功能是删除长度为n的顺序表A中重复出现的多余元素,即对于重复出
现的元素,表中只保留一个。
请在算法的空白处填上必要的内容,使算法完整。
voidPURGE(ElemTypeA[],int&n)
{inti=0,j,k;
while(ij=i+1;/*从第i+1个元素开始逐个与第i个元素比较*/
while(jif(A[j]==A[i]){/*若A[j]与A[i]相同,删除A[j]*/
for(①)
A[k-1]=A[k];
n--;/*修改表的长度*/
}else
②
③
}
}
2.请将由题三2图给定的树转换为一棵二叉树。
(只须画出转换后的二叉树)
题三2图
3.已知某3阶B-树如题三3图所示,请画出在
该B-树中插入关键字20以后得到的B-树。
题三3图
60
305070
15253545556575
A
BCD
EFGHIJ
3
4.请分别写出对数据元素序列(49,38,65,97,76,13,27,49¢)按从小到大进行谢尔(Shell)排
序时每一趟的结果。
设排序的间隔数(也称为增量)依次为4,2,1。
四、算法设计题(本题15分)
已知某哈夫曼树采用二叉链表存储,结点构造为lchilddatarchild,其中,叶
结点的data域中已经存放了该叶结点对应的权值。
请写一非递归算法,该算法的功能是计算
根结点指针为T的哈夫曼树的带权路径长度(WPL)。
要求:
1.用文字简要给出算法的基本思想;(5分)
2.根据算法的基本思想写出相应算法。
(10分)
五、程序阅读题(本题共20分,每小题各2分)
1.下列程序的输出结果是。
main()
{
charch=‘A’;
printf(“ch
(1)=%d,ch
(2)=%c\n”,ch,ch+1);
}
2.下列程序段的输出结果是。
k=1;t=3;
do{
t+=k++;
if(t%7==0)
continue;
else
++k;
}while(t<15);
printf(“%d”,k);
3.下列程序的输出结果是。
#include
main()
{ints[12]={1,2,3,4,4,3,2,1,1,1,2,3},a[5]={0},i;
for(i=0;i<12;i++)
a[s[i]]++;
for(i=1;i<5;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
4.下列程序的输出结果是。
#include
main()
{charstr1[15]=“good”,str2[10]=“morning”;
printf(“%d\n”,strlen(strcat(str1,str2)));
}
5.下列程序的输出结果是。
main()
4
{inta[5]={1,2,3,4,5},*p;
p=a;
printf(“%d\n”,*(++p));
}
6.下列程序的输出结果是。
main()
{char*s=“13579”;
s++;
printf(“%c%c%c”,*s,*(s+1),*s+1);
}
7.下列程序的输出结果是。
#defineMAX(A,B)(A)>(B)?
(A):
(B)
#definePRINT(Y)printf(“Y=%d\t”,Y)
main()
{inta=1,b=2,c=3,d=4,temp;
temp=MAX(a+b,c+d);
PRINT(temp);
}
8.下列程序的输出结果是。
intfun(intx,inty)
{return(x+y);}
main()
{
inta=2,b=5,c=8;
printf(“%d\n”,fun(fun(a+c,b),a-c));
}
9.下列程序的输出结果是。
#include
main()
{
structdate{
intyear,month,day;
}today;
printf(“%d\n”,sizeof(structdate));
}
10.执行下列程序后,文件file2.txt中的内容是。
#include
main()
{FILE*in,*out;
char*str1=“YOUPLANTOFAIL.”;
char*str2=“IFYOUFAILTOPLAN.”;
if((in=fopen(“file1.txt”,“w”))!
=NULL)
while(*str1!
=‘.’)
fputc(*str1++,in);
fclose(in);
if(((in=fopen(“file1.txt”,“r”))!
=NULL)&&
((out=fopen(“file2.txt”,“w”)!
=NULL)){
while(!
eof(in)){
fgetc(in);
5
fputc(*str2++,out);
}
}
fclose(in);
fclose(out);
}
六、填空题(本题共20分,每小题各4分)
1.对于下列程序,为了使输出结果为t=4,输入量x和y应该满足的条件是。
main()
{intx,y,s=1,t=1;
scanf(“%d,%d”,&x,&y);
if(x>0)
s=s+1;
if(x>y)
t=s+t;
elseif(x==y)
t=5;
else
t=2*s;
printf(“t=%d”,t);
}
2.若已有下列定义,则表达式p->b/n.a的值是①,表达式p->b/n.a*++p->b的值是
②,表达式(*p).a+p->c的值是③。
structnum{
inta;
intb;
floatc;
}n={1,3,5.0};
structnum*p=&n;
3.下列程序段的功能是计算1000!
的末尾含有多少个零。
请在程序段的空白处填上必
要的内容,使程序段完整。
(提示:
只要计算出1000!
中含有因数5的个数即可)
for(k=0,i=5;i<=1000;i+=5){
m=i;
while(){
k++;
m=m/5;
}
}
4.下列程序的功能是通过指针操作,找出并输出三个整数中的最小者。
请在程序的空白
处填上必要的内容,使程序完整。
#include
main()
{
int*a,*b,*c,num,x,y,z;
a=&x;
b=&y;
c=&z;
printf(“Inputa,b,c:
”);
6
scanf(“%d%d%d”,a,b,c);
printf(“%d,%d,%d\n”,*a,*b,*c);
num=*a;
if(*a>*b)
①;
if(num>*c)
②;
printf(“Theminimun=%d\n”,num);
}
5.下列程序的功能是先由用户通过键盘输入一个文件名,然后向此文件输入一串字符
(假设输入以字符“#”结束),最后再将当前日期写到文件的尾部。
请在程序的空白处填上
必要的内容,使程序完整。
#include
main()
{
charch,date[20],fname[30];
FILE*fp;
printf(“Inputthefilename:
”);
scanf(“%s”,fname);
if((fp=fopen(①))==NULL){
printf(“Cannotopenfile%s!
\n”,fname);
exit(0);
}
printf(“Inputastring:
\n”);
while((ch=getchar())!
=‘#’)
fputc(②);
printf(“Enterdate:
\n”);
scanf(“%s”,date);
fprintf(③);
fclose(fp);
}
七、程序设计题(本题15分)
请编写一C语言程序