文档库 最新最全的文档下载
当前位置:文档库 › 数据结构习题参考答案.

数据结构习题参考答案.

数据结构习题参考答案.
数据结构习题参考答案.

第1章概论

1.数据、数据元素、数据结构、数据类型的含义分别是什么?

数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。

数据元素:数据的基本单位,在计算机程序中通常作为一个整体考虑。

数据结构:数据元素之间的关系+运算,是以数据为成员的结构,是带结构的数据元素的集合,数据元素之间存在着一种或多种特定的关系。

数据类型:数据类型是用来区分不同的数据;由于数据在存储时所需要的容量各不相同,不同的数据就必须要分配不同大小的内存空间来存储,所有就要将数据划分成不同的数据类型。数据类型包含取值范围和基本运算等概念。

2.什么是数据的逻辑结构?什么是数据的物理结构?数据的逻辑结构与物理结构的区别和联系是什么?

逻辑结构:数据的逻辑结构定义了数据结构中数据元素之间的相互逻辑关系。数据的逻辑结构包含下面两个方面的信息:

①数据元素的信息;

②各数据元素之间的关系。

物理结构:也叫储存结构,是指逻辑结构的存储表示,即数据的逻辑结构在计算机存储空间中的存放形式,包括结点的数据和结点间关系的存储表示。

数据的逻辑结构和存储结构是密不可分的,一个操作算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采与的存储结构。采用不同的存储结构,其数据处理的效率是不同的。因此,在进行数据处理时,针对不同问题,选择合理的逻辑结构和存储结构非常重要。

3.数据结构的主要操作包括哪些?

对于各种数据结构而言,他们在基本操作上是相似的,最常用的操作有:

●创建:建立一个数据结构;

●清除:清除一个数据结构;

●插入:在数据结构中增加新的结点;

●删除:把指定的结点从数据结构中删除;

●访问:对数据结构中的结点进行访问;

●更新:改变指定结点的值或改变指定的某些结点之间的关系;

●查找:在数据结构中查找满足一定条件的结点;

●排序:对数据结构中各个结点按指定数据项的值,以升序或降序重新排列。

4.什么是抽象数据类型?如何定义抽象数据类型?

抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。ADT是与具体的物理存储无关的数据类型,因此,不论ADT的内部结构如何变化,只要其数据结构的特性不变,都不影响其外部使用。

对抽象数据类型的描述一般用(D,R,P)三元组表示,抽象数据类型的定义格式为:

ADT<抽象数据类型名>

{

数据对象D:<数据对象的定义>

数据关系R:<数据关系的定义>

基本操作P:<基本操作的定义>

}ADT<抽象数据类型名>

其中,D是数据对象,R是D上的关系集,P是对D的基本操作集。

数据对象和数据关系的定义用伪代码来描述。基本操作的定义格式为:

基本操作名(参数表)

初始条件:<初始条件描述>

操作结果:<操作结果描述>

初始条件说明操作执行之前数据结构和参数应满足的条件;操作结果说明操作完成后,数据结构的变化状况和应返回的结果。

5.什么是算法?算法的基本特征是什么?

算法:是在有限的步骤内解决数学问题的过程,是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,即算法是对计算机上执行的计算过程的具体描述。一个有效的算法必须满足的五个重要特性:

①有穷性:算法必须能在有限的时间内做完,即在任何情况下,算法必须能在执行有限个步骤之后终止,都不能陷入无穷循环中。

②确定性:算法中的每一个步骤,必须经过明确的定义,并且能够被计算机所理解和执行,而不能是抽象和模糊的概念,更不允许有二义性。

③输入:算法有0个或多个输入值,来描述算法开始前运算对象的初始情况,这是算法执行的起点或是依据。0个输入是指算法本身给出了运算对象的初始条件。

④输出:算法至少有1个或多个输出值,反映对运算对象的处理结果,没有输出的算法没有任何意义。

⑤可行性:算法中要做的运算都是基本运算,能够被精确地进行。即算法中执行的任何计算都可以被分解为基本的运算步,每个基本的运算步都可以在有限的时间内完成。

6.什么是算法分析?算法分析主要考虑哪几方面的内容?

算法的研究与实际问题直接相关,用来解一个问题可以有很多不同的算法,他们之间的效果可能会有很大差异。算法设计者最关心的就是什么是有效的算法,如何评价一个算法的优劣,如何从多种算法中选择好的算法。除了要首先考虑算法的正确性外,还要分析和评价算法的性能。分析和评价算法的性能主要要考虑以下两个方面:

①时间代价:执行算法所耗费的时间。一个好的算法首先应该比其他算法的运行时间代价要小。算法的时间代价的大小用算法的时间复杂度来度量。

②空间代价:执行算法所耗费的存储空间,主要是辅助空间。算法运行所需的空间消耗是衡量算法优劣的另一个重要因素。算法的空间代价的大小用算法的空间复杂度来度量。

7.分析下面算法的时间复杂度。

(1)答:时间复杂度为n2

(2)时间复杂度:n

(3)时间复杂度:n

(4)时间复杂度:n2

(5)时间复杂度:O(log2n)

8.算法设计中的递归、穷举、递推和迭代等算法的基本思想是什么?

递推法:是利用问题本身所具有的一种递推关系求解问题的一种方法。它把问题求解分成若干步,找出相邻几步的关系,从而达到求解问题的目的。具有如下性质的问题可以采用递推法:当得到问题规模为i-1的解后,由问题的递推性质,能构造出问题规模为i的解。因此,程序可以从i=0或i=1出发,由已知i-1规模的解,通过递推,获得问题规模为i的解,直至得到问题规模为n的解。

递归法:递归策略是利用函数直接或间接地调用自身来完成某个计算过程。能采用递归描述的算法通常有这样的特征:为求解规模为n的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出更大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出较大规模问题的解。

穷举法:穷举搜索法也称穷举法或搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。

迭代法:数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法。

9.算法设计中的分治策略、贪心策略、动态规划策略、回溯策略以及分支定界策略的基本思想是什么?

分治策略的基本思想是把一个规模为n的问题划分为若干个规模较小、且与原问题相似的子问题,然后分别求解这些子问题,最后把各子结果合并得到整个问题的解。分解的子问题通常与原问题相似,所以可以递归地使用分治策略来求解。

贪心策略的基本思想是把一个整体最优问题分解为一系列的最优选择问题,决策一旦做出,就不能再更改。它是通过若干次的贪心选择而得出最优解(或较优解)的一种解题策略。

动态规划策略与贪心策略类似,将一个问题划分为重复的子问题,通过对相同子问题的求解来解决较大问题,即将一个问题的解决方案视为一系列决策的结果。不同的是,在贪心策略中,每采用一次贪心准则便做出一个不可撤回的决策,可能得不到问题的最优解。而在动态规划中,处理要按照某种规则进行选择,还要考察每个最优决策序列中是否包含一个最优子序列,目的是得到问题的最优解。

回溯策略也叫试探法,它的基本思想是:在一些问题求解进程中,先选择某一种可能情况向前探索,当发现所选用的试探性操作不是最佳选择,需退回一步,重新选择继续进行试探,直到找到问题的解或者证明问题无解。

分支定界策略也经常被称为分支限界策略,它的基本思想是:首先确定目标值的上下界,然后一边搜索一边剪掉空间树的某些不可能产生最优解的分支,提高搜索效率。

第二章线性表

1.具有什么特征的数据结构被称为线性表?

线性表是一种最常用、最简单的典型线性数据结构,应用非常广泛。线性表是由n(n 0)个数据元素组成的一个有限序列,线性表中数据元素的个数n称为线性表的长度。当n=0时,称为空表。

对于非空线性表,数据元素之间存在一对一的关系,具体特性如下:

第一个数据元素没有前驱;

最后一个数据元素没有后继外;

其他数据元素都是首尾相接、有且只有一个前驱和后继。

2.如何实现线性表的顺序存储结构?

把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里就构成了线性表的顺序存储,采用顺序存储结构的线性表简称顺序表。线性表的顺序存储结构有如下特点:

