东南大学1996数据结构试题
试题编号:451
试题名称:数据结构
一:回答下列问题(共46分)
1.线性表(a(1),a(2),……a(n))用顺序映射表示时,a(i)与a(i+1)(1<=i<n)的物理位置相邻吗?链接表示时呢?(5分)
答:用顺序映射表示时,a(i)与a(i+1)(1<=i<n)的物理位置相邻。
链接表示时一般不相邻。
(线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
线性表的这种机内表示乘坐线性表的顺序结构或顺序映像,通常称这种存储结构的线性表为顺序表线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素)
2.一棵前序序列为1,2,3,4的二叉树,其中序序列可能是4,1,2,3吗?设一棵二叉树的前序序列为1,2,3,4,5,6,7,8,9,其中序序列为2,3,1,5,4,7,8,6,9,试画出该二叉树.(7分)
答:(1)不可能。
因为,若中序序列是4,1,2,3,则4是根1的左子树,2,3是根1的右子树,在前序序列中4必须出现在2,3的前面,这与给定的前序序列不符。
(2)
3.在模式匹配KMP(Knuth,Morris and Pratt)算法中所用失败函数f的定义中,为什么要求p(1)p(2)……p(f(j))为p(1)p(2)……p(j)两头匹配的真子串?且为最大真子串?(7分)
答:为了滑动尽可能远的距离,比较最小的次数。
主串的第j个字符前边f(j)个字符与模式串的头f(j)个字符匹配,只需从模式串的f(j)+1个字符开始比较即可。
即将模式串向右滑动j- f(j)个位置开始比较。
取最大真子串可以保证滑动尽可能远的距离,比较最小的次数。
4.在union-find问题中,控制union操作的权重(weighting)规则是何含义, 有何效果?控制find 操作的倒塌(collapsing)规则是何含义,有何效果?(7分)
5.堆排序(heap sort)是稳定排序吗?举例说明.(6分)
答:不是稳定排序。
如1,4,4*,调整为大顶堆,变为4,1,4*,然后根与最后一个交换,变为4*,1,(4),再排序4*,1,最终得到1,4*,4的顺序,4和4*的位置发生了变化,排序不稳定。
6.给定输入文件:101,48,19,65,3,74,33,17,21,20,99,53,24,并设记录缓冲区个数k=4,写出基于败路过··走过···需要的时候记得回来看看····因为容易得到所以得不到大家的珍惜·即使这样我们也要
路过··走过···需要的时候记得回来看看····因为容易得到所以得不到大家的珍惜·即使这样我们也要者树的外排序顺串生成算法runs 输出的顺串.(6分)
7.m 阶B 树中,m 大小的确定与什么因素有关?(8分)
与关键字的个数n 有关,深度(层数)不要太大,m 太大也没有很大意义。
二:
设结点结构为:| data | link |,试用一个全局指针p 和某种链接结构实现一个队列,画出示意图,并给出入队和出队deleteq 过程,要求它们的时间复杂性都是O(1)(不计new 和dispose 时间).(10分)
答:指针p 指向链表的尾结点,即可实现队列,从链表头部出队,从链表尾部入队。
typedef struct QNode{
ElemType data;
struct QNode *link;
} QNode, *QueuePtr;
QueuePtr Q, p;
int EnQueue(ElemType e){
QNode *r = (QueuePtr)malloc(sizeof(QNode ));//新结点
If(!r) return 0;
r->data=e; r->link=NULL;
p->link=r;
p=r;
return 1;
}
intDeleteQueue(ElemType e){
If(Q->link ==p) return -1;
QNode *r=Q->link;
e=r->data;
Q->link = r->link;
If(p==r) p= Q->link;
Free(r);
return 1;
} 三:
设有向图G 有n 个点(用1,2,……n 表示),e 条边,写一算法根据G 的邻接表生成反向邻接表,要求时间复杂性为O(n+e).(13分)
void NAdjList (ALGraph G, AdjList verticesB){
int v,w;
ArcNode *p,*q,*r;
//初始化逆邻接表
for(v=0;v<G.vexnum;v++) {
…
verticesB[v].data=G.vertices[v].data;
verticesB[v].firstarc=NULL;
}
//生成各个顶点的链表
for(v=0;v<G.vexnum;v++){
for(p=G.vertices[v].firstarc; p; p=p->nextarc){
w= p->adjvex;
//新建结点q
q=(ArcNode*)malloc(sizeof(ArcNode));
q->adjvex=v;
//头插法建立链表:
q->nextarc= verticesB[w].firstarc;
verticesB[w].firstarc=q;
}
}
}
四:
设二叉树结点结构为:| left | data | bf | right |,定义二叉树结点T的平衡因子bf(T)=h(左)-h(右),写一递归算法确定二叉树tree中所有节点的平衡因子bf,同时返回二叉树tree中非叶结点个数.(15分)
int count0=0; //非叶结点个数
int h_bf(BSTree &T){
int hl,hr;
If(T==Null) return 0;
If(T->lchild==NULL && T->rchild==NULL){ T->bf =0; return 1;} //叶子
hl= h_bf (T->lchild); //左子树高度
hr= h_bf (T->rchild); //右子树高度
T->bf=hl-hr;
count0++;
//printf(“data=%c (%d)”, T->data, T->bf);
return (hl>hr) ? hl+1 : hr+1; //树高
}
五:
设符号表T中的标识符x满足1<=x<=m,且n为对T表的最大插入次数.设计符号表T的表示结构,允许使用O(m+n)空间,并写出T的初始化(init),查找(search),插入(insert)和删除(delete)算法,要求它们的时间复杂性都是O(1).(16分)
#define n 100
typedef int ElemType;
Typedef struct {
ElemType x[n];
int num; //当前数量
}T
Init(T &t){
路过··走过···需要的时候记得回来看看····因为容易得到所以得不到大家的珍惜·即使这样我们也要
For(int i=0;i<n;i++) t.x[i]=0;
t.num=0;
}
Int Search(T t, ElemType x){
If(x<1 || x>m) return -2; //数据不合法
int i;
for(i=0; i<num; i++){
if(t.x[i]==x) break;
}
if(i<num) return i;
return -1; //未找到
}
int Insert(T t, ElemType x){
if(t.num==n) return -3;//表已满
int i=search(t,x);
if(i==-2) return -2;//数据不合法
if(i==-1){
for(i=t.num-1;i>=0;i--){
if(x<t.x[i]) t.x[i+1]=t.x[i];
else break;
}
t.x[i+1]=x; t.num++;
return i+1; //返回插入位置
}
return -1; //数据已存在
}
路过··走过···需要的时候记得回来看看····因为容易得到所以得不到大家的珍惜·即使这样我们也要。