第2章 基本数据结构及算法习题参 考答案Word下载.docx
《第2章 基本数据结构及算法习题参 考答案Word下载.docx》由会员分享,可在线阅读,更多相关《第2章 基本数据结构及算法习题参 考答案Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
elsereturnmin(minnum(p,n/2),minnum(q,n/2));
4.试写出将一个元素插入到有序线性表中的算法。
intinsert(inta[],intb,intn,intm)
{if(n==m)printf("
overflow"
);
else
{if(n==0)a[n]=b;
{i=n-1;
while((i>=0)&
&
(a[i]>b))
{a[i+1]=a[i];
i=i-1;
a[i+1]=b;
n=n+1;
}
returnn;
5.编写一个算法,将两个线性表合并成一个有序表。
voidmerge(inta[],intb[],intc[],intm,intn)
{inti,j,k;
i=j=k=0;
while(i<
m&
j<
n)
if(a[i]<
=b[j])
c[k++]=a[i++];
elsec[k++]=b[j++];
m)
c[k++]=a[i++];
while(j<
c[k++]=b[j++];
6.设有两个有序线性单链表,头指针分别为ah与bh。
试写出将这两个有序线性单链表合并为一个头指针为ch的有序线性单链表的算法。
structnode
{intdata;
structnode*next;
};
node*merge(node*ah,node*bh)
{node*pa,*pb,*pc,*ch,*q;
pa=ah;
pb=bh;
ch=NULL;
while(pa!
=NULL&
pb!
=NULL)
{pc=newnode;
if(pa->
data<
=pb->
data)
{pc->
data=pa->
data;
pa=pa->
next;
else
data=pb->
pb=pb->
if(ch==NULL)
ch=pc;
elseq->
next=pc;
q=pc;
if(pb==NULL)
while(pa!
{pc=newnode;
pc->
if(ch==NULL)
ch=pc;
elseq->
while(pb!
q->
next=NULL;
return(ch);
7.试写出逆转线性单链表的算法。
structnode
{chard;
structnode*next
invlst(structnode**head)
{structnode*p,*q,*r;
if(*head!
{p=*head;
q=p->
p->
while(q!
{r=q->
q->
next=p;
p=q;
q=r;
*head=p;
8.写出计算线性链表长度的算法。
structnode/*定义线性单链表结点类型*/
{ETd;
/*定义线性单链表结点数据类型*/
structnode*next;
/*结点指针*/
intlen(structnode*head)
{intn;
structnode*p;
n=0;
p=head;
while(p!
{n++;
p=p->
returnn;
9.用筛选法求1000以内的素数。
用单链表存放2~1000的值,编写一个函数删除该单链表中非素数的结点(即剩下的结点中的值均为素数)。
#include<
iostream.h>
{intd;
node*next;
node*creat(void)
{node*head,*p,*q;
inti;
head=NULL;
q=NULL;
for(i=2;
i<
1000;
i++)
{
p=newnode;
d=i;
if(head==NULL)
head=p;
else
q->
q=p;
return(head);
node*delst(node*head)
{
node*p,*q,*r;
p=head;
r=p;
while(p!
q=p->
=NULL)
{
if((q->
d)%(p->
d)==0)
{
r->
next=q->
deleteq;
q=r->
}
else
r=q;
q=q->
p=p->
voidprint(node*head)
node*p,*q;
while(p!
p->
d<
'
'
;
deleteq;
cout<
endl;
voidmain()
node*head,*q;
head=creat();
q=delst(head);
print(head);
10.对于下面的每一步,画出栈元素与栈顶指针的示意图:
(1)栈空;
(2)在栈中插入一个元素X;
(3)在栈中插入一个元素Y;
(4)删除栈顶元素;
(5)在栈中插入一个元素Z;
(6)在栈中插入一个元素W;
(7)栈初始化。
top
→
Y
X
栈空
在栈中插入一个元素X
在栈中插入一个元素Y
W
Z
删除栈顶元素
在栈中插入一个元素Z
在栈中插入一个元素W
top
→→
栈初始化
11.设循环队列的容量为50(序号1~50),现经过一系列的进队与退队运算后,有:
(1)front=15,rear=22。
(2)front=26,rear=12。
问在这两种情况下,循环队列中各有多少个元素?
(1)7
(2)36
12.假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的算法。
#defineM100
correct(charexp[],inttag)
{charst[M];
inttop=0,i=1;
tag=1;
=M&
tag)
{if(exp[i]=='
('
||exp[i]=='
['
{'
)
{top++;
st[top]=exp[i];
if(exp[i]=='
)'
if(st[top]=='
)top--;
elsetag=0;
]'
}'
i++;
if(top>
0)tag=0;
13.现有如下的稀疏矩阵,要求写出其三元组表示。
14.现有一个稀疏矩阵的三元组表示如下,试写出其对应的稀疏矩阵。
15.编写一个算法,将给定的m×
n稀疏矩阵转换成三元组表示。
intchange(intm,intn,inta[][M],intb[][3])
{inti,j,k=1,t=0;
for(i=0;
m;
i++)
for(j=0;
n;
j++)
if(a[i][j]!
=0)
{t=t+1;
b[k][0]=i;
b[k][1]=j;
b[k++][2]=a[i][j];
b[0][0]=m;
b[0][1]=n;
b[0][2]=t;
returnk;
//k为三列二维数组中的行数
16.设一棵完全二叉树具有500个结点。
问该完全二叉树有多少个叶子结点?
有多少个度为2的结点?
有多少个度为1的结点?
若完全二叉树有501个结点,再回答上述问题,并说明理由。
(1)叶子结点:
250
度为2的结点:
249
度为1的结点:
1
因为总的结点数是偶数,第一层为一个结点,中间各层均为偶数个结点,因此最后一层是奇数个结点,可知叶子结点只有1个。
由性质知,度为0的结点数比度为2的结点数多1,则可推导出上述结论。
(2)同理可得
叶子结点:
251
17.以先序遍历法访问某二叉树各结点的顺序是ABDHEICFJK,以中序遍历法访问该二叉树结点的顺序是DHBEIACJFK,要求:
(1)请还原该二叉树;
(2)写出后序遍历结果。
(1)
(2)HDJEBJKFCA
18.以后序遍历法访问某二叉树各结点的顺序是FHIGDEBCA,以中序遍历法访问该二叉树结点的顺序是FDHGIBEAC,要求:
(2)写出先序遍历结果。
(2)ABDFGHIEC
19.依次输入元素序列{37,81,43,75,20,10,14,26},试构造一棵二叉查找树。
在这棵二叉查找树中查找33,需要比较多少次?
需要比较3次
20.写出构造二叉查找树的算法,如输入序列:
23,45,11,98,16,67,35,73,53,56,78,34,0,输入为0表示序列结束。
btree*insertree(btree*t,intkey)
{btree*p,*q;
p=newbtree;
//申请结点,并插入之
p->
data=key;
lchild=NULL;
rchild=NULL;
q=t;
if(q==NULL)t=p;
//二叉查找树为空
else//二叉查找树不空
while((q->
lchild!
=p)&
(q->
rchild!
=p))//未到叶子结点
if(q->
data>
key)//插入到左子树
{if(q->
=NULL)q=q->
lchild;
elseq->
lchild=p;
else//插入到右子树
rchild;
rchild=p;
return(t);
//插入成功返回t
{intkey;
btree*t=NULL;
cin>
>
key;
while(key!
t=insertree(t,key);
cin>
};
21.设有5个结点为K1,K2,K3,K4,K5,其权值分别为16,2,18,16,23。
请构造一棵Huffman树。
22.对下列有向图,求出每个顶点的度、入度和出度以及图的度,并给出其邻接矩阵及邻接表的表示。
解1:
顶点入度出度vi的度
1)303
2)213
3)224
4)134
5)134
6)112
图的度为4。
解2:
有向图1的邻接矩阵
000000
100000
100100
010011
111000
001000
第i行非零元素的个数为第i个顶点的出度,
第i列非零元素的个数为第i个顶点的入度。
解3:
邻接表
顶点vi的出度是第i个链表中的结点个数,
顶点vi的入度,是所有链表中其邻接点域的值为i的结点的个数。
23.对下列无向图,分别写出按深度优先搜索法和广度优先搜索法,从V1出发遍历图的结点序列(遍历时一般按照编号顺序安排邻接点的次序)。
解:
深度优先搜索法:
v1-v2-v4-v3-v7-v6-v5
广度优先搜索法:
v1-v2-v3-v4-v7-v5-v6
24.顺序查找法适合于存储结构为什么样的线性表?
顺序存储或链接存储
25.对线性表进行二分查找时,要求线性表具备什么条件?
以顺序方式存储,且结点按关键字有序排序
26.对有序表{1,3,9,12,32,41,45,62,75,77,82,95,100},用二分查找法查找值为82的结点时,要经过多少次比较后才能查找成功。
4
27.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用什么查找方法?
分块
28.设有一组关键字{19,1,23,14,55,20,84,27,68,11,10,77}。
哈希函数为:
H(key)=key%13,采用线性探测法解决冲突,试在0~18的哈希地址空间中对该关键字序列构造哈希表。
2
3
5
6
7
8
9
10
11
12
13
14
15
16
17
18
27
55
68
84
19
20
23
77
29.在待排序的元素序列基本有序的前提下,效率最高的排序方法是什么?
插入排序
30.序列{46,79,56,38,40,84},如果采用快速排序的方法,以第一个记录为基准得到的一次划分结果是什么?
40,38,46,56,79,84
31.用快速排序对线性表{25,84,21,47,15,27,68,35,20}进行排序。
(1)258421471527683520
(2)201521254727683584
(3)152021253527476884
(4)152021252735476884
32.已知序列{70,83,90,65,10,32,7,9},请给出采用插入排序法对该序列作升序排序时的每一趟结果。
[70]839065103279
[7083]9065103279
[708390]65103279
[65708390]103279
[1065708390]3279
[103265708390]79
[7103265708390]9
[79103265708390
33.已知序列{10,18,4,3,6,12,1,9,15,8},请给出采用归并排序法对该序列作升序排序时的每一趟结果。
10184361219158
[1018][34][612][19][815]
[341018][16912][815]
[341018][16891215]
[13468910121518