南邮_数据结构作业答案讲解教学教材

合集下载

南邮陈慧南版数据结构课后习题答案

南邮陈慧南版数据结构课后习题答案

template <class T> void LinkedStack<T>::SetNull() { Node<T> *q; while (top) { q=top->link; delete top; top=q; } }
i k(循环次数) 2*i 1 1 21<n 2 2 22<n 2k-1 n 2k<n 2k<n, k<log2n, k=log2n
划线语句的执行次数为 log2n。O(log2n) (3) for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) for (int k=1;k<=j;k++) x++;
习题三(第50页)
3.1 设A、B、C、D、E五个元素依次进栈(进栈后可立即出栈),问 能否得到下列序列。若能得到,则给出相应的push和pop序列;若不 能,则说明理由。 1) A,B,C,D,E 2) A,C,E,B,D 3) C,A,B,D,E 4) E,D,C,B,A 答:2)和3)不能。对2)中的E,B,D而言,E最先出栈则表明,此 时B和D均在栈中,由于,B先于D进栈,所以应有D先出栈。同理3) 也不能。 (1)能。 push,pop,push,pop,push,pop,push,pop,push,pop (4)能。 push,push,push,push,push,pop,pop,pop,pop,pop
template <class T> bool LinkedStack<T>::IsEmpty() const { return !top; }
template <class T> bool LinkedStack<T>::IsFull() const { return false; }

数据结构第1-3章作业参考答案

数据结构第1-3章作业参考答案

