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

合集下载

(完整版)数据结构课后习题答案(可编辑修改word版)

(完整版)数据结构课后习题答案(可编辑修改word版)

第1 章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

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

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,±1,±2,… },字母字符数据对象是集合C={‘A’,‘B’,… ,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。

每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。

《数据结构》陈慧南 第10章

《数据结构》陈慧南 第10章
n−1
n( n − 1 ) ∑i = 2 i =1
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
9.2.3 冒泡排序
(48,36,68,72,12,48,02) 48,36,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,12,72,48,02) (36,48,68,12,72,48,02) (36,48,68,12,48,72,02) 36,48,68,12,48,72,02) 36,48,68,12,48,02,72) (36,48,68,12,48,02,72)
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
序列中两个元素R 序列中两个元素 i和Rj (i<j),且Ki=Kj,若 , 排序后仍保持p(i)<p(j),即Ri 仍然排在 j之 仍然排在R 排序后仍保持 , 则称所用的排序算法是稳定的。 反之, 前 , 则称所用的排序算法是稳定的 。 反之 , 称该排序算法是不稳定的。 称该排序算法是不稳定的。 如果待排序元素总数相对于内存而言较小, 如果待排序元素总数相对于内存而言较小 , 整个排序过程可以在内存中进行, 整个排序过程可以在内存中进行 , 则称之 为内部排序; 反之, 为内部排序 ; 反之 , 如果待排序元素总数 较多, 不能全部放入内存, 较多 , 不能全部放入内存 , 排序过程中需 访问外存, 则称之为外部排序。 访问外存 , 则称之为外部排序 。 本章讨论 内部排序。 内部排序。

南邮_数据结构作业答案讲解 49页PPT文档

南邮_数据结构作业答案讲解 49页PPT文档
第一章 习题讲解
1-19.确定下列各程序段的程序步,确定划线语句的执行次 数,计算它们的渐近时间复杂度。 (1) i=1; k=0;
do { k=k+10*i; i++;
} while(i<=n-1) 划线语句的执行次数为 n-1 ,渐近时间复杂度为O(n)
(2)i=1; x=0; do{ x++; i=2*i; } while (i<n);
01.08.2019
7
3-1. 设A,B,C,D,E五个元素依次进栈(进栈 后可立即出栈),问能否得到下列序列。若能得到 ,则给出相应的push和pop序列;若不能,则说 明理由。 (3)C,A,B,D,E
(3)不能得到该序列,在C出栈时,A和B在栈中 ,A比B先进栈,所以B应比A先出栈。
01.08.2019
01.08.2019
9
第四章 习题讲解
4-1. 设线性表采用顺序表示方式,并假定顺序表是 有序的(设表中元素已按非递减次序排列)。编写 函数,实现线性表的如下运算: (1)int Search_Insert(List *lst,T x)
后置条件:在有序的顺序表中搜索元素x。 •若x在表中,则返回x在表中的位置。 •否则,若表未满,则在表中插入新元素x,并且插 入后,线性表仍然是有序的,返回新元素x的位置; •若表已满,无法插入新元素,则返回-1。
② 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];

南邮数据结构答案

南邮数据结构答案

第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.编写程序实现对顺序表逆置。

(完整版)数据结构课后习题答案

(完整版)数据结构课后习题答案

第1章绪论1 •简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

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

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,士1,士2,…},字母字符数据对象是集合C={ ‘ A', ‘ B…,‘ Z,‘ a'b ',…,‘ z ' },学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

2 •试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。

每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。

数据结构课后习题标准答案

数据结构课后习题标准答案

数据结构课后习题标准答案————————————————————————————————作者:————————————————————————————————日期:7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。

(2)表示该图的邻接表。

(3)图中每个顶点的度。

解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。

7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。

