数据结构及算法 期末复习思考题.docx

上传人:b****8 文档编号:30396775 上传时间:2023-08-14 格式:DOCX 页数:14 大小:38.42KB
下载 相关 举报
数据结构及算法 期末复习思考题.docx_第1页
第1页 / 共14页
数据结构及算法 期末复习思考题.docx_第2页
第2页 / 共14页
数据结构及算法 期末复习思考题.docx_第3页
第3页 / 共14页
数据结构及算法 期末复习思考题.docx_第4页
第4页 / 共14页
数据结构及算法 期末复习思考题.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构及算法 期末复习思考题.docx

《数据结构及算法 期末复习思考题.docx》由会员分享,可在线阅读,更多相关《数据结构及算法 期末复习思考题.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构及算法 期末复习思考题.docx

数据结构及算法期末复习思考题

北京工业大学校选修课程

《数据结构及算法》期末复习思考题

2011年12月

一、填空题

1.数据结构研究以下三个方面的内容:

数据的存储结构、数据的运算以及定义在相应结构上的数据运算的逻辑性操作规则及其程序实现。

2.根据同一数据对象中各个数据元素之间存在的逻辑关系的不同数学特性,通常可将数据结构分为四类:

线性结构、树型结构、图状结构以及纯集合结构。

3.在解决同一问题的不同算法中,时间复杂度而且空间复杂度的算法的执行效率愈高。

4.在单链表中,除了首元结点外,任一结点的存储位置保存在该结点的

结点中的“后继结点指针域”中。

在设有头结点的单链表中,链表的头指针指向头结点,而首元结点的地址被保存在中的“后继结点指针域”中。

在不设头结点的单链表中,链表的头指针指向首元结点或为空值。

5在顺序表中逻辑上相邻的元素的物理位置紧邻,在单链表中逻辑上相邻的元素的物理位置紧邻。

6、在表长为n的顺序表中插入或删除一个数据元素,需要平均移动

个数据元素,具体每次插入或删除操作时需要实际移动的数据元素的个

数与被操作的数据元素在表中的有关。

二、单项选择题

1.如果打算利用单向链表的存储方式来实现一个队列的基本运算,并且入队运算和出队运算使用频率最高,则采用以下哪种存储方式效率最高?

()

A.不设头结点的单向非循环链表;B.仅设头指针的单向循环链表;

C.设有头结点的单向非循环链表;D.仅设尾指针的单向循环链表。

2.当循环队列的出队运算执行时,应首先判断的条件是(),其中m表示循环队列中数组的容量。

A.front==rearB.(front+1)%m==rear

C.(rear+1)%m==frontD.rear%m==front

3.在某个循环队列中,保存数据元素的数组的容量为13,在某时刻front=5,rear=1,则此时队列中共有()个数据元素。

A.4B.9C.-4D.以上都不正确

4.假设线性表{1,3,5,7,9}被存储在一个带头结点的单向链表中,指针变量p指向单向链表中存放线性表的第2个数据元素的结点,指针变量q指向存放线性表的第3个数据元素的结点,则执行语句序列

{p->next=q->next;free(q);q=p->next;}后,q->data的值是:

()。

A.3B.5C.7D.9

5.设数据元素1、2、3、4依次进入一个栈,规定数据元素进栈后可以立即出栈,也可以不出栈,并且只有处于栈顶部的数据元素才允许出栈,则在下列序列中不合法的出栈序列是:

()

A.4321B.3241C.1234D.4231

6.若用一个容量为6的按C语言定义的数组来实现循环队列,初始化循环队列时将front和rear设置为0,在某个时刻front=2和rear=5。

如果此时执行一次入队运算,则front和rear的值分别为()。

A.1和0B.2和4C.2和0D.2和6

7.某棵二叉树采用顺序存储结构表示,根结点存储在一维数组的下标为1的元素中,如果某个度为2的非叶子结点在数组中存放在下标为12的位置,则其右孩子结点的存放位置为()

A25B6C3D24

8.如果从无向图的任一顶点出发进行一次深度优先搜索不可以访问到该图中的所有顶点,则该无向图一定是:

()

A完全图B连通图C强连通图D非连通图

三、判断正误

1.具有n个结点的二叉树,采用二叉链表存储,共有n+1个空链域。

()

2.就插入和删除运算效率而言,线性表采用顺序存储结构实现比起采用