数据结构第1~3章作业参考答案【1.4】【解法一】⑴抽象数据类型复数:ADT Complex{数据对象:D={ci|ci∈R, i=1,2, 其中R为实数集}数据关系:R={<c1,c2>| ci∈D, i=1,2, 其中c1为复数实部, c2为复数虚部}基本操作:InitComplex (&C,v1,v2)操作结果:构造一个复数C,元素c1, c2分别被赋以参数v1, v2的值。

DestroyComplex(&C)初始条件:复数C已存在。

操作结果:销毁复数C。

GetReal(C, &e)初始条件:复数C已存在。

操作结果:用e返回复数C实部的值。

Get Imaginary(C, &e)初始条件:复数C已存在。

操作结果:用e返回复数C虚部的值。

SetReal(&C, e)初始条件:复数C已存在。

操作结果:用e更新复数C实部的值。

Set Imaginary(&C, e)初始条件:复数C已存在。

操作结果:用e更新复数C虚部的值。

AdditionComplex (&C, C1, C2)初始条件:复数C1,C2已存在。

操作结果:复数C1与复数C2相加,用复数C返回其和。

SubstractComplex(&C, C1, C2)初始条件:复数C1,C2已存在。

操作结果:复数C1减去复数C2,用复数C返回其差。

MultipleComplex(&C, C1, C2 )初始条件:复数C1,C2已存在。

操作结果:复数C1与复数C2相乘,用复数C返回其积。

DividedComplex(&C, C1, C2)初始条件:复数C1,C2已存在,且C2≠0。

操作结果:复数C1除以复数C2,用复数C返回其商。

ModulusComplex(C, &e)初始条件:复数C已存在。

操作结果:求复数C的模,用e返回。

ConjugateComplex(&C, C1)初始条件:复数C1已存在。

南邮 数据结构A 习题9参考答案

南邮 数据结构A 习题9参考答案

9.1(2)(3)⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡0000011000110101000100100010010000009.29.4template <class T>void LGraph<T>::Degree(int *in) { for (int i=0;i<n;i++) { in[i]=0;}ENode<T> *p; for (i=0; i<n; i++) { p=a[i];while (p){in[p->adjvex]++;p=p->nextarc;}}for (i=0;i<n;i++){cout<<i<<": " << in[i] << "; " << endl;}}9.69.139.16设AOE网如图题9-4所示。

求各事件的可能的最早发生时间和允许的最迟发生时间,各活动可能的最早开始时间河运许的最晚开始时间,以及关键活动和关键路径及其长度。

关键路径:a 2,a 7,a 9. 长度:239.17使用普里姆算法以1为源点,画出图题9-5的无向图的最小代价生成树。

9.18使用克鲁斯 卡尔算法以,画出图题9-5的无向图的最小代价生成树9.21用迪杰斯特拉算法求图题9-6的有向图中以顶点A 为源点的单源最短路径。

写出一维数组d 和 path 在执行该算法的过程中各步的状态。

9.22用弗洛伊德算法求图题9-6的有向图的所有顶点之间的最短路径。

写出二维数组d 和path 在执行该算法的过程中各步的状态。

(1)初始状态dA pathAdCpathCdDpathDdE dG。

南邮数据结构答案

南邮数据结构答案

第1 章绪论一、基础题1. A2. C3. C4. A5. C二、扩展题1.数据是计算机加工处理的对象;数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理;数据项是组成数据元素的、不可分割的最小单位。

2.数据结构是按某种逻辑关系组织起来的数据元素的集合,使用计算机语言描述并按一定的存储方式存储在计算机中,并在其上定义了一组运算。

3.集合结构、线性结构、树形结构和图形结构。

集合结构中,元素之间没有关系;线性结构中,元素之间存在一对一的关系;树形结构中,元素之间存在一对多的关系,其中最多只有一个元素没有前驱元素,这个元素就是根;图形结构中,元素之间存在多对多的关系。

4.顺序存储、链式存储、索引存储和散列存储。

5.一个算法是对特定问题的求解步骤的一种描述,是指令的有限序列。

其特征包括:➢输入:算法有零个或多个输入➢输出:算法至少产生一个输出➢确定性:算法的每一条指令都有确切的定义,没有二义性。

➢能行性/可行性:可以通过已经实现的基本运算执行有限次来实现➢有穷性:算法必须总能在执行有限步之后终止6.联系:程序是计算机指令的有序集合,是算法用某种程序设计语言的表述,是算法在计算机上的具体实现。

区别:在语言描述上不同,程序必须是用规定的程序设计语言来写,而算法的描述形式包括自然语言、伪代码、流程图和程序语言等;算法所描述的步骤一定是有限的,而程序可以无限地执行下去,比如一个死循环可以称为程序,但不能称为算法。

7.正确性:算法的执行结果应当满足功能需求,无语法错误,无逻辑错误简明性:思路清晰、层次分明、易读易懂,有利于调试维护健壮性:当输入不合法数据时,应能做适当处理,不至于引起严重后果效率:有效使用存储空间和有高的时间效率最优性:解决同一个问题可能有多种算法,应进行比较,选择最佳算法可使用性:用户友好性8(1)执行次数为n-1(n>=2),n=1时执行1次;时间复杂度为O(n)。

(2)执行次数为⌈log3n⌉;时间复杂度为O(logn)(3) 执行次数为n2;时间复杂度为O(n2)(4)执行次数为⌊√n⌋ + 1;时间复杂度为O(√n)第2 章线性表1.A2.D3.B4.C5.B6.D7.D8.C9.A10.D1.编写程序实现对顺序表逆置。

南京邮电大学数据库系统课后习题答案

南京邮电大学数据库系统课后习题答案

R2(CNO, TNAME, TADDR) } F2={CNO→TNAME,TNAME→TADDR}, KEY=(CNO)
ρ中R1、R2的所有属性都是原子的,且没有非
主属性对候选键的部分函数依赖,达到2NF;
2021/4/14
28
(3) 试把R分解成3NF模式集,并说明理由;
2021/4/14
数据库系统
习题课二
8
第四章习题
4.21设有关系模式R(ABC ),其上的FD集为 F={ B→C,C→A }, 那么分解ρ={AB, AC}
相对于F是否是无损分解和保持FD?说明理由
解 (1) ρ中有R1(AB), R2(AC)
R1∩R2=A, R1-R2=B, R2-R1=C 在F中推导不出 A→B或A→C,ρ有损 (2) F1 ={B→A } , F2 = {C→A } (F1∪F2)+ ≠F+,丢失了B→C 分解ρ不保持函数依赖
2021/4/14
数据库系统
习题课二
9
第四章习题
第五章参考答案
• PP.180 5.14
• 某商业集团有三个实体集。一个是“公司”实体集, 属性有公司编号、公司名、地址等。二是“仓库”实 体集,属性有仓库编号、仓库名、地址等。三是“职 工”实体集,属性有职工编号、姓名、性别等。公司 与仓库间存在“隶属”关系,每个公司管辖若干个仓 库,每个仓库只属于一个公司管辖;仓库与间存在 “聘用”联系,每个仓库可聘用多个职工,每个职工 只能在一个仓库工作,仓库聘用职工有聘期和工资。 画出ER图,并在图上注明属性、联系的类型。转换成 关系模式集,并指出每个关系模式的主键和外键。
也可用域约束或断言
①在基表S的定义中,用检查子句
CHECK(AGE BETWEEN 16 AND 25) ②在基表SC的定义中,做以下说明:

南邮数据结构A习题9参考答案.docx

南邮数据结构A习题9参考答案.docx

