同济大学1999年硕士研究生入学考试C语言与数据结构专业试题

一、阅读下面的程序并写出程序执行结果:
1、#defineP(x)printf(“%5”,x)
char*c[]={“Youcanmakestatement”,“forthetopic”,“Thesentences”,“Howabout”};
char**p[]={c 3,c 2,c 1,c};
char***pp=p;
voidmain(void)
{p(**  pp);
p(*--*  pp  3);
p(*pp[-2] 3);
p(pp[-1][-1] 3);
}
2、voidmain(void)
{char*s,*s1=“hereis”;
char*s2=“key”;
s=s1;
while(*s1)
s1  ;
while(*s1  =*s2  );
s2=s;
while(*s2)
s2  ;
printf(“%d”,s2-s);
}
3、main()
{intx,y,z,w;
z=(x=1)?(y=1,y =x 5)x=7,y=3);
w=y*'a'/4;
printf(“%d%d%d%c\n”,x,y,z,w);
}
4、#definePprintf
#defineC2“%c”“%c”“\n”
#defineS2“%s”“%s”“\n”
main()
{staticstructs{
charc[5];
char*s;
}s1={“cake”,“milk”};
staticstructt{
char*str;
structs,ss1;
}s2={“work”,{“lime”,“free”}};
P(C2,s1,c[0],*s1.s);
P(S2,s1,c,s1.s);
P(S2,s2,str,s2.ss1.s)
P(S2,  s2,str,s2.ss1.s 2);
}
二、有一个班,有三个学生,各学三门课,下面的程序用来输出第n个学生的成绩,请改正其中的错误。
main()
{floatscore[3,3]={{65,67,69},{80,86,84},{50,90,76}}
search(*score,2);
}
voidsearch(*p,n);
float*p[3];
intn;
{printf{“thescoreofNO.隍e:\n”,n};
for(i=0;i<3;i  )
printf(“%6.2f”,*(p n-1) i);
}
三、程序填空:以下程序用于统计字符串中最长单词的长度和在字符串中的位置,其中单词全由字母组成。
Intalph(c)
Charc;
{if((c>=’a’&&c<=’z’)||(c>=’A’&&c<=’Z’))   else   }
main()
{staticcharstring[]={“Iamhappy”};
intlen=0,i,length=0,flag=1,p;
for(i=0;------------;i  )
if(alph(string))
if(flag)
{p=i;   len  ;
}
else
{flag=1;
if(len>length)
length=len;   }
printf(“%d%d”,length,p);
}
四、编程题:
试采用递归函数实现将任意位数的整数转换成字符串输出,要求在主函数中输入整数并调用递归函数实现转换并输出结果,对于负数也能处理。   (数据结构部分)
1、简述数据结构的四种基本关系并作出它们的关系图
2、利用广义表的HEAD和TAIL运算把原子student从下列广义表中分离出来
(1)L1=(soldier,teacher,student,work,farmer);
(2)L2=(soldier,(teacher,student),(worker,farmer));
3、已知一棵树边的结合为{(I,M),(I,N),(E,I),(B,E),(B,D),(C,B),(G,J),(G,K),(A,G),(A,F),(H,L),(A,H),(C,A)},试画出这棵树,并回答下列问题:
(1)哪个是根节点?
(2)哪些是叶子节点?
(3)树的深度是多少?
4、已知一个大小为512字的内存,假设先后有6个用户提出大小分别为23、45、52、100、11、和19的分配请求,以后大小为45、52和11的占用块顺序释放。假设以伙伴系统实现动态存储管理,
(1)请写出可利用空间表的初始状态;
(2)请写出6个用户进入之后,每个用户所分配的存储块的存储块的大小和起始地址,
并写出空闲块的大小和起始地址;
(4)请写出在回收三个用户释放的存储块之后,空闲块的大小和起始地址
5、试推导出含12个节点的平衡二叉树的最大深度,并画出一棵这样的树。
6、已知Ackerman函数的定义如下:
n 1ifm=0;   
akm(m-1,1)ifm≠0,n=0;
akm(m,n)=   
akm(m-1,akm(mk,n-1))ifm≠0,n≠0   
(1)写出递归算法;
(2)写出非递归算法;
7、对于k-路归并时的并行操作问题
(1)输入和输出操作具有怎样的行为时排序效率最高?
(2)举一个简单的例子说明仅有2k个输入缓冲区时不能满足(1)的要求;
(3)举一个简单的例子说明有2k个输入缓冲区可用,但平均分配时也不能满足(1)的要求。