2007年攻读硕士学位研究生试题
东北大学
考试科目:C语言程序设计与数据结构
《C语言程序设计》部分(共75分)
一、写出下列程序的运行结果(答案写在答卷上,共20分,每小题5分)
1.
int f(int *a)
{
return(*a)++;
}
void main()
{
int a=2;
int s=0;
{
int a=5;
s+=f(&a);
}
s+=f(&a);
printf(“%d\n”,s);
}
2
void f(int y,int *x)
{
y=y+*x; *x=*x+y;
}
void main()
{
int x=2,y=4;
f(y,&x);
printf(“%d %d\n”,x,y);
}
3
void f(int a[],int i,int j)
{
int t;
If(i
{
t=a[i];a[i]=a[j];a[j]=t;
f(a,i+1,j-1);
}
}
void main()
{
int i,a[5]={1,2,3,4,5}; f(a,0,4);
for(i=0;i<5;i++);
printf(“%d,”,a[i]);
printf(“\n”);
}
4.
void main()
{
Char*p[2][3]={“Hello”,”world”,”student”,”computer”,”end”,”the”};
printf(“%c\n”,***(p+1));
printf(“%c\n”,**p[0]);
printf(“%c\n”,(*(*(p+1)+1))[2]);
printf(“%c\n”,*(p[1][2]+1));
printf(“%s\n”,**(p+1));
}
二、回答下列问题(答案写在答卷上,共20分,每小题5分)
1. 下面结构声明中是否有语法错误?如果有错误,请改正过来;
struct a{
int x;
char y;
struct a z;
struct a *p;
};
2. 下面程序中是否存在错误?如果有错误,请改正过来;
void setmemory(char **p,int num)
{
*p=(char *)malloc(num);
}
void main()
{
char *str;
setmemory(&str,100);
strcpy(str,”hello”);
printf(“%s”,str);
}
3.下面程序的功能是求两个整数中较大者,并输出结果。程序设计中是否存在错误?如果
有错误,请改正过来;
void big(int x,int y,int z)
{
z=x>y?x:y;
}
void main()
{
int a,b,c;
scanf(“%d,%d”,&a,&b);
big(a,b,c);
pirntf(“%d”,c);
}
3. 下面程序中是否存在错误?如果有错误,请改正过来:
void main()
{
char str[]=”Hello world!”;
for(;*str!=’\0’;str++)
printf(“%c”,*str);
}
三、(17分)设有一个已排序的英文词典文件,每一个词条的格式为:
词语/词性/例句
例如:book/n./This is abook.
student/n./I am a student.
……
试编写一个程序,根据二分查找的原理,在文件中查找指定的单词的词条,并输出词条信息。
四、(18分)n个人围成一圈,从第1个人开始计数,凡是数到1、2、4、8…2k … 的人退
出圈子。试编写一个程序,输出这n个人退出圈子的顺序。要求使用链表结构实现。
《数据结构》部分(共75分)
一、请简要回答下列问题(25分,请将答案写在答题纸上):
1.(6分)内存中一片地址从1到m连续空间,提供给两个栈S1和S2使用,怎样分配这两个栈,才能充分利用这部分存储空间.请画出分配结构示意图,并写出判别栈空和栈满的条件。
2.(4分)有向图的拓扑排序能否用图的深度优先搜索算法来实现?若能,请简述方法,若不能,请简述原因。
3.(5分)判别以下序列是否是堆,如果不是,则把它调整为堆。(12,70,33,65,24,56,48,92,86,33)
4.(10分)设有向图G=
E={
(1)邻接矩阵 (2)逆邻接表 (3)十字链表
二、(15分)设有n个结点的平衡二叉树的每个结点都标明了平衡因子b,设计结点存储结构,并编写求平衡二叉树的高度的算法(要求算法的时间复杂度为O(log2(n))。
三、(20分)设有向图G有n结点(用1,2,……n表示),e条边,给出邻接表的结点结构,编写算法建立G的邻接表,并根据G的邻接表生成G的逆邻接表。
四、(15分)编写将两个二叉排序树合并为一个二叉排序树的算法。(假设两个二叉排序树中没有重复关键字。要求用最少的时间和辅助空间)