9.1(3)「00000o-100100 010010 001010 110001 100000生成的邻接表9.4template <class T>void LGraph<T>::Degree(int *in) ( -for (int i=0;i<n;i++){in[i]=0;}ENode<T> *p;for (i=0; i<n; i++)P=a[i];while (p)(in[p->adjvex]++;p=p->nextarc;}}for (i=0;i<n;i++)(cout«i«n: " « in[i] «" « endl;}以2为起始顶点的深度优先搜索得到的生成树9.139. 16设A0E网如图题9-4所示。

求各事件的可能的最早发生时间和允许的最迟发生时间,各活动可能的最早开始时间河运许的最晚开始时间,以及关键活动和关键路径及其长度。

9.6O54333333352252222512511④所有可能的拓扑序列(b)按邻接表的拓扑序9.17以2为起始顶点的广度优先题图9.4关键路径:a.2, a?, ag. 长度:239. 17使用普里姆算法以1为源点,画出图题9-5的无向图的最小代价生成树。

9. 18使用克鲁斯卡尔算法以,画出图题9-5的无向图的最小代价生成树9. 21用迪杰斯特拉算法求图题9-6的有向图中以顶点A 为源点的单源最短路径。

写出一维数 组d 和path 在执行该算法的过程中各步的状态。

源点终点 最短路径 路径长度 AB (A, B) 3C (A, B, C) 4D (A, D) 4E (A, B, E) 4G _ 8Sd[A]path[A] d[B] path[B] d[C] path[C] d[D] path[D] d[E] path[E] d[G] path[G] A 0,-1 3, A °°, -1 4, A 5, A °°, -1 B 0,-1 3, A 4,B 4, A 4,B °°, -1 C 0,-1 3, A4,B4, A4,B°°, -1D 0,-1 3, A 4,B 4, A 4,B 8, -1E 0,-1 3, A 4,B 4, A 4,B °°, "I9. 22用弗洛伊德算法求图题9-6的有向图的所有顶点之间的最短路径。

数据结构(第二版)课后习题答案

数据结构(第二版)课后习题答案第一章:数据结构概述数据结构是计算机科学中非常重要的一个概念,它用于组织和管理计算机内部存储的数据。

数据结构的设计直接影响到程序的运行效率和对真实世界问题的建模能力。

第二版的《数据结构》教材旨在帮助读者更好地理解和应用数据结构。

为了提高学习效果,每章节后都附有一系列习题。

本文将为第二版《数据结构》教材中的部分习题提供详细的答案和解析。

第二章:线性表2.1 顺序表习题1:请问如何判断顺序表是否为空表?答案:当顺序表的长度为0时,即为空表。

解析:顺序表是用一块连续的内存空间存储数据元素的线性结构。

当顺序表中没有元素时,长度为0,即为空表。

习题2:如何求顺序表中第i个元素的值?答案:可以通过访问顺序表的第i-1个位置来获取第i个元素的值。

解析:顺序表中的元素在内存中是连续存储的,通过下标访问元素时,需要将下标减1,因为数组是从0开始编号的。

2.2 链表习题1:请问链表中的结点包含哪些信息?答案:链表的结点一般包含两部分信息:数据域和指针域。

解析:数据域用于存储数据元素的值,指针域用于存储指向下一个结点的指针。

习题2:如何删除链表中的一个结点?答案:删除链表中的一个结点需要将其前一个结点的指针指向其后一个结点,然后释放被删除结点的内存空间。

解析:链表的删除操作相对简单,只需要通过修改指针的指向即可。

但需要注意释放被删除结点的内存空间,防止内存泄漏。

第三章:栈和队列3.1 栈习题1:如何判断栈是否为空?答案:当栈中没有任何元素时,即为空栈。

解析:栈是一种先进后出(Last In First Out,LIFO)的数据结构,栈顶指针指向栈顶元素。

当栈中没有元素时,栈顶指针为空。

习题2:请问入栈和出栈操作的时间复杂度是多少?答案:入栈和出栈操作的时间复杂度均为O(1)。

解析:栈的入栈和出栈操作只涉及栈顶指针的改变,不受栈中元素数量的影响,因此时间复杂度为O(1)。

3.2 队列习题1:请问队列可以用哪些方式实现?答案:队列可以用数组或链表来实现。

南邮数据结构课后习题课