链接式存储结构实现效率更高。

()

3.在单向循环链表中,能够从当前结点出发到达任一其它结点。

()

4.队列的运算特征是LIFO,栈的运算特征是FIFO。

()

5.线性表的特点是每个元素都有且仅有一个直接前驱和一个直接后继。

()

6.任何一种链表的每个结点中都只包含一个指针域。

()

7.若一棵二叉树的任意一个非叶子结点的度为2,则该二叉树一定不是完全二叉树。

()

8.对任意一个图,从它的某个顶点出发进行一次深度优先或广度优先遍历可访问到该图的每个顶点。

()

9.非线性的数据结构不仅可以采用顺序方式存储,也可以采用链接方式存储。

()

10.栈是运算受限的线性表,插入或者删除运算只允许在表的一端进行。

()

四、简答题

1.简述线性表采用顺序存储方式实现时的优缺点。

优点:

无须为表示结点间的逻辑关系而增加额外的存储空间;可以方便的随机存取表中的任一结点.

缺点:

插入和删除运算不方便,需移动大量元素;由于要求占用连续的存储空间,存储分配只能按最大存储空间预先进行,致使存储空间不能得到充分利用;表的容量难以扩充.

链表存储:

优点:

插入删除操作可通过修改结点的指针实现,无须移动元素;方便扩充存储空间;

缺点:

不能随机存取元素;

 

2.简述二叉树采用顺序存储方式实现时的优缺点。

 

3.什么叫有序树?

什么叫无序树?

有序树和二叉排序树的差别是什么?

有序树与二叉树的区别是什么?

 

4.什么是排序方法的稳定性?

试判断起泡排序算法的稳定性。

 

5、简述散列表(Hash表)的工作原理并就插入、删除、查找运算分析它的优缺点。

 

五、综合题

1.如图1所示的二叉树,试写出它的三种遍历序列。

(1)先序遍历序列:

abcdefghi

(2)中序遍历序列:

bcdafehig

(3)后序遍历序列:

dcbfihgea

 

图1题五1的二叉树

2.以{4,7,8,2,5,16,30}作为叶子结点的权值构造一棵Huffman树,并计算其带权路径长度(WPL)。

 

3.对图2所示的有向图,请给出它的:

(1)邻接矩阵

(2)邻接表

(3)强连通分量

(4)试写出从顶点2出发的根据

(2)中邻接表得到

的广度优先遍历序列

2

 

4.以关键码序列(26,38,15,97,76,12)为例,手工执行快速排序算法(按升序方式),写出每一趟排序结束时的关键码序列。

 

5、对图3所所表示的有向图,

(1)写出全部可能的拓扑序列;

(2)给出一个具体的邻接表存储结构示意图;(3)根据你的邻接表,在规定入度为0的顶点按照栈式存储的约束下,写出拓扑排序算法的执行结果序列。

图3:

题五5的有向图

6、选取哈希函数为H(k)=(k)MOD7,并采用拉链式方法处理冲突,试在0∽6的散列地址空间中对关键字序列(19,14,23,2,68,47,16,28,36,52)构造散列表,并计算出在该表中进行查找时的平均查找长度。

 

六、算法理解题

1、分析下列程序,剖析Unknow1函数的功能,按照要求写出主程序执行的结果。

给定结点格式如下及变量定义如下:

#include

#include

#include

#defineNULL0

typedefstructnode{

intdata;

structnode*next;

}Lnode;/*定义单向链接表的结点格式*/

Lnode*Unknow1(Lnode*L)

{

Lnode*p,*q;

if(L!

=NULL&&L->next!

=NULL)

{

q=L;

L=L->next;

p=L;

while(p->next!

=NULL){p=p->next;}

p->next=q;

q->next=NULL;

return(L);

}

else

{

return(L);

}

}

voidmain()