●线性表中所有元素所占的存储空间是连续的;

●线性表的逻辑顺序与物理顺序一致;

●数组中的每一个元素的位置可以用公式来确定。假设线性表中的第一个数据元素的

存储地址(指第一个字节的地址,即首地址)为LOC(e1),每一个数据元素占k个

字节,则线性表中第i个元素e i在计算机存储空间中的存储地址为:

LOC(e i)=LOC(e1)+(i-1)k

3.如何实现线性表的4种链式存储结构?

数据结构中的每一个数据元素对应于一个存储单元,这种存储单元称为存储结点,简称结点。每个结点分为两部分:一部分用于存放数据元素的值,称为数据域;另一部分是指针,用于指向与该结点在逻辑上相连的其他结点,称为指针域。对于线性表,指针域用于指向该结点的前一个或后一个结点(即前驱结点或后继结点)。通过结点的指针域将n个结点按其逻辑结构连接在一起的数据存储结构,称为链式存储结构。

单向链表:在线性链表中,用一个专门的指针指向线性表中第一个结点,每一个结点的指针都指向它的下一个逻辑结点,线性链表的最后一个结点的指针为空(用NULL或0表示),表示链表终止,这样的线性链表称为单向链表。下图是单向链表示意图。

线性表的单向链式存储

循环链表:将单向链表最后一个结点的指针指向头结点,这样整个链表就构成一个循环,这种链式存储结构称为单向循环链表,简称循环链表。头结点的指针域指向线性表的第一个元素的结点;循环链表中最后一个结点的指针域不再是NULL,而是指向头结点。只有头结点的循环链表称为空循环链表。下图是带头结点的非空循环链表和空循环链表示意图。

带头结点的循环链表

双向链表:双向链表的每个结点含有两个指针域,一个指针指向其前驱结点;另一个指针指向其后继结点。双向链表结点的结构下图(a )所示。

双向循环链表:如果将双向链表第一个结点的prev 指针指向最后一个结点,将最后一个结点的next 指针与指向第一个结点,就构成了双向循环链表。下图(b )和(c )是双向链表和双向循环表的逻辑结构示意图。

图 双向链表结点结构及双向链表

4.顺序表和线性链表分别有哪些优点和缺点?

线性表的顺序存储与链式存储比较

5.请列举出一些线性表问题的实例。

①按员工号排序的员工基本情况表;

②奥运会各项比赛日程;

③按学号记录的学生的成绩单;

等等。

6. 对于顺序表和单向链表,如何实现统计重复元素个数的操作?

(c )双向循环链表

(a )双向链表结点结构

在顺序表中实现统计重复元素个数的操作:

在教材的【描述2-1】中,增加一个统计重复元素个数的成员函数:int Count(const T&x); //返回x出现的次数

在教材的【描述2-2】中,增加查找重复元素个数的成员函数的实现://实现统计重复元素个数

template

int LinearList::Count(const T& x)