3.2 设计2个栈共享一个数组,画出示意图。 0 n-1
↑ bottom1
↑ ↑ ↑ ⑷写出下列表达式的后缀表达式: bottom2 ① top1 (a+b)/(c+d)top2 ab+cd+/
② b^2-4*a*c b2^4a*c*定义一个足够大的栈空间。该空间的两端分别设为两个栈 的栈底,用bottom1和bottom2指示,让两个栈的栈顶,用 top1和top2指示,都向中间伸展,直到两个栈的栈顶相遇, 才会发生溢出。 栈空,两栈均空:top1=0且 top2=n-1 栈满:top1=top2-1
答: 划线语句的执行次数为 n-1 。O(n)
(2)i=1; x=0; do { x++; i=2*i; } while (i<n);
划线语句的执行次数为 log2n。O(log2n) (3) for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) for (int k=1;k<=j;k++) x++; 划线语句的执行次数为 n(n+1)(n+2)/6 。O(n3)
O(n)
2.5 在类SingleList中增加一个成员函数,将单链表 逆置运算,直接实现该函数并分析其时间复杂度。 template <class T> void SingleList<T>::invert() { Node<T> *p=first,*q; first=NULL; while (p) { q=p->link; p->link=first; first=p; p=q; } }

南邮数据结构习题课


