划线语句的执行次数为log2n。
(3)for(inti=1;i<=n;i++)
for(intj=1;j<=i;j++)
for(intk=1;k<=j;k++)
x++;
划线语句的执行次数为n(n+1)(n+2)/6。
(4)x=n;y=0;
while(x>=(y+1)*(y+1))y++;
划线语句的执行次数为n。
第二章两种基本的数据结构
2-4.
Loc(A[i][j][k])=134+(i*n*p+j*p+k)*2
2-9.第34页习题
(2).9
voidInvert(Telements[],intlength)
{//length数组长度
//elements[]为需要逆序的数组
Te;
for(inti=1;i<=length/2;i++)
{
e=elements[i-1];
elements[i-1]=elements[length-i];
elements[length-i]=e;
}
}
2-12.第34页习题(12)
voidpInvert(Node*first)
{
Node*p=first,*q;
first=NULL;
while(p){
q=p->Link;p->Link=first;
first=p;p=q;
}
}
第三章栈与队列
1.第54页习题
(1)
设A、B、C、D、E五个元素依次进栈(进栈后可立即出栈),问能否得到下列序列。
若能得到,则给出相应的push和pop序列;若不能,则说明理由。
1)A,B,C,D,E2)A,C,E,B,D
3)C,A,B,D,E4)E,D,C,B,A
答:
(1)Push(A);Pop(A);Push(B);Pop(B);
Push(C);Pop(C);Push(D);Pop(D);
Push(E);Pop(E);
2)不能得到,因为E,B,D而言,E最先出栈,则表明,此时B和D均在栈中,由于,B先于D进栈,所以应有D先出栈。
3)不能得到,因为C,A,B而言,C最先出栈,则表明,此时A和B均在栈中,由于A优先于B近栈,所以B应比A先出栈。
(4)Push(A);Push(B);Push(C);Push(D);Push(E);
Pop(E);Pop(D);Pop(C);Pop(B);Pop(A);
5.
Stack1Stack2
TOP1TOP2
栈满Top2-Top1==1
Top1<0栈1空Top2>n-1栈2空
9:
voidPrintQueue(Queueq)
{
intfirst=q.Front+1;
while(((first)%q.MaxQueue)!
=q.Rear)
{
printf("%d\n",q.Elements[first]);
first=first+1;
}
printf("%d\n",q.Elements[first]);
}
voidPrintQueue2(Queueq)
{
for(inti=1;q.Front!
=q.Rear;i++)
{
printf("%d\n",q.Elements[(q.Front+1)%q.MaxQueue]);
q.Front=(q.Front+1)%q.MaxQueue;
}
}
voidPrintQueue3(Queueq)
{
for(;q.Front!
=q.Rear;q.Front=(q.Front+1)%q.MaxQueue)
{
printf("%d\n",q.Elements[(q.Front+1)%q.MaxQueue]);
}
}
第四章线性表与数组
1(85页)
intSearch_Insert(List*lst,Tx)
{
inti,j;
j=lst->Size-1;
for(i=lst->Size-1;i>=0;i--)
{
if(lst->Elements[i]==x)
{
returni;
}
}
if(lst->Size==lst->MaxList)
{
return-1;
}
while(lst->Elements[j]>x)
{
lst->Elements[j+1]=lst->Elements[j];
j--;
}
lst->Elements[j+1]=x;
lst->Size++;
returnj+1;
}
voidSearch_Delete(List*lst,Tx,Ty)
{
inti=0;
if(lst->Size==0)
{
printf("thelistisempty,cannotbedeleted!
\n");
return;
}
for(intj=0;jSize;j++)
{
if((lst->Elements[j]Elements[j]>y))
{
lst->Elements[i]=lst->Elements[j];
i=i+1;
}
}
lst->Size=i;
}
13.(第86页,第13题)给出下列稀疏矩阵的
顺序三元组的行优先和列优先表示。
答:
14.(第86页,第14题)
对题图4-5的稀疏矩阵执行矩阵转置时数组num[]和k[]的值。
答:
第五章树
第2题,第141页,
对于三个结点A,B和C,可分别组成多少不同的无序树、有序树和二叉树?
答:
(1)无序树:
9棵
(2)有序树:
12棵
(3)二叉树:
30棵
第3题,P141
n0=n2+2*n3+….+(m-1)nm+1
第5题,P142
(1)或者为空二叉树,或者所有结点的左子树都是空的单支树
(2)或者为空二叉树,或者只有根结点的二叉树
(3)或者为空二叉树,或者所有结点的右子树都是空的单支树
第7题,第142页,
给出对图6-31中的树的先序遍历和后序遍历的结果。
答:
先序:
D,E,H,F,J,G,C,K,A,B
中序:
H,E,J,F,G,K,C,D,A,B
后序:
H,J,K,C,G,F,E,B,A,D
第6题第142页,
设对一棵二叉树进行中序遍历和后序遍历的结果分别为:
(1)中序遍历BDCEAFHG
(2)后序遍历DECBHGFA
画出该二叉树。
答:
第8(3)题第142页,
intcount=0;
voidSizeOfLeaf(BTNode*t)
{
if(t){
if((!
(t->RChild))&&(!
(t->LChild)))
{
count=count+1;
}
SizeOfLeaf(t->LChild);
SizeOfLeaf(t->RChild);
}
}
第13题第142页,
将图题6-32中的树转换成二叉树,
并将图6-31中的二叉树转换成森林。
第18题第1438页,
设S={A,B,C,D,E,F},W={2,3,5,7,9,12},对字符集合进行哈夫曼编码,W为各字符的频率。
(1)画出哈夫曼树
(2)计算带权路径长度
编码:
A:
1010
B:
1011
C:
100
D:
00
E:
01
F:
11
第六章集合
第4题,P155
对半搜索算法要求其必须针对顺序存储的有序表。
顺序搜索从头搜到尾,所以不影响。
补充:
已知(1,2,3,4,5,6,7,8,9,10,11)找到9比较几次?
M=(1+11)/2=6比较一次
6<9,找[7,11]
M=(7+11)/2=9
9=9比较2次
成功
所以一共比较2次成功
第七章搜索树
1.第189页,第
(1),
建立37,45,91,25,14,76,56,65为输入时的二叉搜索树,再从该树上依此删除76,45,则树形分别如何?
第八章散列与跳表
第3题,第209页,
设散列表ht[11],散列函数h(key)=key%11。
采用线性探查法解决冲突,试用关键字值序
列:
70,25,80,35,60,45,50,55建立散列表。
线性探查法:
伪随机探查法:
P=13
0
1
2
3
4
5
6
7
8
9
10
55
45
35
25
70
80
50
60
对80:
(3+13)%11=5
对60:
(5+13)%11=7
二次探查法
0
1
2
3
4
5
6
7
8
9
10
45
35
80
25
70
60
50
55
对80:
(3+1*1)%11=4(3-1*1)%11=2
对35:
(2+1*1)%11=3(2-1*1)%11=1
对45:
(1+1*1)%11=2(12-1*1)%11=0
对55:
(0+1*1)%11=1(0-1*1)%11=10
第4题,第209页,
双散列法:
70
25
80
35
60
45
50
55
H1
4
3
3
2
5
1
6
0
H2
9
1
6
0
1
2
3
4
5
6
7
8
9
10
55
80
35
25
70
60
45
50
对80:
(3+1*9)%11=1
对45:
(1+1*1)%11=2(1+2*1)%11=3
(1+3*1)%11=4(1+4*1)%11=5
(1+5*1)%11=6
对50:
(6+1*6)%11=1(6+2*6)%11=7
第九章图
第
(1)题,第243页,
对下面的有向图求
(1)每个顶点的入度和出度;
(2)强连通分量
(3)邻接矩阵
第
(2)题,第243页,
当以边〈1,0〉,〈1,3〉,〈2,1〉,〈2,4〉,〈3,2〉,〈3,4〉,〈4,0〉,〈4,1〉,〈4,5〉,
〈5,0〉的次序从只有6个顶点没有边的图开始,通过依此插入这些边,建立邻接表结构。
画出该邻接表。
深度优先遍历:
0,1,3,4,5