天津大学研究生院2004年招收硕士生入学试题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

天津大学研究生院2004年招收硕士生入学试题
考试科目:数据结构和程序设计题号:465
数据结构部分
数据结构答卷须知:算法设计题要求用以下表达工具:结构化框图,盒图(N-S图),结构化汉语,C语言或C++语言之一进行描述。

1.(5分)试述线性表逻辑结构的形式化定义。

2.(6分)(1)已知一棵二叉树的中序遍历的结果是EBCDAFHIGJ,后序遍历的结果是EDCBIHJGFA,试画出这棵二叉树。

(2)已知一棵二叉树的先序遍历的结果是ABECDFGHIJ,中序遍历的结果是EBCDAFHIGJ,试画出这棵二叉树。

3.(6分)试对右图所示的AOE玩个,确定关键路径。

4.(8分)(1)试述二叉排序树的定义。

(2)设有一个输入数据的序列是{46,25,78,62,12,37,70,29},试从空树画起,逐个画出输入每个数据而生成的二叉排序树。

5.(8分)试给出下列表达式的前缀,中缀和后缀表示式
6.(10分)(1)试给出图的定义。

(2)试给出右图的邻接矩阵、邻接表(包括:出边表和入边表)的存储表示。

7.(10分)设计算法:将新值x以结点的形式,插入到已知不带头结点的单链表L上。

要求插到第一个与给定值(k)相匹配的结点的直接前驱位置上。

若找不到与k相匹配的结点,则将x插入到链表的末尾。

其结点结构如图所示
8.(10分)在已知二叉树(P)上,试使用递归算法求出结点上的数据值(data)与已知值(k)相等的节点个数(N)。

结点结构为:
9.(12分)试对有m行n列的已经赋过值随机的二维数据(A)进行不降序排列,要求:
1)声明所使用的排序方法。

2)用行主次序,即
经排序后
满足:
并且要求空间的复杂度最小。

程序设计部分
一、程序填空(每空1分,共10分)
1 下面程序使用栈实现表达式的括号匹配,其中5个语句缺失。

请阅读此算法并把缺失的语句补上。

const int MaxLength=100; //最大的字符串长度
void PrintMatchedPairs(char *expr)
{ //括号匹配
Stack<int> s(MaxLength);
int j, length =strlen(expr);
//从表达式expr中搜索(和)
for (ini i=1;__________;i++) {
if(expr[i-1]==’(‘) s.Add(l);
else if(____________)
try{ s.Delete(j);
cout<<j<<’’<<i<<endl; }
catch(OutOfBounds)
{ cout<<”No match for right parenthesis”<<” at “<<i<<endl;}
}
//堆栈中所剩下的(都是未匹配的
while(__________){
___________________________
cout<<”No match for left parenthesis at “<<j<<endl;}
}
void main(void)
{
char expr[MaxLength];
cout<<”Type an expression of length at most “<<MaxLength<<endl;
cin.getline(expr,MaxLength);
cout<<”The pairs of matching parentheses in”<<endl;
_________________
cout<<”are”<<endl;
PrintMatcnedPairs(expr);
}
2 下面程序对栈进行了基本操作,其中5个语句缺失,请阅读此算法并把缺失的语句补上。

Stack::Link::Link(void* dat,Link* nxt) {
data * dat; next * nxr;
}
Stacld::Link::~Link() {
delete data;
}
Stack: :Stack() { head=0; }
void Stack::push(void* dat) {
head =_________________;
}
void* Stack::peek { return head->data;}
void* Stack: :pop(){
if(_____________) return 0;
void* result= head->data;
Link* oldHead =head;
________________________
delete oldHead;
return result;
}
Stack::~Stack(){
Link *cursor=head;
while(________________){
cursor=_____________
delete head;
head=cursor;
}
head=0; //Officially empty
}
二、阅读程序并写出结果(共40分)
1 (5分)
#include <iostream.h>
int a=10;
void f() {cout<<-a;}
struct S {
int a; void f();
}
void S::f(){
a=20;
::f();
::a++;
a--;
cout<<a;
}
int main(){ S s;f(); }
2 (6分)
#includc <iostream.h>
class Tree {int height;
public:
Tree(int initialHeight);
~Tree();
void grow(int years);
void printsize();
};
Tree::Tree(int initialHeight){
height=initialHeight;
}
Tree::~Tree(){
cout<<”inside Tree destructor”<<endl; printsize();
}
void Tree::grow(int years){
height+=years;
}
void Tree::printsize(){
cout<<”Tree height is”<<height<<endl; }
int main(){
cout<<”before opening brace”<<endl;
{
Tree t(12);
cout<<”after Tree creation”<<endl;
t.printsize();
t.grow(4);
cout<<”before closing brace”<<endl;
}
cout<<”after closing brace”<<endl;
}
3 (6分)
#include<iostream.h>
class Obj{
int c;
public:
Obj(int cc):c(cc){
cout<<”Obj::Obj() for”<<c++<<endl;
}
~Obj(){
cout<<”Obj::~Obj() for”<<c--<<endl;
}
};
int c=0;
Obj a(++c);
void f(){
static Obj b(++c);
}
void g(){
static Objc(--c);
}
int main(){
cout<<”inside main()”<<endl;
f();
cout<<”leaving main()”<<endl;
}
4 (7分)
#include<iostream.h>
class AA
{ public:
AA(int i,int j)
{ A=i; B=j;
cout<<”Constructor.\n”;
}
~AA(){ cout<<”Destructor.\n”; }
void print();
private:
int A,B;
};
void AA::print()
{ cout<<A<<”,”<<B<<endl;
}
void main()
{ AA a1,a2;
a1=new AA(1,2);
a2=new AA(5,6);
a1->print();
a2->print();
delete a1;
delete a2;
}
5 (7分)
#include<iostream.h>
class A
{ public:
virtual ~A( ){cout<<”A::~A() called .\n”; } };
class B:public A
{ public:
B(int i){ buf=new char[i];}
virtual ~b():
{ delete [ ] buf:
cout<<”B::~B() called.\n”;
}
private: char *buf;
};
void fun(A *a)
{ delete a;
}
void main()
{ A *a=new B(15);
fun(a);
}
6 (9分)
#include<iostream.h>
class HowMany {
static int object count;
public:
HowMany(){
object_count++;
}
static void print(const char* msg =0) {
if(msg) cout<<msg <<”:”;
cout<< "object_count =”
<<object_count<<endl;
}
~HowMany(){
object_count--;
print(“~HowMany()”);
}
};
int HowMany::object_count=0;
HowMany f(HowMany x){
x.print(“x argument inside f()”);
return x;
}
int main(){
HowMany h;
HowMany::print(“after construction of h”);
HowMany h2=f(h);
HowMany::print(“after call for f()”);
}
三、程序设计(共25分)
1.(10分)数组越界访问是一个难发现且危险性大的事情,利用类设计一个安全一维整数型数组类,该类至少包三个构造函数:当未指明数组长度时,默认为10元素;也可以按指定元素个数来设定数组等等。

当然,在访问数组时应能进行安全判别,同时这一个类还要包含数组间赋值以及数组加运算。

最后写一个主函数来检验它们。

2.(15分)设一棵二叉树的层次遍历序列为ABDEGHJK,中序遍历序列为GDJHKBEA。

(1)写出后序遍历的结果。

(2)使用虚函数实现先序遍历。

相关文档
最新文档