(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。

数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。

visit[i]数组用来表示顶点i是否被访问过。

遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。

每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。

这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。

《数据结构》教材课后习题+答案

《数据结构》教材课后习题+答案

《数据结构》教材课后习题+答案数据结构第一章介绍数据结构是计算机科学中重要的概念,它涉及到组织和存储数据的方法和技术。

数据结构的选择对于算法的效率有着重要的影响。

本教材为读者提供了丰富的课后习题,以帮助读者巩固所学知识并提高解决问题的能力。

下面是一些选定的习题及其答案,供读者参考。

第二章线性表习题一:给定一个顺序表L,编写一个算法,实现将其中元素逆置的功能。

答案一:算法思路:1. 初始化两个指针i和j,分别指向线性表L的首尾两个元素2. 对于L中的每一个元素,通过交换i和j所指向的元素,将元素逆置3. 当i>=j时,停止逆置算法实现:```pythondef reverse_list(L):i, j = 0, len(L)-1while i < j:L[i], L[j] = L[j], L[i]i += 1j -= 1```习题二:给定两个线性表A和B,编写一个算法,将线性表B中的元素按顺序插入到线性表A中。

答案二:算法思路:1. 遍历线性表B中的每一个元素2. 将B中的元素依次插入到A的末尾算法实现:```pythondef merge_lists(A, B):for element in B:A.append(element)```第三章栈和队列习题一:编写一个算法,判断一个表达式中的括号是否匹配。

表达式中的括号包括小括号"()"、中括号"[]"和大括号"{}"。

答案一:算法思路:1. 遍历表达式中的每一个字符2. 当遇到左括号时,将其推入栈中3. 当遇到右括号时,判断栈顶元素是否与其匹配4. 当遇到其他字符时,继续遍历下一个字符5. 最后判断栈是否为空,若为空则表示括号匹配算法实现:```pythondef is_matching(expression):stack = []for char in expression:if char in "([{":stack.append(char)elif char in ")]}":if not stack:return Falseelif (char == ")" and stack[-1] == "(") or (char == "]" and stack[-1] == "[") or (char == "}" and stack[-1] == "{"):stack.pop()else:return Falsereturn not stack```习题二:利用两个栈实现一个队列。

南邮《数据结构-C语言描述》陈慧南主编答案

南邮《数据结构-C语言描述》陈慧南主编答案

第一章绪论1.(第14页,第(18)题)确定划线语句的执行次数,计算它们的渐近时间复杂度。

(1) i=1; k=0;do {k=k+10*i; i++;} while(i<=n-1)划线语句的执行次数为 n-1(n>=2),n=1时执行1次。

(2)i=1; x=0;do{x++; i=2*i;} while (i<n);划线语句的执行次数为⎡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。

(4)x=n;y=0;while(x>=(y+1)*(y+1)) y++;划线语句的执行次数为⎣√n ⎦。

第二章两种基本的数据结构2-4.Loc(A[i][j][k])=134+(i*n*p+j*p+k)*22-9.第34页习题(2).9void Invert(T elements[], int length){//length数组长度 // elements[]为需要逆序的数组 T e;for (int i=1;i<=length/2;i++){e=elements[i-1];elements[i-1]=elements[length-i];elements[length-i]=e;}}2-12.第34页习题(12)void pInvert(Node* first){Node *p=first,*q;first=NULL;while (p){q=p->Link; p->Link=first;first=p; p=q;}}第三章栈与队列1.第54页习题(1)设A、B、C、D、E五个元素依次进栈(进栈后可立即出栈),问能否得到下列序列。

若能得到,则给出相应的push和pop序列;若不能,则说明理由。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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; }
template <class T> bool LinkedStack<T>::GetTop(T &x) { if (IsEmpty()) { cout<<"Empty stack"<<endl; return false; } x=top->data; return true; } template <class T> bool LinkedStack<T>::Push(const T x) { Node <T> *q=new Node<T>; q->data=x; q->link=top; top=q; return true; }
3.2 设计共享栈。
0
n-1
↑ bottom1
↑ top1
↑ top2
↑ bottom2
定义一个足够大的栈空间。该空间的两端分别设为两个栈的 栈底,用bottom1和bottom2指示,让两个栈的栈顶,用top1和 top2指示,都向中间伸展,直到两个栈的栈顶相遇,才会发生 溢出。 栈空,两栈均空:top1=0且 top2=n-1 栈满:top1=top2-1
2.2 (2) 在类LinearList 中增加一个成员函数,将顺序表逆置,实现 该函数并分析算法的时间复杂度。不利用类SeqList 提供的操作直接 实现。 template <class T> void SeqList<T>::Invert() { T e; for (int i=0;i<length/2;i++) { e=elements[i]; elements[i]=elements[length-i-1]; elements[length-i-1]=e; } }
}
//解法三 不用栈,也不用数组,只用一个计数器top,记录“(”的个数 。 bool match(char a[],int n) { int top=-1; for (int i=0;i<n;i++) if (a[i]=='(') top++; else if (a[i]==')') if (top>-1) top--; //继续检查 else return true; //不匹配 if (top>-1) return true; return false; //匹配 //不匹配
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; } }
//解法二 不用栈,用一个字符数组 bool match(char a[],int n) { char c[n]; int top=-1; for (int i=0;i<n;i++) if (a[i]==‘(’) { top++; s[top]=a[i]; } else if (a[i]==')') if (top>-1) { s[top]=0; top--; } //继续检查 else return true; //不匹配 if (top>-1) return true; return false; //匹配 //不匹配
3.4写出下列表达式的后缀形式。 ① /+ab+cd ③ -*~ac/b^c2 ② -^b2**4ac ④ +*+abc/d+ef
⑤ -*+ab+*cde*ac
3.9 利用栈可以检查表达式中括号是否配对,试编写算法实现之。 //若不匹配,则返回true,否则返回false //解法一 bool match(char a[],int n) { SeqStack<char> s(n); char c; for (int i=0;i<n;i++) if (a[i]==‘(’) s.Push(a[i]) //判栈满? else if (a[i]==')') if (!s.Empty()) s.Pop(); //继续检查 else return true; //不匹配 if (!s.Empty()) return true; //不匹配 return false; //匹配 }
template <class T> void Difference(SeqList<T> &LA,SeqList<T> &LB) { int m=LA.Length(); SeqList<T> LC(10); T x; for (int i=1;i<=m;i++) { LA.Find(i,x); if (LB.Search(x)==0) LC.Insert(LC.Length()+1,x); } cout<<LC; } void main() { SeqList <int> LA(10),LB(10); for (int i=1;i<=8;i++) LA.Insert(i,i); for (i=1;i<=3;i++) LB.Insert(i,i+3); InterSection(LA,LB); Difference(LA,LB); }
b
// 解法2 template<class T> void Merge1(CircularList<T> &a,CircularList<T> &b) { Node<T> *p=b.first->link; b.first->data=b.first->link->data; b.first->link=a.first->link; a.first->link=p->link; p->link=p; b.first=p; b.length=0; } // O(1)
a=5,b=13
first
2
5
7
9
13
15
2.8 设有单循环链表类CircularList,要求在类CircularList中增加一个 成员函数,在不增加新结点的情况下,直接实现两个链表合并为一个链表 的算法,并分析其时间复杂度。
// 解法1 template<class T> void Merge(CircularList<T> &a, CircularList<T> &b) { Node<T> *p=b.first; while (p->link!=b.first) p=p->link; p->link=a.first->link; a.first->link=b.first->link; b.first->link=b.first; b.length=0; } a // O(b.length)
1
i 1 j 1 43;1)(n+2)/6 。O(n3)
(4)x=n;y=0; while(x>=(y+1)*(y+1)) y++;
n>k2
划线语句的执行次数为 n 。O( n )
习题二(第37页)
2.1 利用线性表类LinearList提供的操作,实现两个集合的交和差运算。 #include <iostream.h> #include "seqlist0.h" #include "conio.h" template <class T> void InterSection(SeqList<T> &LA,SeqList<T> &LB) { int m=LB.Length(); SeqList<T> LC(10); T x; for (int i=1;i<=m;i++) { LB.Find(i,x); if (LA.Search(x)) LC.Insert(LC.Length()+1,x); } cout<<LC; }
相关文档
最新文档