数据结构C模拟卷子1讲解Word下载.docx
《数据结构C模拟卷子1讲解Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构C模拟卷子1讲解Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
j++)
S;
(n2)
(n2/2)
n(n+1)
n(n+1)/2
第1.3题.(客观单选题5分)在一个长度为N的顺序表中删除第m个元素(1<=m<=N)时,需向前移动的元素个数是:
N
m
N-m
N-m-1
第1.4题.(客观单选题5分)
存储密度是指存储空间的利用率,即用于存储数据信息的存储量与整个结构所占总存储量之比。
在下列结构中,存储密度为1的结构是:
顺序表(向量)
单链表
散列表
二叉链表
第2题.(复合题共计20分)简答题
第2.1题.(主观题5分)对规模为N的数据进行排序,各种算法的时间复杂度均是N的函数。
在已经学习的排序算法中,列举出时间复杂度分别为N2和Nlog2N的排序算法各两种,并对时间复杂度为Nlog2N的两种排序算法的空间复杂度进行比较。
插入、选择、起泡:
O(N2)
快速、二路归并排序:
O(Nlog2N)
快速排序的空间复杂度O(Nlog2N)
二路归并排序的空间复杂度O(N)
第2.2题.(主观题5分)对规模为N的数据使用二分法检索,请说明检索的时间复杂度及该算法对数据结构的要求。
二分法检索的时间复杂度O(log2N),要求数据结构是有序的顺序表。
第2.3题.(主观题5分)已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,请画图表示该二叉树,并写出它的后序遍历序列。
gdbehfca
第2.4题.(主观题5分)
一个有向带权图的邻接矩阵如下,用Floyd算法求解各顶点间最短路径,请写出能表示各顶点间最短路径的最终邻接矩阵。
并写出初始路径矩阵及求解过程的路径记录矩阵,并请说明Floyd算法的求解算法策略属于哪一类方法。
0411
602
3∞0
最终结果相阾矩阵:
046
502
370
路径矩阵:
000
111
2-12
202
001
211
算法策略:
动态规划
第3题.(复合题共计30分)算法理解
第3.1题.(主观题6分)
已知带头结点的单链表类模板定义如课本。
请说明下列算法的功能。
对于数据序列{93,100,5,102,19,21,86,27},经过下列算法处理后,得到的数据集合是什么?
template
voidLinkList:
:
process()
{
LinkNode*p=head->
next,*q;
while(p){
q=p->
next;
deletep;
p=q;
}
tail=head;
head->
next=NULL;
len=0;
清除带头结点的单链表中的数据结点。
处理结果的数据集合是空集{}
第3.2题.(主观题6分)已知顺序表类模板定义如课本。
请说明下列算法的功能是什么?
对于数据序列{93,100,5,102,19,21,86,27},分别用不同实参调用下列算法时,返回值分别是什么?
(1)实参是19
(2)实参是80
intSqList:
LocateElem(constElemType&
e)const{
ElemType*p=elem;
inti=1;
while(i<
=len&
&
*p!
=e){
p++;
i++;
if(i<
=len)returni;
return0;
在顺序表中查找实参e是否存在,如果存在,返回e所在位置,如果不存在,返回0。
(1)返回5
(2)返回0
第3.3题.(主观题6分)
已知带头结点的单链表类模板定义如课本,下列算法是其成员函数之一。
请问:
(1)调用该函数时,需要实参数据几个?
e有什么作用?
i又有什么作用?
(2)该函数的返回值有哪几种?
每种返回值都代表什么意义?
(3)对于数据序列{93,100,5,102,19,21,86,27},当实参i是6时,该函数调用后能够得到哪些信息(数据)?
分别表示什么?
当实参i是10时,该函数调用后又能够得到哪些信息(数据)?
boolLinkList:
GetElem(ElemType&
e,inti)const
1||i>
len)
returnfalse;
next;
intk=1;
while(k<
i){
p=p->
k++;
e=p->
data;
returntrue;
}
(1)调用该函数时,需要实参数据2个。
查找成功时,e用于存储数据序列中第i个数据的值。
i表示要查找的数据所在的位置。
(2)该函数的返回值有两种:
true和false,true表示查找成功,false表示查找失败。
(3)对于数据序列{93,100,5,102,19,21,86,27},当实参i是6时,该函数调用后能够得到两个信息,一个是查找成功的标志——返回值true,另一个是在数据序列的第6个位置里面的数据21。
当实参i是10时,该函数调用后只能够得到返回值false,表示查找不成功。
第3.4题.(主观题6分)
请说明一个顺序表v经过下列函数处理后,其数据排列上有何特点,并写出该结果序列。
设v={16,12,30,28,2,10,20,6,18}
template
intprocess(ElemTypev[],intlow,inthigh)
{
ElemTypepivot=v[low];
while(low<
high){
high&
v[high]>
=pivot)
high--;
v[low]=v[high];
pivot>
=v[low])
low++;
v[high]=v[low];
}
v[low]=pivot;
returnlow;
处理后v的排列为:
6,12,10,2,16,28,20,30,18。
以16为标准把数据进行一次划分,16前的元素都比16小,16后的元素比16大。
第3.5题.(主观题6分)
二叉树及队列定义如课本,请说明下列函数的功能。
voidBinaryTree:
process(void(*visit)(constElemType&
e)){
queue*>
Q;
if(m_root)
Q.push(m_root);
while(!
Q.empty()){
BTNode*p;
p=Q.front();
Q.pop();
visit(p->
data);
if(p->
lchild)
Q.push(p->
lchild);
rchild)
rchild);
按层次遍历并输出二叉树的结点
第4题.(复合题共计30分)算法设计-2001
第4.1题.(主观题10分)
栈是一种常用的数据结构,以下是顺序栈SqStack的定义。
请写出这个栈的成员函数的实现。
template<
classElemType>
//声明一个类模板
classSqStack//顺序栈类
public:
SqStack(intm);
//构造函数
~SqStack();
//析构函数
voidClear();
//清空栈
boolEmpty()const;
//判栈空
intLength()const;
//求长度
ElemType&
Top()const;
//取栈顶元素
voidPush(constElemType&
e);
//入栈
voidPop();
//出栈
private:
ElemType*m_base;
//基地址指针
intm_top;
//栈顶指针
intm_size;
//向量空间大小
};
//构造函数,分配m个结点的顺序空间,构造一个空的顺序栈
SqStack<
ElemType>
SqStack(intm)
m_top=0;
m_base=newElemType[m];
m_size=m;
//析构函数,将栈结构销毁
~SqStack()
if(m_base!
=NULL)delete[]m_base;
//清空栈
voidSqStack<
Clear()
//若栈为空,则返回true,否则返回false
boolSqStack<
Empty()const
returnm_top==0;
//求栈中元素的个数
intSqStack<
Length()const
returnm_top;
//取栈顶元素的值。
先决条件是栈不空
ElemType&
SqStack<
Top()const
returnm_base[m_top-1];
//入栈,若栈满,则先扩展空间。
插入e到栈顶
Push(constElemType&
e)
if(m_top>
=m_size){//若栈满,则扩展空间
ElemType*newbase;
newbase=newElemType[m_size+10];
//扩大10个元素空间
for(intj=0;
j<
m_top;
j++)//复制元素到新空间
newbase[j]=m_base[j];
delete[]m_base;
//释放原空间
m_base=newbase;
//重置基地址
m_size+=10;
m_base[m_top++]=e;
//出栈,弹出栈顶元素。
Pop()
m_top--;
第4.2题.(主观题10分)已知有一带头结点的单链表,请写出操作Append的实现,该操作是在单链表的最后插入一个值为e的结点。
函数原型:
voidboolLinkList<
Append(constElemType&
//在链表linkList的末尾插入新的元素e
template<
boolLinkList<
LinkNode<
*q;
q=newLinkNode<
;
q->
data=e;
tail->
next=q;
//尾部插入q结点
tail=q;
++len;
//表长增1
第4.3题.(主观题10分)
已知二叉排序树类定义如课本,下列函数向二叉排序树插入一个新结点,当结点已经存在时,不插入。
请在横线上完成算法。
//当二叉排序树m_root中不存在关键字等于key的数据元素时,插入e并返回true,
//否则返回false。
classElemType,classKeyType>
boolBST<
ElemType,KeyType>
Insert(constElemType&
e,constKeyType&
key)
BSTNode<
ElemType,KeyType>
*p,*s,*f;
if(!
_Search(key,f,p)){//查找不成功,f是查找路径上的最后结点
s=newBSTNode<
;
s->
lchild=s->
rchild=NULL;
f)
(1);
//被插结点s为新的根结点
elseif(e<
f->
data)
(2);
//被插结点s为左孩子
else
(3);
//被插结点s为右孩子
return(4);
//树中已有关键字相同的结点,不再插入
(1)newnode(val)
(2)f->
lchild=s
(3)f->
rchild=s
(4)false