{

int count=0;

for (int i=0; i

if(element[i]==x)

count++;

return count;

}

在顺序表中实现统计重复元素个数的操作:

在教材的【描述2-3】中,增加一个统计重复元素个数的成员函数:int Count(const T&x); //返回x出现的次数

在教材的【描述2-4】中,增加查找重复元素个数的成员函数的实现://实现统计重复元素个数

template

int LinkList::Count(const T& x)

{

LinkNode * p=head->next;

int count=0;

while (p!=NULL && )

{

if (p->data ==x)

count++;

p=p->next;

}

return count;

}

第3章栈和队列

1.具有什么特征的数据结构被称为栈和队列?先进后出、栈顶、栈底、先进先出、队头、队尾的概念是什么?

栈:一种插入和删除都只能在表的同一端进行的线性表。

队列:一种只允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表。

先进后出:元素是以e1,e2,……e n顺序进入数据结构,以相反的顺序即e n,e n-1,……

e1离开数据结构。

栈顶:允许进行插入和删除操作的一端。

栈底:栈中与栈顶相对的另一端。

先进先出:元素是以e1,e2,……e n顺序进入数据结构,以相同的顺序即e1,e2,……

e n。离开数据结构。

队头:允许删除操作的一端。

队尾:允许插入操作的一端。

2.简述在顺序栈的栈顶插入一个元素的操作过程。

在插入元素之前,首先要判断栈是否为满,如果栈满,返回“沾满无法插入”等错误提示信息;否则让top指针(指向当前顺序栈的栈顶)向后移动一个元素空间(元素大小),将要插入的元素放入top指针指向的内存单元中。

3. 一个栈的输入序列为1、2、3,试给出全部可能的出栈序列。

可分为三种情况:

①、当只有一个存储空间时,只有一种出栈序列:1、2、3.

②、当有两个存储空间时,有:1、2、3, 2、1、3, 2、3、1等3种出栈序列

③、当存储空间大于等于三个时,有:1、2、3,2、1、3,2、3、1,3、2、1

等4种出栈序列。

4.循环队列的优点是什么?在循环队列中,仅依据头尾指针相等,无法判断队列是“空”还是“满”。要解决这个问题,常用的两种方法是什么?

循环队列的优点有两点:一是可以避免发生顺序队列的“假上溢”现象;二是充分利用队列的存储空间。

两种判断队列是“空”还是“满”的方法:一是约定少用一个元素空间;二是使用计数器size记录当前队列的实际长度。

5. 简述在链接栈中插入一个元素的操作过程。

链接栈的插入操作,先将待进栈结点的指针域指向原来的栈顶结点,然后将栈顶指针top 修改指向该结点,使进栈元素结点成为新的栈顶结点。

6.请列举出一些可以用栈和队列表示的实际问题。

所有“后进先出”(LIFO,Last In First Out)的实际问题都可以用栈表示。栈的应用主要有:数制的转换、括号的匹配检查、行编辑处理、表达式求解、走迷宫以及高级语言中函数的嵌套调用和递归的实现等。

所有“先进先出”(FIFO,First In First Out)的实际问题都可以用队列表示。如日常中的排队问题,队列的应用主要有:操作系统中各种资源请求排队和各种缓冲区的先进先出管理,各种应用系统中的事件规划和事件模拟,树的层次遍历和图的广度优先遍历等。

第4章数组、字符串与广义表

1.具有什么特征的数据结构被称为数组?

数组可以看成是形如(index,value)的数据集合,其中,index是元素的索引,表示数据的逻辑位置,任意两个数据的index都不相同;value表示数据元素的值。

2.设有二维数组a[5][6],每个元素占相邻的8个字节,存储器按字节编址,已知a的起始地址是1000,试计算:

(1)数组a的最后一个元素起始地址;

1000+(30-1)*8=1232。

(2)按行序优先时,元素a[3][5]的起始地址;

1000+(3*6+5)*8=1184

(3)按行列序优先时,元素a[4][3]的起始地址。

1000+(3*5+4)*8=1152

3.请简述数组和矩阵的关系。

矩阵是指纵横排列的二维数据表格。在高级语言编程中,通常用二维数组来描述一个矩阵,从而可以对矩阵中的元素进行随机存取。但矩阵的索引通常从1而不是像数组那样从0开始,并且使用A(i,j)而不是A[i,j]的形式来引用矩阵中的元素。

4.矩阵有哪些基本运算?

矩阵的操作包括转置、加法、减法和乘法等。

5.稀疏矩阵的特点是什么?为什么要对稀疏矩阵采用压缩存储技术?

稀疏矩阵的特点是矩阵中非零元素个数远远少于矩阵零元素个数。

采用压缩存储技术主要是为了节省空间。

6.设A和B是稀疏矩阵,都以三元组作为存储结构,请写出矩阵相加的算法C=A+B。

//稀疏矩阵的三元组表示

#include

using namespace std;

#define M 50

#define N 50

#define MaxSize 20

typedef int ElemType;

typedef struct

{

int r;

int c;

ElemType d;

} TupNode;

typedef struct

{

int rows;

int cols;

int nums;

TupNode data[MaxSize];

} TSMatrix;

int A[M][N],B[M][N];

//建立三元组

void CreateMat(int A[M][N],TSMatrix &t,int row,int col) {

int i,j;

t.rows=row;t.cols=col;t.nums=0;

for(i=0;i

{

for(j=0;j

{

if(A[i][j]!=0)

{

t.data[t.nums].r=i;t.data[t.nums].c=j;

t.data[t.nums].d=A[i][j];t.nums++;

}

}

}

}

//矩阵相加

int MatAdd(TSMatrix &a,TSMatrix &b,TSMatrix &c)

{

int i=0,j=0,k=0;

ElemType v;

if(a.rows!=b.rows||a.cols!=b.cols) return 0;

c.rows=a.rows;c.cols=a.cols;

while(i

{

if(a.data[i].r==b.data[j].r)

{

if(a.data[i].c

{

c.data[k].r=a.data[i].r;

c.data[k].c=a.data[i].c;

c.data[k].d=a.data[i].d;

i++;k++;

}

else if(a.data[i].c>b.data[j].c)

{

c.data[k].r=b.data[j].r;

c.data[k].c=b.data[j].c;

c.data[k].d=b.data[j].d;

j++;k++;

}

else

{

v=a.data[i].d+b.data[j].d;

if(v!=0)

{

c.data[k].r=a.data[i].r;

c.data[k].c=a.data[i].c;

c.data[k].d=v;

k++;

}

i++;j++;

}

}

else if(a.data[i].r

{

c.data[k].r=a.data[i].r;

c.data[k].c=a.data[i].c;

c.data[k].d=a.data[i].d;

i++;k++;

}

else

{

c.data[k].r=b.data[j].r;

c.data[k].c=b.data[j].c;

c.data[k].d=b.data[j].d;

j++;k++;

}

}

if (i==a.nums)

while (j

{

c.data[k].r=b.data[j].r;

c.data[k].c=b.data[j].c;

c.data[k].d=b.data[j].d;

j++;k++;

}

if (j==b.nums)

while (i

{

c.data[k].r=a.data[i].r;

c.data[k].c=a.data[i].c;

c.data[k].d=a.data[i].d;

i++;k++;

}

c.nums=k;

return 1;

}

//输出三元组

void DispMat(TSMatrix t)

{

int i;

if(t.nums<=0)

{

cout<<"此矩阵所有元素都为"<

return;

}

cout<

cout<<"-----------------"<

for(i=0;i

cout<

//主函数

int main()

{

int row,col,i,j;

TSMatrix a,b,c;

cout<<"请输入矩阵的行、列数:\n";

cin>>row>>col;

cout<<"请输入矩阵A的元素:\n";

for(i=0;i

for(j=0;j

cin>>A[i][j];

cout<<"请输入矩阵B的元素:\n";

for(i=0;i

for(j=0;j

cin>>B[i][j];

CreateMat(A,a,row,col);

CreateMat(B,b,row,col);

cout<<"矩阵A的三元组表示为:\n";

DispMat(a);

cout<<"矩阵B的三元组表示为:\n";

DispMat(b);

if(MatAdd(a,b,c))

{

cout<<"矩阵A、B相加后得到的三元组表示为:\n";

DispMat(c);

}

return 0;

}

7.简述字符串与一维字符型数组的区别与联系。

字符串简称串,它是一种以字符为元素的特殊线性表。字符串可以看成是以字符为元素的一维数组。具体实现时,在C/C++中的字符串使用为字符型数组来表示。为了便于确定字符串的结尾,在字符型数组中使用\0(就是0)作为字符串的截止符。

8.列举一些需要进行字符串模式匹配的应用场景。

例如,在文本编辑中经常要查找某一特定单词或者一段话在整篇文章中出现的位置,按照姓名查找某个学生、员工、居民。有效的模式匹配能极大地提高文本编辑程序的能力。

9.列举几个字符串的其他操作。

求字符串中某个子串出现的次数,删除满足条件的子串,字符串字符移位等。

10.什么是广义表?广义表与线性表的区别是什么?

广义表又称列表,是由n(n≥0)个元素组成的有穷序列:GL=(e1,e2,……e n),但与线性表不同的是,广义表中的元素允许以不同的形式出现:它可以是一个原子(逻辑上不能再分解的元素),也可以是另一个广义表。

11.一个广义表是(a, (a, b, c), d, e, (m, n),(w, (i, j), x)),请问该广义表的长度、深度分别是多少?请画出该广义表的单链表存储结构示意图。

该广义表的深度是3,长度是6。

该广义表的单链表存储结构示意图如下:

12.请列举出一些可以归纳成数组、矩阵、字符串和广义表数据结构的实际问题。

线性表的顺序存储、学生编号和姓名的问题、各班级的学生编号和姓名的问题等,都可以归结为数组。

不同物品所需原材料的数量、不同产地原材料的价格、不同类型的住宅需要的物品数量等,不同学生的计算机成绩,不同职工的工资等都可以归结为矩阵。

学生的姓名和学号、学校或各单位的名称、国家名称、一篇文章、一个高级语言源程序等,都可归结为字符串。

应用高斯消元法求解方程组可以归结为广义表。

第5章树和二叉树

1. 请简述树、二叉树、满二叉树和完全二叉树的结构特性。

树:只有最顶层的结点没有前驱,其余结点都有且只有一个前驱;一个结点可以没有后继,也可以有一个或多个后继。

二叉树:一种特殊形态的树,每个结点至多有两个后继。

满二叉树:一种特殊形态的二叉树,除了最后一层的结点为叶子结点外其它结点都有左、右两棵子树的二叉树。

完全二叉树:一种特殊形态的二叉树,其结点与相同深度的满二叉树中的结点编号完全一致,即对于深度为k的完全二叉树,其前k-1层与深度为k的满二叉树的前k-1层完全一样,只是在第k层上有可能缺少右边若干个结点。

2. 请解释结点的度、树的度、结点的层、树的深度、分支、路径、路径长度、树的路径长度、叶子结点、分支结点、内部结点、孩子、双亲、兄弟、堂兄弟、祖先、子孙、有序树、无序树和森林等基本术语的含义。

结点的度和树的度:一个结点的后继的数目称为该结点的度,树中各结点度的最大值称为树的度。

结点的层和树的深度:树的根结点所在的层为第1层,其余结点的层等于其前驱结点的层加1,树中各结点的层的最大值称为树的深度。

分支、路径、路径长度和树的路径长度:从一个结点到其后继结点之间的连线称为一个分支,从一个结点X到另一个结点Y所经历的所有分支构成结点X到结点Y的路径,一条路径上的分支数目称为路径长度,从树的根结点到其他各个结点的路径长度之和称为树的路径长度。

叶子结点、分支结点和内部结点:树中度为0的结点称为叶子结点(或终端结点),度不为0的结点称为分支结点(或非终端结点),除根结点以外的分支结点也称为内部结点。

孩子和双亲:在树中,一个结点的后继结点称为该结点的孩子,相应地,一个结点的前驱结点称为该结点的双亲,即一个结点是其孩子结点的双亲、其双亲结点的孩子。

兄弟和堂兄弟:同一双亲的孩子结点之间互称为兄弟,不同双亲但在同一层的结点之间互称为堂兄弟。

祖先和子孙:从树的根结点到某一个结点X的路径上经历的所有结点(包括根结点但不包括结点X)称为结点X的祖先,以某一结点X为根的子树上的所有非根结点(即除结点X外)称为结点X的子孙。

有序树和无序树:对于树中的任一结点,如果其各棵子树的相对次序被用来表示数据之间的关系,即交换子树位置会改变树所表示的内容,则称该树为有序树;否则称为无序树。

森林:m(m≥0)棵互不相交的树的集合就构成了森林。

3. 请简述二叉树的五条基本性质。

性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。

性质2:深度为k的二叉树至多有2k-1个结点。

性质3:在二叉树中,若度为0的结点(即叶子结点)数为n0,度为2的结点数为n2,则n0=n2+1。

性质4:具有n个结点的完全二叉树其深度为?log2n?+1(其中?log2n?表示不大于log2n 的最大整数)。

性质5:采用顺序编号的完全二叉树具有如下性质:若一个分支结点的编号为i,则其

左子树的根结点(即左孩子结点)编号为2*i,右子树的根结点(即右孩子结点)编号为2*i+1;反之,若一个非根结点的编号为i,则其双亲结点的编号为?i/2?(其中?i/2?表示不大于i/2的最大整数)。

4. 请简述二叉树的常用操作及各操作的含义。

创建一棵空二叉树:创建一棵没有任何结点的二叉树。在顺序表示中,根据树的深度为结点分配内存;在二叉链表表示中,将指向根结点的指针赋值为NULL。

删除一棵二叉树:将二叉树各结点所占据的内存释放。

清空二叉树:将二叉树的所有结点删除,使之成为一棵空二叉树。

以指定元素值创建根结点:创建根结点,并以指定值作为根结点的元素值。

将一个结点作为指定结点的左孩子插入:根据指定元素值生成一个新结点,并将其作为指定结点的左孩子。

将一个结点作为指定结点的右孩子插入:根据指定元素值生成一个新结点,并将其作为指定结点的右孩子。

先序遍历二叉树:也称为先根遍历,其访问方式递归定义如下:对于一棵二叉树,先访问其根结点,再访问根结点的左、右子树;对于左、右子树中的结点仍然是按照先序遍历方式访问,即先访问根结点,再访问根结点的左、右子树。

中序遍历二叉树:也称为中根遍历,其访问方式递归定义如下:对于一棵二叉树,先访问根结点左子树,再访问根结点,最后访问右子树;对于左、右子树中的结点仍然是按照中序遍历方式访问。

后序遍历二叉树:也称为后根遍历,其访问方式递归定义如下:对于一棵二叉树,先访问根结点的左子树,后访问右子树,最后访问根结点;对于左、右子树中的结点仍然是按照后序遍历方式访问。

逐层遍历二叉树:从第1层开始依次对每层中的结点按照从左至右的顺序进行访问。

获取指定结点的双亲结点:根据指定结点获取其双亲结点。在顺序表示中,可以直接根据指定结点的位置计算双亲结点的位置;在二叉链表表示中,则需要从根结点开始遍历二叉树直至找到指定结点的双亲结点。

删除以指定结点为根的子树:将以指定结点为根结点的子树上的所有结点(包括指定结点)删除。

按关键字查找结点:按照某种规则(先序、中序、后序或逐层)依次访问二叉树中的每一结点,直至找到与关键字匹配的结点。

判断二叉树是否为空:判断一棵二叉树是否为空二叉树。

修改指定结点的元素值:将指定结点的元素值修改为指定值。

计算二叉树的深度:按照某种规则依次访问二叉树中的每一结点,计算各结点所在层的最大值。

计算二叉树的叶子结点数:按照某种规则依次访问二叉树中的每一结点,计算度为0的结点数。

5. 请简述顺序表示的二叉树中各结点的编号规则。

顺序表示的二叉树中各结点的编号与相同深度的完全二叉树中对应结点的编号相同。

6. 请简述二叉链表表示和三叉链表表示的二叉树中结点的结构。

在二叉链表表示中,双亲结点有指向其孩子结点的指针,而孩子结点不包含指向其双亲结点的指针;在三叉链表表示中,双亲结点有指向其孩子结点的指针,而孩子结点也包含指向其双亲结点的指针。

7. 请简述二叉树的四种遍历方式及每一种遍历方式中结点的访问顺序。

先序遍历二叉树:也称为先根遍历,其访问方式递归定义如下:对于一棵二叉树,先

访问其根结点,再访问根结点的左、右子树;对于左、右子树中的结点仍然是按照先序遍历方式访问,即先访问根结点,再访问根结点的左、右子树。

中序遍历二叉树:也称为中根遍历,其访问方式递归定义如下:对于一棵二叉树,先访问根结点左子树,再访问根结点,最后访问右子树;对于左、右子树中的结点仍然是按照中序遍历方式访问。

后序遍历二叉树:也称为后根遍历,其访问方式递归定义如下:对于一棵二叉树,先访问根结点的左子树,后访问右子树,最后访问根结点;对于左、右子树中的结点仍然是按照后序遍历方式访问。

逐层遍历二叉树:从第1层开始依次对每层中的结点按照从左至右的顺序进行访问。

8. 已知一棵二叉树的先序遍历结果为A 、B 、D 、G 、C 、E 、F 、H 、I ,中序遍历结果为D 、G 、B 、A 、E 、C 、H 、F 、I ,请给出该二叉树的后序遍历结果。

G 、D 、B 、E 、H 、I 、F 、C 、A

9. 已知一棵二叉树的中序遍历结果为D 、G 、B 、A 、E 、C 、H 、F 、I ,后序遍历结果为G 、

D 、B 、

E 、H 、I 、

F 、C 、A ,请给出该二叉树的先序遍历结果。

A 、

B 、D 、G 、

C 、E 、F 、H 、I

10. 已知一棵二叉树的先序遍历结果为A 、B 、D 、G 、C 、E 、F 、H 、I ,后序遍历结果为G 、

D 、B 、

E 、H 、I 、

F 、C 、A ,请给出该二叉树的中序遍历结果。

D 、G 、B 、A 、

E 、C 、H 、

F 、I

11. 请简述哈夫曼树的结构特性。

哈夫曼树,又称最优二叉树,是指在由n 个叶子结点构成的一类二叉树中具有最短带权路径长度的二叉树。

12. 请简述结点的权、结点的带权路径长度、树的带权路径长度等基本术语的含义。

结点的权和结点的带权路径长度:在实际应用中,往往给树中的结点赋予一个具有某种意义的实数,该实数就称为是结点的权。结点的带权路径长度是指从树根到该结点的路径长度与结点的权的乘积。

树的带权路径长度:是指树中所有叶子结点的带权路径长度之和,记为∑==n

i i i L W WPL 1(其中,n 为叶子结点的数目,W i 为第i 个叶子结点的权,L i 为根结点到第i 个叶子结点的路径长度,可知W i L i 为第i 个叶子结点的带权路径长度)。

13. 请简述哈夫曼树的构造方法。

哈夫曼树的构造方法如下:

(a )已知n 个权值为W i (i =1, 2, …, n )的结点,将每个结点作为根结点生成n 棵只有根结点的二叉树T i ,形成森林F ={T 1, T 2, …, T n }。

(b )从森林F 中选出根结点权值最小的两棵二叉树T p 和T q ,并通过添加新的根结点将它们合并为一棵新二叉树,新二叉树中T p 和T q 分别作为根结点的左子树和右子树,且根结点的权值等于T p 和T q 两棵二叉树的根结点权值之和。以合并后生成的新二叉树替代森林F 中的原有二叉树T p 和T q 。重复该步骤直至森林F 中只存在一棵二叉树。

14. 请简述哈夫曼码的作用及其编码方法。

哈夫曼编码是指将用其他编码法表示的字符序列转成用哈夫曼码表示以减少存储空间,其具体方法为:

(a )以要编码的字符集C ={c 1, c 2, …, c n }作为叶子结点、字符出现的频度或次数W ={w 1, w 2, …, w n }作为结点的权,构造哈夫曼树。

(b )规定哈夫曼树中,从根结点开始,双亲结点到左孩子结点的分支标为0,双亲结点到右孩子结点的分支标为1。从根结点到某一叶子结点经过的分支形成的编码即是该叶子

结点所对应字符的哈夫曼码。

15. 请简述树的四种常用表示方式。

双亲表示法:在孩子结点中设置一个指针域记录其双亲结点的存储位置。

孩子表示法:在双亲结点中设置指向孩子结点的指针域来表示一棵树。

孩子双亲表示法:综合了孩子表示法和双亲表示法的特点,既在孩子结点中设置记录双亲结点位置的指针域,又在双亲结点中设置记录孩子结点位置的指针域。

孩子兄弟表示法:又称为二叉链表表示法,与二叉树的二叉链表表示法存储结构完全相同,只是结点中指针域的含义有所不同(一个指针域指向该结点的第一个孩子结点,另一个指针域指向该结点的下一个兄弟结点)。

16. 请简述森林转换为二叉树的具体步骤。

将森林中的每棵树都用二叉链表表示法表示,并将各棵二叉树的根结点看做是兄弟结点,在它们之间加上连线;将结点到第一个孩子结点的连线作为左子树的边,结点到兄弟结点的连线作为右子树的边。

17. 请简述二叉树转化为树或森林的具体步骤。

将一个结点左子树的边作为该结点指向第一个孩子结点的连线,右子树的边作为该结点到兄弟结点的连线;在双亲结点和它的各孩子结点之间加上连线,并删除兄弟结点之间的连线,得到一棵树或一个包含若干棵树的森林。

第6章 图

1. 请简述图的结构特性。

图G 由顶点(图中通常将结点称为顶点)的非空有限集合V 和边的集合E 组成,记为G=(V, E)。每一个顶点偶对就是图中的一条边,所以,E 用于表示V 上的连接关系。在一个图中,至少要包含一个顶点,但可以没有任何边。

2. 请解释有向图、无向图、弧、弧尾、弧头、顶点的度、顶点的入度、顶点的出度、路径、路径长度、回路、简单回路、连通图、单向连通图、强连通图、子图、连通分量、强连通分量、权、带权图、生成树、最小生成树等基本术语的含义。

有向图、弧、弧尾和弧头:若E(G)中的顶点偶对是有序的,则这些有序偶对就形成了有向边,此时图G 称为有向图。其中,有向边也简称为弧。在有向图G 中,对于一条从顶点v i 到顶点v j 的弧,记为并有∈E(G),称v i 为弧尾,v j 为弧头。

无向图:若E(G)中的顶点偶对是无序的,则这些无序偶对就形成了无向边,此时图G 称为无向图。

顶点的度、顶点的入度和顶点的出度:在无向图中,与顶点v i 相关联的边的数目称为顶点v i 的度。在有向图中,以顶点v i 为弧头的弧的数目称为顶点v i 的入度;以顶点v i 为弧尾的弧的数目称为v i 的出度;顶点v i 的入度和出度之和称为v i 的度。

路径和路径长度:在图G 中,若存在一个顶点序列(0i v ,1i v , …, 1-n i v ),使得对于任意

0≤j∈<+(若G 为有向图)或E(G))v ,(v 1j i j i ∈+(若G 为无向图),则该序

列是从顶点0i v 到顶点1-n i v 的一条路径。一条路径中边的数目称为路径长度。

回路和简单回路:在一条路径中,若组成路径的顶点序列中第一个顶点与最后一个顶点相同,则该路径称为回路(或环);在一个回路中,若除第一个顶点与最后一个顶点外,其他顶点只出现一次,则该回路称为简单回路(或简单环)。

连通图:无向图G 中,若任意两个顶点都是连通的,则称G 为连通图。

单向连通图和强连通图:有向图G 中,若任意两个顶点都是单向连通的,则称G 是单向连通图;若任意两个顶点都是强连通的,则称G 为强连通图。

子图:对于图G 、G',若满足V(G))V(G'?且E(G))E(G'?,则G'是G 的子图。 连通分量和强连通分量:一个无向图的极大连通子图称为该无向图的连通分量;一个有向图的极大强连通子图称为该有向图的强连通分量。

权和带权图:可以为一个图中的每条边标上一个具有某种意义的实数,该实数就称为是边的权。边上带权的图就称为带权图。

生成树和最小生成树:若无向图G 的一个子图G'是一棵包含图G 所有顶点的树,则G'称为图G 的生成树。在所有形式的生成树中,边上的权之和最小的生成树,称为最小生成树。

3. 请列举可以用图来描述的实际问题。

请参考例6-1和例6-2。

4. 请简述图的基本操作及各操作的含义。

创建图:创建不包含任何顶点和边的空图。

对图作深度优先遍历:类似于树的先序遍历,即从某一个顶点开始访问,访问后将该顶

点去除得到若干子图,对每个子图再依次进行深度优先遍历。

对图作广度优先遍历:类似于树的逐层遍历,即先从某一个顶点开始访问,然后访问与该顶点相邻接且未被访问过的顶点集V 1(G),再访问与V 1(G)中顶点相邻接且未被访问过的顶点集V 2(G),重复该过程直至与初始顶点连通的所有顶点都被访问完。对于非连通图或非强连通图,还要从某一个未被访问的顶点开始重复上一过程,直至所有顶点访问完毕。

获取顶点数目:获取图中所包含的顶点的数目。

获取边的数目:获取图中所包含的边的数目。

获取与指定顶点相关联的第一条边:对无向图,获取到与指定顶点相关联的第一条边;对有向图,获取到以指定顶点作为弧尾的第一条弧。不同表示方法获取到的结果会有所不同(邻接矩阵法按顶点编号顺序,邻接压缩表和邻接链表按边的添加顺序)。

获取与指定边有相同关联顶点的下一条边:对无向图,获取到与指定边(nV1,nV2) 有相同关联顶点nV1的下一条边;对有向图,获取到与指定弧有相同弧尾nV1的下一条弧。不同表示方法获取到的结果会有所不同(邻接矩阵法按顶点编号顺序,邻接压缩表和邻接链表按边的添加顺序)。

添加一个顶点:向图中添加一个新顶点。

添加一条边:对无向图,向图中添加一条新边;对有向图,向图中添加一条新弧。 获取一个顶点中存储的数据:根据顶点编号获取该顶点中存储的数据。

判断一条边是否存在:对无向图,判断两个顶点nV1和nV2之间是否存在边;对有向图,判断是否存在从顶点nV1到顶点nV2的弧。

设置一条边的权:对无向图,设置指定边(nV1,nV2)上的权;对有向图,设置指定弧上的权。

获取一条边的权:对无向图,获取指定边(nV1,nV2)上的权;对有向图,获取指定弧上的权。

5. 请简述图的三种常用表示方法。

邻接矩阵法:用矩阵来表示各顶点之间的连接关系。对于有n 个顶点的图G=(V, E),其邻接矩阵A 为n*n 的方阵,元素A[i][j](0≤i,j

???∞=ij

w j i A ]][[对无向图存在)

(,)(),(G E v v G E v v j i j i >∈<∈,对有向图存在反之

其中,w ij 为边(v i , v j )或上的权。

邻接压缩表:邻接矩阵的一种压缩表示形式,使用3个顺序表来表示图中顶点之间的连接关系和权。设图中共有n 个顶点{v 0, v 1, …, v n-1},3个顺序表分别为s 、w 和h 。在s 中依次记录与顶点v i (i = 0, 1, …, n -1)相关联的顶点;在w 中依次记录s 中存储的各条边的权;在h 中依次记录与顶点v i 相关联的顶点在s 中的起始存储位置。

邻接链表:图的一种链式存储结构。每个顶点中设置一个指向链表头的指针,在链表中保存与该顶点相邻接的顶点信息(包括顶点位置及两个顶点形成的边的权)。

6. 请简述图的两种常用遍历方法及每一种遍历方法中结点的访问顺序。

广度优先遍历:类似于树的逐层遍历,即先从某一个顶点开始访问,然后访问与该顶点相邻接且未被访问过的顶点集V 1(G),再访问与V 1(G)中顶点相邻接且未被访问过的顶点集V 2(G),重复该过程直至与初始顶点连通的所有顶点都被访问完。对于非连通图或非强连通图,还要从某一个未被访问的顶点开始重复上一过程,直至所有顶点访问完毕。

深度优先遍历:类似于树的先序遍历,即从某一个顶点开始访问,访问后将该顶点去

除得到若干子图,对每个子图再依次进行深度优先遍历。

7. 请列举最小生成树和最短路径可以用于解决什么应用问题。

请参考例6-1和例6-2。

8. 请简述Prim 算法的作用和具体步骤。

Prim 算法用于最小生成树问题求解。对于有n 个顶点的图G=(V, E),Prim 算法从空树T 开始,按照以下规则将n 个顶点和n-1条边依次添加到树中,形成最小生成树:

(a )从某一顶点v 0'开始,将该顶点作为树的根结点加入到T 中,使得T 中的数据元素集合D={v 0'},数据元素关系集合R={}。

(b )对于一个顶点在集合D 中、另一个顶点在集合V-D 中的那些边,找出权最小的一条边,将该边在集合V-D 中的顶点v i '(i=1,2,…,n -1)加入到集合D 中,并将顶点间关系(j

(c )重复上一步骤直至集合D 中包括图G 中所有n 个顶点(此时关系集合R 中包括n-1条边)。若在某一步骤中找不到边,则说明图G 是一个非连通图或非强连通图,在这种情况下不存在最小生成树。

9. 请简述Kruskal 算法的作用和具体步骤。

Kruskal 算法用于最小生成树问题求解。对于有n 个顶点的图G=(V, E),Kruskal 算法根据图G 中所有n 个顶点生成一个包括n 棵只有根结点的树T i (i=0, 1, …, n -1)的森林F ,并按照以下规则森林F 中的树合并,形成最小生成树:

(a )从边集合E 中选取未被访问过且具有最小权的边,置该边状态为已访问。判断该边的两个顶点是否属于不同的树,若属于不同的树则使用该边将两棵树合并为一棵;若属于同一棵树则不做任何处理。

(b )重复上一步骤直至森林F 中只剩下一棵树,该树即是图G 的最小生成树。若最后森林F 中剩下不止一棵树,则说明图G 是非连通图或非强连通图,在这种情况下不存在最小生成树。

10. 请简述Dijkstra 算法的作用和具体步骤。

Dijkstra 算法用于计算从某个顶点到其余各顶点的最短路径。对于有n 个顶点的图G=(V, E),若要计算从顶点v 0'到其余各顶点v i '(i=1,2,…,n -1)的最短路径,则其计算步骤为:

(a )令集合S 为已计算出最短路径的顶点集合(初始时S={v 0'}),w(v j ', v i ')表示从顶点v j '到顶点v i '的边的权(这里为方便计算,令w(v i ', v i ')=0),D(v 0', v i ')表示当前计算得到的从顶点v 0'到顶点v i '的最短路径长度(初始D(v 0', v i ')= w(v 0', v i '))。

(b )将顶点))'v ,'(D(v argmin 'v i 0S

V 'v m i -∈=加入到集合S 中,并将从顶点v 0'到顶点v m '的最短

路径记录下来。若仍有顶点没有加到集合S 中,则对集合V-S 中的顶点v i '计算))'v ,'w(v )'v ,'(D(v min )'v ,'D(v i j j 0S

'v i 0j +=∈。 (c )重复上一步骤直至图中所有顶点都加到集合S 中。

11. 请简述Floyd 算法的作用和具体步骤。

Floyd 算法用于计算每一对顶点之间的最短路径。对于有n 个顶点的图G=(V, E),若要计算任意两个顶点v j '和v k '(j,k 为[0,n-1]区间上的整数且j≠k )之间的最短路径,则其计算步骤为:

(a )令w(v j ', v k ')表示连接顶点v j '和顶点v k '的边的权(这里为方便计算,令w(v j ', v j ')=0),D(v j ', v k ')表示当前计算得到的从顶点v j '到顶点v k '的最短路径长度(初始D(v j ', v k ')= w(v j ', v k '))。

(b )对于图中每一个顶点v i '(i 依次取值为0, 1, …, n -1)

,若D(v j ',v k ')>D(v j ',v i ')+D(v i ',v k '),

则表明路径(v j', …, v i', …, v k')的长度更短,此时令D(v j',v k')=D(v j',v i')+D(v i',v k')并更新从顶点v j'到顶点v k'的路径。

严蔚敏版数据结构课后习题答案-完整版

第1章绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据

类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C)

数据结构与算法习题及答案

第1章绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成()。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 (2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。 A.存储结构B.存储实现 C.逻辑结构D.运算实现 (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 (4)以下说法正确的是()。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 (5)以下与数据的存储结构无关的术语是()。 A.顺序队列B.链表C.有序表D.链栈 (6)以下数据结构中,()是非线性数据结构 A.树B.字符串C.队D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90;y=100; while(y>0) if(x>100) {x=x-10;y--;} elsex++; (2)for(i=0;i

数据结构习题及答案——严蔚敏_课后习题答案 精品

第一章绪论 选择题 1.组成数据的基本单位是() (A)数据项(B)数据类型(C)数据元素(D)数据变量 2.数据结构是研究数据的()以及它们之间的相互关系。 (A)理想结构,物理结构(B)理想结构,抽象结构 (C)物理结构,逻辑结构(D)抽象结构,逻辑结构 3.在数据结构中,从逻辑上可以把数据结构分成() (A)动态结构和静态结构(B)紧凑结构和非紧凑结构 (C)线性结构和非线性结构(D)内部结构和外部结构 4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。 ①(A)数据元素(B)计算方法(C)逻辑存储(D)数据映像 ②(A)结构(B)关系(C)运算(D)算法 5.算法分析的目的是()。 (A)找出数据结构的合理性(B)研究算法中的输入和输出的关系 (C)分析算法的效率以求改进(D)分析算法的易懂性和文档性 6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。 ①(A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法 ②(A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性 (C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性 二、判断题 1.数据的机内表示称为数据的存储结构。() 2.算法就是程序。() 3.数据元素是数据的最小单位。() 4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。() 5.算法的时间复杂度取决于问题的规模和待处理数据的初态。() 三、填空题 1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。 2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。 3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。 4.在图形结构中,每个结点的前驱结点数和后续结点数可以_________。 5.线性结构中元素之间存在________关系,树形结构中元素之间存在______关系,图形结构中元素之间存在_______关系。 6.算法的五个重要特性是_______、_______、______、_______、_______。 7.数据结构的三要素是指______、_______和________。 8.链式存储结构与顺序存储结构相比较,主要优点是________________________________。 9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________结构,为了方便插入一个元素,数据结构宜用____________结构。 四、算法分析题 1.求下列算法段的语句频度及时间复杂度参考答案: 选择题1. C 2.C 3. C 4. A、B 5. C 6.C、B

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构习题及参考答案

习题1 一、单项选择题 A1.数据结构是指()。 A.数据元素的组织形式 B.数据类型 C.数据存储结构 D.数据定义 C2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为()。 A.存储结构 B.逻辑结构 C.链式存储结构 D.顺序存储结构 D3.树形结构是数据元素之间存在一种()。 A.一对一关系 B.多对多关系 C.多对一关系 D.一对多关系 B4.设语句x++的时间是单位时间,则以下语句的时间复杂度为()。 for(i=1; i<=n; i++) for(j=i; j<=n; j++) x++; A.O(1) B.O(2n) C.O(n) D.O(3n) CA5.算法分析的目的是(1),算法分析的两个主要方面是(2)。 (1) A.找出数据结构的合理性 B.研究算法中的输入和输出关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 (2) A.空间复杂度和时间复杂度 B.正确性和简明性 C.可读性和文档性 D.数据复杂性和程序复杂性 6.计算机算法指的是(1),它具备输入,输出和(2)等五个特性。 (1) A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 (2) A.可行性,可移植性和可扩充性 B.可行性,确定性和有穷性 C.确定性,有穷性和稳定性 D.易读性,稳定性和安全性 7.数据在计算机内有链式和顺序两种存储方式,在存储空间使用的灵活性上,链式存储比顺序存储要()。 A.低 B.高 C.相同 D.不好说 8.数据结构作为一门独立的课程出现是在()年。 A.1946 B.1953 C.1964 D.1968 9.数据结构只是研究数据的逻辑结构和物理结构,这种观点()。 A.正确 B.错误 C.前半句对,后半句错 D.前半句错,后半句对

数据结构习题及答案精编版

第一章 1.在数据结构中,从逻辑上可以把数据结构分为(C ) A.动态结构和静态结构 B. 紧凑结构和非紧凑结构 C.线性结构和非线性结构 D. 内部结构和外部结构 ● 2.在数据结构中,与所使用的计算机无关的是( A ) A. 逻辑结构 B. 存储结构 C. 逻辑和存储结构 D. 物理结构 3.下面程序的时间复杂度为____O(mn)_______。 for (int i=1; i<=m; i++) for (int j=1; j<=n; j++ ) S+=i 第二章线性表 ●链表不具备的特点是(A) A 可以随机访问任一结点(顺序) B 插入删除不需要移动元素 C 不必事先估计空间 D 所需空间与其长度成正比 2. 不带头结点的单链表head为空的判定条件为(A ),带头结点的单链表head为空的判定条件为(B ) A head==null B head->next==null C head->next==head D head!=null ●3.在线性表的下列存储结构中,读取元素花费时间最少的是(D) A 单链表 B 双链表 C 循环链表 D 顺序表 ● 4.对于只在表的首、尾两端进行手稿操作的线性表,宜采用的存储结构为(C) A 顺序表 B 用头指针表示的单循环链表 C 用尾指针表示的单循环链表 D 单链表 ● 5.在一个具有n 个结点的有序单链表中插入一个新的结点,并保持链表元素仍然有序, 则操作的时间复杂度为( D ) A O(1) B O(log2n) C O(n2) D O(n) ● 6.在一个长度为n (n>1)的单链表上,设有头和尾两个指针,执行(B)操作与链表的长 度有关 A 删除单链表中第一个元素 B 删除单链表中最后一个元素 C 在第一个元素之前插入一个新元素 D 在最后一个元素之后插入一个新元素 ●7.与单链表相比,双向链表的优点之一是(D) A 插入删除操作更简单 B 可以进行随机访问 C 可以省略表头指针或表尾指针 D 顺序访问相邻结点更容易 ●8.若list是某带头结点的循环链表的头结点指针,则该链表最后那个链结点的指针域 (头结点的地址)中存放的是( B ) A list的地址 B list的内容 C list指的链结点的值 D 链表第一个链结点的地址 ●9.若list1和list2分别为一个单链表与一个双向链表的第一个结点的指针,则( B ) A list2比list1占用更多的存储单元 B list1与list2占用相同的存储单元 C list1和list2应该是相同类型的指针变量 D 双向链表比单链表占用更多的存储单元 10.链表中的每个链结点占用的存储空间不必连续,这句话正确吗? (不正确) 11. 某线性表采用顺序存储结构,元素长度为4,首地址为100,则下标为12的(第13个)元素的存储地址为148。V 100+4*12=148 11.在顺序表的(最后一个结点之后)插入一个新的数据元素不必移动任何元素。 12.若对线性表进行的操作主要不是插入删除,则该线性表宜采用(顺序)存储结构,若频繁地对线性表进行插入和删除操作,则该线性表宜采用( 链 )存储结构。

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构 习题答案

第1章概论 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的①C、数据信息在计算机中的②A以及一组相关的运算等的课程。 ①A.操作对象B.计算方法C.逻辑结构D.数据映象 ②A.存储结构B.关系C.运算D.算法 2. 计算机算法指的是① C ,它必具备输入、输出和② B 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 3.下面程序段的时间复杂度是D for(i=0;inext = p; p->next = s; B. s->next = p->next; p->next = s; C. s->next = p->next; p = s; D. p->next = s; s->next = p; 2.非空的不带头结点的循环单链表,首结点由first指向,尾结点由p指向,则满足: C A. p->next == NULL; B. p == NULL; C. p->next == first; D. p == first; 3.在一个长度为n的顺序存储的线性表中,删除第i个元素(0≤i≤n-1)时,需要移动多少个元素?C A. n-i B. n-i+1 C. n-i-1 D. I 4.在带头结点指针head的单链表中,链表为空的判断条件是?B A. head == NULL B. head->next == NULL C. head != NULL D. head->next == head; 5.在单链表中,指针p指向元素为x的结点,实现“删除x的后继”的语句是B A. p=p->next; B. p->next=p->next->next; C. p->next=p; D. p=p->next->next;

数据结构课后习题及答案

填空题(10 * 1’ = 10’) 一、概念题 .当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 .当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 .带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 .循环队列的引入,目的是为了克服假溢出。 .长度为0的字符串称为空串。 .组成串的数据元素只能是字符。 .设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 .为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 .广义表的深度是广义表中括号的重数 .有向图G可拓扑排序的判别条件是有无回路。 .若要求一个稠密图的最小生成树,最好用Prim算法求解。 . 直接定址法法构造的哈希函数肯定不会发生冲突。 .排序算法所花费的时间,通常用在数据的比较和交换两大操作。 .通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。 .对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。 .存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。 .抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。 .一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。 .在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s->prior= p->prior; s->next= p; p->prior- next= s; p->prior= s;。 .在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。 .队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 .栈是限定尽在表位进行插入或删除操作的线性表。 .在链式队列中,判定只有一个结点的条件是(Q->rear==Q->front)&&(Q->rear!=NULL)。 .已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x; p->next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 .循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt和(front=-1&&rear+1==MAXSIZE)。 .串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 .字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 .所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀疏矩阵。 .一维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种不同的存储方式。 .在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第i列非0元素的个数。 网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 .按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序﹑交换排序﹑插入排序归并排序等4类。 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 .直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 .设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 .下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(“abba”)返回1,?(”abab”)返回0. Int f (char*s) { Int i=0,j=0; 求串长*/

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

数据结构习题及答案——严蔚敏

第一章绪论 一、选择题 1.组成数据的基本单位是() (A)数据项(B)数据类型(C)数据元素(D)数据变量 2.数据结构是研究数据的()以及它们之间的相互关系。 (A)理想结构,物理结构(B)理想结构,抽象结构 (C)物理结构,逻辑结构(D)抽象结构,逻辑结构 3.在数据结构中,从逻辑上可以把数据结构分成() (A)动态结构和静态结构(B)紧凑结构和非紧凑结构 (C)线性结构和非线性结构(D)内部结构和外部结构 4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。 ① (A)数据元素(B)计算方法(C)逻辑存储(D)数据映像 ② (A)结构(B)关系(C)运算(D)算法 5.算法分析的目的是()。 (A)找出数据结构的合理性(B)研究算法中的输入和输出的关系 (C)分析算法的效率以求改进(D)分析算法的易懂性和文档性 6.计算机算法指的是(①),它必须具备输入、输出和(②)等5 个特性。 ① (A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法

② (A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性 (C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性 二、判断题 1.数据的机内表示称为数据的存储结构。() 2.算法就是程序。() 3.数据元素是数据的最小单位。() 4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。() 5.算法的时间复杂度取决于问题的规模和待处理数据的初态。() 三、填空题 1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。 2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。 3.在树形结构中,树根结点没有_______结点,其余每个结点有且只 有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。 4.在图形结构中,每个结点的前驱结点数和后续结点数可以 _________。 5.线性结构中元素之间存在________关系,树形结构中元素之间存 在______关系,图形结构中元素之间存在_______关系。 6.算法的五个重要特性是_______、_______、______、_______、

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

数据结构习题与答案

第 1 章绪论 课后习题讲解 1. 填空 ⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 【解答】数据元素 ⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。 【解答】数据项,数据元素 【分析】数据结构指的是数据元素以及数据元素之间的关系。 ⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。 【解答】集合,线性结构,树结构,图结构 ⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系 ⑸算法具有五个特性,分别是()、()、()、()、()。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性 ⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。 【解答】自然语言,程序设计语言,流程图,伪代码,伪代码 ⑺在一般情况下,一个算法的时间复杂度是()的函数。 【解答】问题规模 ⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。 【解答】Ο(1),Ο(nlog2n) 【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

数据结构复习题附答案

一.是非题 1. 数据结构(应该是抽象数据类型)可用三元式表示(D,S,P)。其中:D是数据对象,S是D上的关系,P是对D的基本操作集。(f) 2 简单地说,数据结构是带有结构的数据元素的集合。(t) 3 判断带头结点的非空循环单链表(头指针为L)中指针p所指结点是最后一个元素结点 的条件是:p->next==L。(t) 4 线性表的链式存储结构具有可直接存取表中任一元素的优点。(f) 5 线性表的顺序存储结构优于链式存储结构。(f) 6. 在单链表P指针所指结点之后插入S结点的操作是: P->next= S ; S-> next = P->next;。(f) (顺序弄反了S-> next = P->next; P->next= S ;) 7 对于插入、删除而言,线性表的链式存储优于顺序存储。(t) 8. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。(f) 9. 栈和队列是操作上受限制的线性表。(t) 10. 队列是与线性表完全不同的一种数据结构。(f) (栈和队列是操作上受限制的线性表) 11. 队列是一种操作受限的线性表,凡对数据元素的操作仅限一端进行。(f) (两端) 12. 栈和队列也是线性表。如果需要,可对它们中的任一元素进行操作。(f) ( “如果需要,可对它们中的任一元素进行操作.” 这里的意思是在O(1)的时间来读和改某个元素。比如数组的直接索引。 栈:如果需要,每一次只能对栈顶的元素进行操作 队列:如果需要,每一次只能对两端,或者只能对队列头的元素进行操作。) 13. 栈是限定仅在表头进行插入和表尾进行删除运算的线性表。(f) 14. 二叉树中每个结点有两个子结点,而对一般的树,则无此限制,所以,二叉树是树的特殊情形。(f) (二叉树和树相互独立) 15 二叉树是一棵结点的度最大为二的树。(f) (二叉树和树相互独立) 16 赫夫曼树中结点个数一定是奇数。(t) 17 在二叉树的中序遍历序列中,任意一个结点均处在其左孩子结点的后面。(t) (LDR) 18 假设B是一棵树,B′是对应的二叉树。则B的后根遍历相当于B′的后序遍历。(f) (后根遍历相当于中序遍历) 19. 通常,二叉树的第i层上有2i-1个结点。(f) (应该为1~2i-1个) 20. 中序线索二叉树的优点是便于在中序下查找直接前驱结点和直接后继结点。(t) 21 二叉树的先序遍历序列中,任意一个结点均处在其孩子结点的前面。(t) 22 由树结点的先根序列和后根序列可以唯一地确定一棵树。(t) 23 邻接多重表可以用以表示无向图,也可用以表示有向图。(f) (只能表示无向图,有向图用十字链表) 24 可从任意有向图中得到关于所有顶点的拓扑次序。(f) (带环图没有) 25 有向图的十字链表是将邻接表和逆邻接表合二为一的链表表示形式。(t)

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构习题参考答案

第1章概论 1.数据、数据元素、数据结构、数据类型的含义分别是什么? 数据:对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。 数据元素:数据的基本单位,在计算机程序中通常作为一个整体考虑。 数据结构:数据元素之间的关系+运算,是以数据为成员的结构,是带结构的数据元素的集合,数据元素之间存在着一种或多种特定的关系。 数据类型:数据类型是用来区分不同的数据;由于数据在存储时所需要的容量各不相同,不同的数据就必须要分配不同大小的内存空间来存储,所有就要将数据划分成不同的数据类型。数据类型包含取值范围和基本运算等概念。 2.什么是数据的逻辑结构?什么是数据的物理结构?数据的逻辑结构与物理结构的区别和联系是什么? 逻辑结构:数据的逻辑结构定义了数据结构中数据元素之间的相互逻辑关系。数据的逻辑结构包含下面两个方面的信息: ①数据元素的信息; ②各数据元素之间的关系。 物理结构:也叫储存结构,是指逻辑结构的存储表示,即数据的逻辑结构在计算机存储空间中的存放形式,包括结点的数据和结点间关系的存储表示。 数据的逻辑结构和存储结构是密不可分的,一个操作算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采与的存储结构。采用不同的存储结构,其数据处理的效率是不同的。因此,在进行数据处理时,针对不同问题,选择合理的逻辑结构和存储结构非常重要。 3.数据结构的主要操作包括哪些? 对于各种数据结构而言,他们在基本操作上是相似的,最常用的操作有: ●创建:建立一个数据结构; ●清除:清除一个数据结构; ●插入:在数据结构中增加新的结点; ●删除:把指定的结点从数据结构中删除; ●访问:对数据结构中的结点进行访问; ●更新:改变指定结点的值或改变指定的某些结点之间的关系; ●查找:在数据结构中查找满足一定条件的结点; ●排序:对数据结构中各个结点按指定数据项的值,以升序或降序重新排列。 4.什么是抽象数据类型?如何定义抽象数据类型? 抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。ADT是与具体的物理存储无关的数据类型,因此,不论ADT的内部结构如何变化,只要其数据结构的特性不变,都不影响其外部使用。 对抽象数据类型的描述一般用(D,R,P)三元组表示,抽象数据类型的定义格式为: ADT<抽象数据类型名> { 数据对象D:<数据对象的定义> 数据关系R:<数据关系的定义> 基本操作P:<基本操作的定义>

数据结构习题及答案 (1)

第八章查找 一、判断题 1.用二分查找法对一个顺序表进行查找,这个顺序表可以是按各键值排好序的,也可以是没有按键值排好序的。() 2.哈希表的查找不用进行关键字的比较。() 3.哈希表的定义函数H(key)=key%p(p<=m)这种方法是直接定址法。() 4.装填因子α的值越大,就越不容易发生冲突。( ) 5.选择hash函数的标准为:随机性好、均匀性好和尽量避免冲突。( ) 参考答案:1、×2、×3、×4、×5、√ 二、填空题 1.顺序查找法的平均查找长度为__________,二分查找法的平均查找长度为________,分块查找法(以顺序查找确定块)的平均查找长度为__________,分块查找法(以二分查找确定块〉的平均查找长度为_________,哈希表查找法采用链接法处理冲突时的平均查找长度为_________。 (n+1)/2;((n+1)*log2(n+1))/n-1;(s2+2s+n)/2s;log2(n/s+1)+s/2;1+α 2.在各种查找方法中,平均查找长度与结点个数n无关的查法方法是_________ 哈希表查找 3.二分查找的存储结构仅限于_________,且是__________。 顺序;有序的 4.在分块查找方法中,首先查找__________,然后再查找相应的___________。 索引;块 5.长度为255的表,采用分块查找法,每块的最佳长度是____________。 15 6.在散列函数H(key)=key%p中,p应取_______________。 小于表长的最大素数 7.假设在有序线性表A[1..20]上进行二分查找,则比较一次查找成功的结点数为 _________,则比较二次查找成功的结点数为__________,则比较三次查找成功的结点数为 _________,则比较四次查找成功的结点数为________,则比较五次查找成功的结点数为 _________,平均查找长度为_________。 ①1 ②2 ③4 ④8 ⑤5 ⑥3.7

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

数据结构习题及答案概论

第1章算法 一、选择题 1.算法的时间复杂度是指()。 A)执行算法程序所需要的时间 B)算法程序中的指令条数 C)算法执行过程中所需要的基本运算次数 D)算法程序的长度 2.算法的空间复杂度是指()。 A)算法程序的长度 B)算法程序所占的存储空间 C)算法执行过程中所需要的存储空间 D)算法程序中的指令条数 3.下面()的时间复杂度最好(即执行时间最短)。 log) A)O(n ) B)O(n 2 log ) D)O(n2) C)O(n n 2 4.下面累加求和程序段的时间复杂度为()。 int sum(int a[],int n) { int i, s=0; for (i=0;i

int i=0,s1=0,s2=0; while(ix) return 1; else return 0; } log) A)O(1 ) B)O(n 2 C)O(n ) D)O(n) 8.下面程序段的时间复杂度为() int fun(int n) { int i=1,s=1; while(s

相关文档
相关文档 最新文档