2.2 (2) 在类LinearList 中增加一个成员函数,将顺序 在类LinearList 中增加一个成员函数, 表逆置,实现该函数并分析算法的时间复杂度。 表逆置,实现该函数并分析算法的时间复杂度。不利用类 提供的操作直接实现。 SeqList 提供的操作直接实现。 template <class T> SeqList<T>:: ::Invert() void SeqList<T>::Invert() { T e; i=0 i<length/ for (int i=0;i<length/2;i++) { e=elements[i]; e=elements[i]; elements[i]=elements[length-1-i]; elements[i]=elements[length- i]; elements[length- i]=e; elements[length-1-i]=e; } } O(n)
b^2② b^2-4*a*c b2^4a*c*定义一个足够大的栈空间。该空间的两端分别设为两个栈 定义一个足够大的栈空间。 b2^4a*c*的栈底, bottom1 bottom2 指示, 让两个栈的栈顶, 的栈底 , 用 bottom1 和 bottom2 指示 , 让两个栈的栈顶 , 用 top1 top2指示,都向中间伸展,直到两个栈的栈顶相遇, top1和top2指示,都向中间伸展,直到两个栈的栈顶相遇, 才会发生溢出。 才会发生溢出。 栈空,两栈均空:top1 top2=n栈空,两栈均空:top1=0且 top2=n-1 栈满:top1=top2 栈满:top1=top2-1
template <class T> void Difference(SeqList<T> &LA,SeqList<T> &LB) m=LA.Length(); { int m=LA.Length(); LC(10 10) SeqList<T> LC(10); T x; for (int i=1;i<=m;i++) i=1 i<=m; LA.Find(i,x); { LA.Find(i,x); (LB.Search(x)==0 LC.Insert(LC.Length()+1,x); if (LB.Search(x)==0) LC.Insert(LC.Length()+1,x); } cout<<LC; cout<<LC; } void main() LA(10),LB(10 10),LB(10) { SeqList <int> LA(10),LB(10); i=1 i<=8 LA.Insert(i,i); for (int i=1;i<=8;i++) LA.Insert(i,i); (i=1 i<=3 LB.Insert(i,i+3 for (i=1;i<=3;i++) LB.Insert(i,i+3); InterSection(LA,LB); InterSection(LA,LB); Difference(LA,LB); Difference(LA,LB); }

南邮陈慧南版数据结构课后习题答案


}
65
if (p==root) root=root->lchild;
else q->rchild=p->lchild;
37
e=p->element;
25
delete p;
return true;
14
32
}
7.8 以下列序列为输入,从空树开始构造AVL搜索树。 (1)A,Z,B,Y,C,X (2)A,V,L,T,R,E,I,S,O,K
解:1 调用9.4中的函数InDg计算各个顶点的入度; 2 利用拓扑排序算法依次删去入度为0的顶点发出的边,若最后还
有入度不为0顶点,则该有向图存在有向回路,返回真值。
template <class T>
void LinkedGraph<T>::InDg(ENode<T> *a[],int n,int ind[])
int i,j,top=-1; //top为栈顶元素的下标 ENode<T> *p; for(i=0; i<n; i++)
if(!InDegree[i]) {
时间复杂度。
template <class E,class K>
bool BSTree<E,K>::Delete(E&e)
{ BTNode<E> *p=root,*q=p;
if (!p) return flse;
25
37
91
while (p->rchild)
{ q=p;
14
56
p=p->rchild;
if(!visited[i]) DFS1(i,visited,parent); delete []visited, []parent; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前置条件:x<y
后置条件:删除有序表中元素值在x和y之间( 含x和y)的所有元素。
2020/6/8
11
void Search_Delete(List *lst, T x, T y)
{
if (lst->Size==0)
{ printf(“The list is empty”); return -1; }
int i,j,sum=0;
for (i=0;temp[i]<x&&i<n;i++); //找到首个大于等于x的元素位置i
if(i>n-1) return; //没有符合条件的元素
ffoorr ((jj==ii;;ljs<tn[j;]<) =y&&j<n;j++); if (lst[j]>y//)找到首个//大大于于yy的的元元素素前位移置j
0 0 6 0 0 行三元组: 0 2 6 列三元组: 1 0
7
1
0
3
0
2
6
0 0 0 0 0
1 4 7
3 2 8
0
0
8
10
0
3
2
8
3
3
② if (IsFull(lst)) //或if(lst->Size==lst->maxList) return -1; //表已满时,无法插入,返回-1
for (j=lst->Size-1; j>=i; j--)
lst->Element[j+1]=lst->Element[j];
③ lst->Element[i]=x; //新元素即插入位置i处
lst.Size++;
return i;
//插入新元素并返回该元素的位置
}
2020/6/8
10
4-1. 设线性表采用顺序表示方式,并假定顺序表是 有序的(设表中元素已按非递减次序排列)。编写 函数,实现线性表的如下运算:
(2)void Search_Delete(List *lst, T x,T y)
2020/6/8
6
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得到 ,则给出相应的push和pop序列;若不能,则说 明理由。 (3)C,A,B,D,E
(3)不能得到该序列,在C出栈时,A和B在栈中 ,A比B先进栈,所以B应比A先出栈。
2020/6/8
{ T e; for (int i=1;i<length/2;i++) { e=elements[i-1]; elements[i-1]=elements[length-i]; elements[length-i]=e; }
}
2020/6/8
3
2-12.设计一个算法,将单链表中结点以逆序排列。逆序的单 链表中的结点均为原表中的结点。 Node* pInvert(Node* first) { Node *p=first, *q; first=NULL; while (p) { q=p->Link; p->Link=first; first=p; p=q; } return first; }
sum=j-i; lst[i++]=lst[j++]; while(ej<lsne) lst[i++]=lst[j/+/小+]于; 等于//删y的除元su素m删个除元素 n=n-sum; { j++; n--; }
}
2020/6/8
12
4.6 给出下列稀疏矩阵的行优先和列优先顺序存储 的行三元组和列三元组表示。
2020/6/8
5
第三章 习题讲解
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得 到,则给出相应的push和pop序列;若不能,则 说明理由。 (2)A,C,E,B,D
(2)不能得到该序列,在E出栈时,B和D在栈 中,B比D先进栈,所以D应比B先出栈。
2020/6/8
9
int Search_Insert(List *lst, T x)
{ int i,j;
for(i=0; (x>lst->Elements[i])&&(i<lst->Size);i++);
// 查找首个大于等于x的元素位置,并记录在i中
① if (lst->Elements[i]==x) return i; //x在表中时,返回x的位置
2020/6/8
8
第四章 习题讲解
4-1. 设线性表采用顺序表示方式,并假定顺序表是 有序的(设表中元素已按非递减次序排列)。编写 函数,实现线性表的如下运算: (1)int Search_Insert(List *lst,T x)
后置条件:在有序的顺序表中搜索元素x。 •若x在表中,则返回x在表中的位置。 •否则,若表未满,则在表中插入新元素x,并且插 入后,线性表仍然是有序的,返回新元素x的位置; •若表已满,无法插入新元素,则返回-1。
南邮_数据结构作业答案讲解
第二章 习题讲解
2-4.Loc(A[i][j][k])=134+(i*n*p+j*p+k)*2
2020/6/8
2
2-9. 设有长度为n 的一维整型数组A,设计一个算法,将原数 组中的元素以逆序排列
void Invert(T elements[], int length) //length数组长度 //elements[]为需要逆序的数组
7
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得到 ,则给出相应的push和pop序列;若不能,则说 明理由。 (4)E,D,C,B,A
(4)能得到该序列。 相应的push和pop序列为:push(A); push(B); push(C); push(D); push(E); pop(); pop(); pop(); pop(); pop();
2020/6/8
4
第三章 习题讲解
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得 到,则给出相应的push和pop序列;若不能,则 说明理由。 (1)A,B,C,D,E
(1)能得到该序列。 相应的push和pop序列为:push(A); pop(); push(B); pop(); push(C); pop(); push(D); pop(); push(E); pop();
相关文档
最新文档