{

intitem,i;

inta[6]={13,3,5,7,9,11};

Lnode*head1,*head2,*pM,*qM;

head1=(Lnode*)malloc(sizeof(Lnode));

head1->next=NULL;

head1->data=a[0];

pM=head1;

for(i=1;i<=5;i++){

qM=(Lnode*)malloc(sizeof(Lnode));

qM->data=a[i];

qM->next=NULL;

pM->next=qM;

pM=pM->next;

}

pM=head1;

printf("\nBeforecallUnknow1:

\n");

for(i=0;i<6;i++)

{

item=pM->data;

printf("data[%d]=%d\n",i+1,item);

pM=pM->next;

}

head2=Unknow1(head1);

pM=head2;

printf("\nAftercallUnknow1:

\n");

for(i=0;i<6;i++)

{

item=pM->data;

printf("data[%d]=%d\n",i+1,item);

pM=pM->next;

}

}

(1)画出主程序中调用Unknow1函数前的链表示意图

 

(2)画出主程序中调用Unknow1函数后的链表示意图

 

(3)写出主程序的执行后显示在屏幕上的结果

 

2.简述以下算法的功能,画出算法的流程图。

其中Stack是顺序栈类型说明符。

StackEmpty(Stackst)表示当st中没有元素时返回true,有元素时返回false。

voidUnknow2(Stacks){

{

inti,n,A[255];

n=0;

while(!

StackEmpty(s))

{

n++;pop(s,A[n]);

};

for(i=1;i<=n;i++)

{

push(s,A[i]);

}

}

(1)算法Unknow2的功能是:

(2)流程图如下:

七、算法设计题

1、某棵二叉树采用下列的静态存储结构形式表示,请设计下列算法:

(1)一个按照先序遍历思想对二叉树进行遍历的递归算法。

(2)设计一个算法打印出由下标号指定的叶子节点以及其祖先节点。

 

下标dataparentleftchildrightchild

0

A

-1

1

-1

1

B

0

2

3

2

C

1

-1

-1

3

D

1

4

5

4

E

3

-1

-1

5

F

3

-1

-1

#defineMaxSize6

chardata[MaxSize]={’A’,’B’,’C’,’D’,’E’,’F’};

intparent[MaxSize]={-1,0,1,1,3,3};

intleftchild[MaxSize]={1,2,-1,4,-1,-1};

intrightchild[MaxSize]={-1,3,-1,5,-1,-1}

(1)voidpreOrder(introot)//从根结点编号为root的结点进行先序遍历

{

if(root==-1)return;//空二叉树

printf(”%c”,data[root];

preOrder(leftchild[root]);

preOrder(rightchild[root]);

}

(2)voidfindAcedent(intson)//求出结点编号为son的所有祖先节点

{intfather=-1;

if(son==-1)return;

printf(”%c”,data[son]);

father=parent[son];

while(father!

=-1)

{

if(leftchild[father]==son)

{

printf(”----L---%c”,data[father]);

}

else

{

printf(”---R---%c”,data[father]);

}

son=father;

father=parent[son];

}

}

2、假设以二维数组g[1..m,1..n]表示一个图像区域,g[i,j]表示该区域中点(i,j)所具有的颜色,其值为从0到k的整数。

定义一个点所在区域为包括本身在内直接与它相临并且颜色取值相同的点以及相继的同色毗邻点组成的集合。

编写一个算法置换点(i0,j0)所在区域的颜色。

提示:

采用队列作为基本数据结构,设计算法的思路如下的伪代码所示:

typedefstruct{

intx;

inty;

}coordinate;/*表示在图像中的某一位置的横向及纵向坐标*/

voidReplace_Color(intg[m][n],inti,intj,intcolor)

//把点(i,j)的按照颜色取值相同而邻接在一起的区域设置为颜色color

{intx,y;

intold;//用来记录原来的颜色值

coordinateorig,a,b;

orig.x=i;orig.y=j;

old=g[i][j];

InitQueue(Q);//先将队列Q置为空队列

EnQueue(Q,orig);

while(!

QueueEmpty(Q))

{

DeQueue(Q,a);

x=a.x;y=a.y;

if(x>1){

if(g[x-1][y]==old)

{

g[x-1][y]=color;

b.x=x-1;b.y=y;

EnQueue(Q,b);

}

}

if(y>1){

if(g[x][y-1]==old)

{

g[x][y-1]=color;

b.x=x;b.y=y-1;

EnQueue(Q,b);

}

}

if(x

if(g[x+1][y]==old)

{

g[x+1][y]=color;

b.x=x+1;b.y=y;

EnQueue(Q,b);

}

}

if(y

if(g[x][y+1]==old)

{

g[x][y+1]=color;

b.x=x;b.y=y+1;

EnQueue(Q,b);

}

}

 

}//endofwhile

}//endofReplace_color

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

当前位置:首页 > 自然科学

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

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