数据结构B习题1参考答案Word文件下载.docx
《数据结构B习题1参考答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构B习题1参考答案Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
elements=elem;
returntrue;
for(intj=n-1;
j>
i;
j--)
elements[j+1]=elements[j];
elements[i+1]=x;
n++;
returntrue;
}
算法的时间复杂度为O(n)
2.4
Del(Tx)
if(!
n)
UnderFlow"
for(inti=0;
i<
n;
i++)
if(elements[i]==x)
{
for(intj=i+1;
j<
elements[j-1]=elements[j];
n--;
returntrue;
}
returnfalse;
2.6
voidSingleList<
Invert()
{
Node<
*p=first,*q;
first=NULL;
while(p)
{
q=p->
link;
p->
link=first;
first=p;
p=q;
}
2.7
boolSingleList<
Del(constT&
x)
UnderFlow!
!
"
*p=first,*q;
if((first->
data)==x)
first=first->
deletep;
n--;
while(p&
&
data!
=x)
q=p;
p=p->
if(p)
q->
link=p->
delete(p);
3.1
答:
(2)和(3)不能。
对
(2)中的E,B,D而言,E最先出栈则表明,此时B和D均在栈中,由于,B先于D进栈,所以应有D先出栈。
同理(3)也不能。
(1)能,操作序列:
push(A),pop(),push(B),pop(),push(C),pop(),push(D),pop(),push(E),pop()
(4)能,操作序列:
push(A),push(B),push(C),push(D),push(E),pop(),pop(),pop(),pop(),pop()
3.4
(1)(a+b)/(c+d)ab+cd+/
(2)b^2-4*a*cb2^4a*c*-
(3)a*c-b/c^2ac*-bc2^/-
(4)(a+b)*c+d/(e+f)ab+c*def+/+
(5)(a+b)*(c*d+e)-a*cab+cd*e+*ac*-
3.13
ttemplate<
voidSeqStack<
Invert(void)
SeqQueue<
sq(maxTop+1);
Ttemp;
while(top!
=-1)
this->
Top(temp);
Pop();
sq.EnQueue(temp);
while(!
sq.IsEmpty())
sq.Front(temp);
sq.DeQueue();
Push(temp);
4.2设三维数组的维度分别是m,n,l;
每个元素占k个存储单元。
Loc(A[i][j][k])=Loc(A[0][0][0])+(i*n*l+j*l)*k
4.6
4.7
col
1
2
3
4
num
k
4.14(4)
j
5
6
7
8
9
10
11
pj
a
b
c
f(j)
-1
改进f(j)
4.15
5.2
(1)无序树:
9棵
(2)有序树:
12棵
(3)二叉树:
30棵
5.4
(1)2k-1
(2)
(3)k(i-1)+m+1
(4)i+1≤
5.5
(1)空二叉树和所有结点均无左孩子的二叉树
(2)空二叉树和只有一个根
(3)空二叉树和所有结点均无右孩子
5.6
5.7
先:
DEHFJGCKAB
中:
HEJFGKCDAB
后:
HJKCGFEBAD
5.9
(1)
voidBinaryTree<
Del(BTNode<
*p)//private
if(p!
=NULL)
Del(p->
lChild);
rChild);
voidBTree<
Del()//public
Del(root);
root=NULL;
(2)
/*求二叉树中度为1的结点个数*/
intBinaryTree<
CountDegree1()
inttotal=0;
CountDegree1(root,total);
returntotal;
CountDegree1(BTNode<
*t,int&
num)
if(t)
if(((t->
lChild!
=NULL)&
(t->
rChild==NULL))||
((t->
lChild==NULL)&
rChild!
=NULL)))
++num;
CountDegree1(t->
lChild,num);
rChild,num);
(3)
Exch(BTNode<
BTNode<
*temp;
temp=p->
lchild;
p->
lchild=p->
rchild;
rchild=temp;
Exch(p->
lchild);
rchild);
Exchange()//public
Exch(root);
5.14
5.16
分别以下列数据为输入,构造最小堆。
(1)10,20,30,40,50,60,70,80
(2)80,70,60,50,40,30,20,10
(3)80,10,70,20,60,30,50,40
5.17分别以上题的数据为输入,从空的优先权队列开始,依此插入这些元素,求结果优先权队列的状态。
5.19
(2)WPL=91
(3)各字符的编码
A:
1010
B:
1011
C:
100
D:
00
E:
01
F:
6.5
Search1(Tx)const
returnSearchRec(x,0);
SearchRec(Tx,inti)const
if(i>
=n)returnfalse;
if(elements[i]==x)returntrue;
elsereturnSearchRec(x,i+1);
6.6
Search1(Tx)const
*p=first;
element<
if(p==NULL||p->
element>
x)returnfalse;
6.10
ASL成功=1/12(1*1+2*2+3*4+4*5)=37/12
ASL失败=1/13(3*3+4*10)=49/13
7.1
7.3
7.8
7.16
7.17
(1)
删除a
删除e
删除f
删除h
8.38.4
线性探查法
55
45
35
25
70
80
60
50
二次探查法
双散列法
9.1
顶点
入度
出度
9.2
9.4
voidLGraph<
Degree(int*in)
i<
i++)
in[i]=0;
ENode<
*p;
for(i=0;
p=a[i];
while(p)
in[p->
adjvex]++;
p=p->
nextarc;
for(i=0;
cout<
in[i]<
;
9.6
9.13
9.16
关键路径:
a2,a7,a9.
长度:
23
9.17
9.21
源点
终点
最短路径
路径长度
A
B
(A,B)
C
(A,B,C)
D
(A,D)
E
(A,B,E)
G
__
∞
S
d[A]
path[A]
d[B]
path[B]
d[C]
path[C]
d[D]
path[D]
d[E]
path[E]
d[G]
path[G]
0,-1
3,A
∞,-1
4,A
5,A
4,B
10.1
(1)简单选择排序
初始序列(61871203087097755326
第1趟(03)871261087097755326
第2趟(0308)1261877097755326
第3趟(030812)61877097755326
第4趟(03081226)877097755361
第5趟(0308122653)7097758761
第6趟(030812265361)97758770
第7趟(03081226536170)758797
第8趟(0308122653617075)8797
第9趟(030812265361707587)97
(2)直接插入排序
初始序列(61)871203087097755326
第1趟(6187)1203087097755326
第2趟(126187)03087097755326
第3趟(03126187)087097755326
第4趟(0308126187)7097755326
第5趟(030812617087)97755326
第6趟(03081261708797)755326
第7趟(0308126170758797)5326
第8趟(030812536170758797)26
第9趟(03081226536170758797)
(3)冒泡排序(注意冒泡排序只排了7趟)
初始序列(61871203087097755326)
第1趟61120308708775532697
第2趟12030861707553268797
第3趟03081261705326758797
第4趟03081261532670758797
第5趟03081253266170758797
第6趟03081226536170758797
第7趟03081226536170758797
(4)快速排序
初始序列61871203087097755326
第1趟(53261238)61(97757087)
第2趟(826123)5361(97757087)
第3趟38(1226)5361(97757087)
第4趟38122653(6197757087)
第5趟3812265361(87757097)
第6趟3812265361(7075)8797
第7趟381226536170758797
(5)两路合并排序
初始序列(61)(87)(12)(03)(08)(70)(97)(75)(53)(26)
第1趟(6187)(0312)(0870)(7597)(2653)
第2趟(03126187)(08707597)(2653)
第3趟(0308126170758797)(2653)
第4趟(03081226536170758797)
10.2
简单选择排序:
三种情况下的时间复杂度都为O(n2)。
直接插入排序:
最好情况下为O(n);
平均和最坏情况下为O(n2)。
冒泡排序:
最好情况为O(n);
最坏和平均情况下为O(n2)。
快速排序:
最好和平均情况下为O(nlog2n);
最坏情况下时间复杂度为O(n2)。
两路合并排序:
三种情况下,均为O(nlog2n)
(2)简单选择排序、直接插入排序和冒泡排序都是O
(1)
最好情况,空间复杂度为O(log2n);
最坏情况,空间复杂度为O(n)
两路合并排序:
均为O(n)
(3)不稳定的是简单选择排序和快速排序两种。
(4)简单选择排序、冒泡排序和快速排序。
10.4
voidDoubleBubleSort(Ta[],intn)
inti,j,low=0,high=n-1,s,t;
Tx;
while(low<
high)
s=low;
for(i=low;
high;
i++)//从上向下沉底
if(a[i]>
a[i+1])
{
x=a[i];
a[i]=a[i+1];
a[i+1]=x;
s=i;
}
high=s;
t=high;
for(j=high;
j>
low;
j--)//从下向上冒泡
if(a[j]<
a[j-1])
x=a[j];
a[j]=a[j-1];
a[j-1]=x;
t=j;
low=t;