第2章 基本数据结构及算法习题参 考答案Word下载.docx

上传人:b****6 文档编号:17245894 上传时间:2022-11-29 格式:DOCX 页数:18 大小:71.93KB
下载 相关 举报
第2章 基本数据结构及算法习题参 考答案Word下载.docx_第1页
第1页 / 共18页
第2章 基本数据结构及算法习题参 考答案Word下载.docx_第2页
第2页 / 共18页
第2章 基本数据结构及算法习题参 考答案Word下载.docx_第3页
第3页 / 共18页
第2章 基本数据结构及算法习题参 考答案Word下载.docx_第4页
第4页 / 共18页
第2章 基本数据结构及算法习题参 考答案Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

第2章 基本数据结构及算法习题参 考答案Word下载.docx

《第2章 基本数据结构及算法习题参 考答案Word下载.docx》由会员分享,可在线阅读,更多相关《第2章 基本数据结构及算法习题参 考答案Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

第2章 基本数据结构及算法习题参 考答案Word下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1