清华殷人昆数据结构笔记ds05
数据结构教案(清华大学) ds

数据结构PPT教案(清华大学)DS 第一章:引言1.1 数据结构的概念数据结构的定义数据结构的应用场景数据结构的基本术语1.2 数据的抽象抽象数据类型(ADT)数据结构的表示数据结构的操作1.3 算法与数据结构的关系算法的定义算法与数据结构的关系算法分析与评估第二章:线性表2.1 线性表的定义线性表的概念线性表的抽象数据类型线性表的表示2.2 线性表的实现顺序存储结构链式存储结构线性表的扩充操作2.3 线性表的操作线性表的插入与删除线性表的查找与排序线性表的其他操作第三章:栈和队列3.1 栈的定义和应用栈的概念栈的抽象数据类型栈的表示和操作栈的应用场景3.2 队列的定义和应用队列的概念队列的抽象数据类型队列的表示和操作队列的应用场景3.3 栈和队列的扩展双向栈和双向队列栈和队列的链式存储结构栈和队列的其他操作第四章:线性表的排序4.1 排序的基本概念排序的定义排序的分类排序的评价指标4.2 插入排序直接插入排序希尔排序插入排序的性能分析4.3 选择排序简单选择排序堆排序选择排序的性能分析4.4 交换排序冒泡排序快速排序交换排序的性能分析第五章:查找5.1 查找的基本概念查找的定义查找的评价指标查找的方法分类5.2 顺序查找线性表的顺序查找有序表的顺序查找顺序查找的性能分析5.3 二分查找二分查找的原理二分查找的实现二分查找的性能分析5.4 哈希查找哈希查找的原理哈希函数的设计哈希查找的性能分析第六章:树和二叉树6.1 树的基本概念树的定义树的抽象数据类型树的基本术语树的性质6.2 二叉树二叉树的定义二叉树的基本性质二叉树的遍历二叉树的类型6.3 线索二叉树线索二叉树的概念线索二叉树的遍历线索二叉树的存储结构6.4 树的应用树的遍历算法树的构建与操作树的应用场景第七章:图7.1 图的基本概念图的定义图的抽象数据类型图的基本术语图的性质7.2 图的表示邻接矩阵邻接表邻接多重表7.3 图的遍历深度优先搜索(DFS)广度优先搜索(BFS)图的遍历应用7.4 图的路径与连通性最短路径问题最小树问题连通性判定第八章:树和图的算法8.1 树的结构操作树的创建与销毁树的插入与删除树的遍历与遍历算法的优化8.2 图的算法最小树算法最短路径算法连通性算法网络流与最大流算法8.3 应用实例编译原理中的抽象语法树数据库中的查询树中的决策树第九章:哈希表和字典树9.1 哈希表哈希表的概念哈希函数的设计哈希冲突的解决方法哈希表的性能分析9.2 字典树字典树的概念字典树的类型字典树的构建与查询字典树的应用9.3 布隆过滤器布隆过滤器的概念布隆过滤器的原理布隆过滤器的应用10.1 数据结构的重要性数据结构在计算机科学中的应用数据结构在软件工程中的重要性数据结构在算法设计中的作用10.2 数据结构的发展趋势新型数据结构的研究与发展数据结构与算法的融合数据结构在云计算与大数据中的应用10.3 课程回顾与拓展本门课程的重点与难点课程内容的拓展与延伸推荐的学习资料与研究文献重点和难点解析一、数据结构的概念和应用场景补充和说明:数据结构是计算机科学中的基础概念,理解数据结构对于编写高效、可维护的代码至关重要。
数据结构-用面向对象语言描述-殷人昆-导论

由用户定义,用以表示应用问题的 数据模型
由基本的数据类型组成, 并包括一组 相关的服务(或称操作) 信息隐蔽和数据封装,使用与实现 相分离
自然数的抽象数据类型定义
ADT NaturalNumber is objects: 一个整数的有序子集合,它开始于0, 结束于机器能表示的最大整数(MaxInt)。 Function: 对于所有的 x, y NaturalNumber; False, True Boolean, +、-、<、==、=等 都是可用的服务。 Zero( ) : NaturalNumber 返回自然数0
另一些无关紧要的概念
数据项-数据元素 –数据
数据元素是数据的基本单位。在计算机程序中常作 为一个整体进行考虑和处理。 有时一个数据元素可以由若干数据项(Data Item)组 成。数据项是具有独立含义的最小标识单位。 数据元素又称为元素、结点、记录。
属性-对象-集合
什么是数据结构
数据结构的抽象层次
为什么选用面向对象及C++语言 讲述数据结构?
PASCAL与C描述是面向过程的。 C++描述兼有面向过程与面向对 象的特点。 Java描述是面向对象的。 用面向对象及C++描述与国际接 轨,是市场需要。
算法定义
定义:一个有穷的指令集,这些指令为 解决某一特定任务规定了一个运算序列 特性:
template <class Type> ostream& operator << (ostream& OutStream, dataList<Type> OutList) { OutStream << “数组内容 : \n”; for (int i = 0; i < OutList.ArraySize; i++) OutStream << OutList.Element[i] << ‘ ’; OutStream << endl; OuStream << “数组当前大小 : ” << OutList.ArraySize << endl; return OutStream; }
数据结构课后习题答案清华大学出版社殷人昆

}
friend ostream& operator<< (ostream&os, complex&ob ){
//友元函数:重载<<,将复数ob输出到输出流对象os中。
returnos << ob.Re << ( ob.Im >= 0.0 )?“+” : “-” <<fabs( ob.Im ) << “i”;
#include<iostream.h>
#include<math.h>
#include“complex.h”
complex&complex:: operator+ ( complex&ob ){
//重载函数:复数加法运算。
complex * result =newcomplex ( Re + ob.Re, Im + ob.Im );
算法和程序不同,程序可以不满足上述的特性(4)。例如,一个操作系统在用户未使用前一直处于“等待”的循环中,直到出现新的用户事件为止。这样的系统可以无休止地运行,直到系统停工。
此外,算法是面向功能的,通常用面向过程的方式描述;程序可以用面向对象方式搭建它的框架。
1-7设n为正整数,分析下列各程序段中加下划线的语句的程序步数。
i = 4时,i = 5,j = j + i = ( 4 + 1 + 2 + 3 ) + 5 = 5 +1 + 2 + 3 + 4,
……
i = k时,i = k + 1,j = j + i = ( k + 1 ) + ( 1 + 2 + 3 + 4 +…+ k ),
数据结构清华大学殷人昆演示文稿

则递归到只有一个结点的子树。 树的子树棵数不限,而N叉树中根的子树最多N
棵。
树可以区分为外向树和内向树,而N叉树一般是外向
树,即边是有向的,从父指向子。
树可以用N叉树实现。二叉树、B树等又都是N叉
树的特殊情形。
第六页,共二百零一页。
树的特点
数据结构清华大学殷人 昆演示文稿
1
第一页,共二百零一页。
数据结构清华大学殷人 昆
2
第二页,共二百零一页。
第 4 章 树与二叉树
树的定义与基本概念
二叉树 二叉树遍历 二叉树的计数 线索二叉树
树与树的遍历
树的应用
第三页,共二百零一页。
树和森林的概念
树的定义
树是由n (n>0) 个结点组成的有限集合: ➢ 有一个特定的称之为根(root)的结点; ➢ 除根以外的其它结点划分为 m (m≥0) 个 互 不相交的有限集合T1, T2, …, Tm,每个集合又 是一棵树,并且称之为根的子树。
第十四页,共二百零一页。
性质4 具有 n (n≥0) 个结点的完全二叉树的高度为 log2(n+1)
证明:设完全二叉树的高度为 h,则有 2h-1-1<n ≤ 2h-1
上面h-1层结点数 包括第h层的最大结点数
变形 2h-1<n+1≤2h
取对数
h-1<log2(n+1)≤h 有 h = log2(n+1)
树是分层结构,又是递归结构。每棵子树的根结点有 且仅有一个直接前驱,但可以有 0 个或多个直接后继。
前驱
A
B
后继 E F
C
D
GHI J
KL
M
1层 2层
depth = 4 3层 height= 4 4层
数据结构-清华大学-殷人昆-03

可能出栈序列 m0*m3 + m1*m2 + m2*m1 + m3*m0 = 5+2+2+5 = 14 种。
一般地,有 n 个元素按序号1, 2, …, n 进栈, 轮流让 1 在出栈序列的第 1, 第 2, …第 n 位, 则可能的出栈序列数为:
m *m
i 0 i
n-1
n i 1
110-5
bool StackFull ( SeqStack& S ) { //判断栈是否满?满则返回1,否则返回0 return S.top == S.maxSize-1; } void Push ( SeqStack& S, SElemType x ) { //若栈满返回0, 否则新元素 x 进栈并返回1 if ( StackFull(S) ) OverFlow(S); //栈满溢出处理 S.top++; S.elem[S.top] = x; //加入新元素 }
void InitStack ( LinkStack& S ) { //栈初始化 S = NULL; //栈顶(链头)指针置空 }
110-12
bool StackEmpty ( LinkStack& S ) { //判栈空否 return S == NULL; }
void Push ( LinkStack& S, SElemType x ) { //进栈 LinkNode *p = new LinkNode; if ( p == NULL ) { printf (“结点创建失败!\n‖); exit (1); } p->data = x; //结点赋值 p->link = S; S = p; //链入栈顶 }
数据结构第二版 主编殷人昆课后答案

2. 指出下列各算法的功能并求出其时间复杂度.
1) int Prime ( int n ) {
int i = 1 ;
int x = ( int ) sqrt ( n ) ; while ( ++ i <= x ) if ( n% i == 0) break ; if ( i > x ) return 1 ; else return 0 ; } 判断n是否是一个素数, 若是则返回1, 否则返回0, 时间 复杂度为
for ( int i = 1 ; i <= n ; i++ ) for ( int j = 1 ; j<= i ; j++ ) S; A n2 C n(n+1) B n2/2 D n(n+1)/2 3
6. 下面算法的时间复杂度为B O(n). int f ( unsigned int n ) { if ( n==0 || n==1 ) return 1 ; else return n*f ( n - 1 ) ; } A O(1) B O(n) C O(n2) D O(n!)
16
4)
int fun ( int n ) { int i = 1, s = 1 ; while ( s < n ) s += ++i ; return i ; }
求满足不等式1+2+3+...+i >= n的最小i值, 时间复杂 度为O(sqrt (n)) 17
5)
void UseFile (ifstream& inp, int c[10]) {
Quadratic InitQuadratic(float aa=0, float bb=0, float cc=0); Quadratic InitQuadratic( float aa, float bb, float cc ) { Quadratic q ; q.a = aa ; q.b = bb ; q.c = cc ; return q ; }
【计算机专业考研必备】殷仁昆_数据结构考研-要点解析(清华大学殷仁昆教授数据结构辅导班讲义)

3) 注意练习
只看书不做题,不能真正学会有关知识, 不能达到技能培养的目的。 做题是自我检查的重要手段。 在做算法设计类型的习题时,应考虑数据 结构的定义。 3. 提高算法设计的能力。
编写算法的题可能是学生比较棘手的问题,特 别是在考试这样一个氛围,时间又短促,想编 出一个好算法不太容易。
问题2. 当元素以A, B, C, D, E顺序进栈,D, B, C, E, A 是可能的出栈顺序吗?
解析:“否”,因序列的进出栈顺序为 IA IB IC ID OD, 当D 出栈后,栈顶为C,不能让B先出来。 所以D, B, C, E, A 不是可能的出栈顺序。
26
问题3. 可否用两个栈模拟一个队列?反过来呢? 解析:“可以”,一个栈把全部数据反过来,另一 个栈再把这些数据反过去即可。而队列不能。 问题4. 栈、队列对线性表加了什么限制?
9
复习的范围
根据2009年考试分析和历年考试经验,可以对今 后考试作一个简单评估:
单项选择题覆盖了考试大纲涉及的所有各章, 主要考查对各个数据结构的定义和特点的理解, 以及相应延伸的概念。
综合应用题分为两个部分:算法分析题和算法 设计题(编程题),主要考查分析问题和解决 问题的能力。算法分析题的重点在图、查找、 排序部分,算法设计题的重点在线性表、树与 二叉树、查找和排序部分。
16
第一章知识点解析
本章“线性表”的知识点有 5 个: 1) 线性表的定义和特点:由数据元素组成,惟一 直接前驱与后继。 2) 线性表的基本操作:查找、定位、遍历、插入、 删除。 3) 线性表的存储表示:顺序存储、链表存储。 4) 循环链表和双向链表:定义和基本运算。
5) 线性表的应用:掌握使用线性表基本操作实现 应用算法
数据结构复习重点归纳笔记[清华严蔚敏版]
![数据结构复习重点归纳笔记[清华严蔚敏版]](https://img.taocdn.com/s3/m/687fd67ca26925c52cc5bfc4.png)
数据结构复习重点归纳笔记[清华严蔚敏版]数据结构复习重点归纳笔记[清华严蔚敏版]数据结构复习重点归纳[适于清华严版教材]一、数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。
对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。
所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。
但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。
按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。
线性表:基础章节,必考内容之一。
考题多数为基本概念题,名校考题中,鲜有大型算法设计题。
如果有,也是与其它章节内容相结合。
栈和队列:基础章节,容易出基本概念题,必考内容之一。
而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。
串:基础章节,概念较为简单。
专门针对于此章的大型算法设计题很少,较常见的是根据KMP 进行算法分析。
多维数组及广义表:基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。
一般如果要出题,多数不会作为大题出。
数组常与“查找,排序”等章节结合来作为大题考查。
树和二叉树:重点难点章节,各校必考章节。
各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。
通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。
图:重点难点章节,名校尤爱考。
如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。
查找:重点难点章节,概念较多,联系较为紧密,容易混淆。
出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。
清华殷人昆(C++)数据结构考研辅导教程-第1章

1.2.1 数据结构的主要概念
1.什么是数据 数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算 机程序识别和处理的符号的集合。 数据主要分两大类:数值性数据和非数值性数据。数据结构主要研究的是非数值型数据。 2.什么是数据元素 数据的基本单位就是数据元素。例如,在学校的学籍管理系统中学生文件是由一系列学 生记录组成,每个学生记录就是一个数据元素。在计算机程序中数据元素常作为一个整 体进行考虑和处理。数据元素又可称为元素、结点、记录。 有时一个数据元素可以由若干数据项组成。数据项是具有独立含义的最小标识单位。例 如,每个学生记录又可由学号、姓名、性别等数据项组成。 数据元素的集合构成一个数据对象,它是针对某种特定的应用。 3.什么是数据结构 数据结构指某一数据元素集合中的所有数据成员之间的关系。完整的定义为:
1.2.2 算法及算法分析
1.算法的概念 所谓算法,就是基于特定的计算模型在信息处理过程中为了解决某一类问题而设计的一 个指令序列。算法的 5 个要素是 有输入:待处理的信息,即用数据对具体问题的描述; 有输出:经过处理后得到的信息,即问题的答案; 确定性:对于相同的输入数据,算法执行确定的预设路线,得到确定的结果; 可行性:算法的每一基本操作都可以实施,并能够在常数时间内完成; 有穷性:对于任何输入,算法都能经过有穷次基本操作得到正确的结果。 2.设计算法的三个阶段 设计算法通常经过三个主要阶段 (1) 从问题出发,寻找可能的解决方案,结合计算机选择合适的算法; (2) 建立解决问题的数据模型和程序框架,并用伪代码描述一系列步骤;
-2-
(7) 堆排序的思路、算法和性能分析、稳定性 (8) 二路归并排序的思路、算法和性能分析(已考)、稳定性 (9) 基数排序的思路、算法和性能分析 (10) 排序方法的性能比较(已考) (11) 排序方法的应用 在复习过程要切实掌握这些知识点,才能够对考试应付自如。复习方法参看第 8 章。
数据结构-清华大学-殷人昆-05

138-28
对于带权图还需设置一个存放与该边相关的权 值的域 cost。
顶点结点的结构
data Firstout
向的。
138-3
有向图与无向图 在有向图中,顶点对 <x, y> 是 有序的。在无向图中,顶点对(x, y)是无序的。
完全图 若有 n 个顶点的无向图有 n(n-1)/2 条边, 则此图为完全无向图。有 n 个顶点的有向图有 n(n-1) 条边, 则此图为完全有向图。
0
0
00
1
121 2
1
//最大顶点个数
typedef char VType;
//顶点数据类型
typedef int WType;
//边上权值类型
typedef struct {
//静态存储定义
VType verticesList[maxVertices]; //顶点表
WType Edge[maxVertices][maxVertices];
138-8
图的存储表示
邻接矩阵 (Adjacency Matrix)
在图的邻接矩阵表示中,有一个记录各个顶点信 息的顶点表,还有一个表示各个顶点之间关系的 邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图, 图的邻接 矩阵是一个二维数组 A.edge[n][n],定义:
A.Edge[
if ( v != -1 ) { for ( int col = 0; col < G.numVertices; col++ ) if ( G.Edge[v][col] > 0 && G.Edge[v][col] < maxValue ) return col; //顺序检测第 v 行寻找第一个邻接顶点 //对于无权图,maxValue应为INT_MAX
复旦大学入学研究生《数据结构与操作系统》专业课程考试大纲

复旦大学2005年入学研究生《数据结构与操作系统》专业课程考试大纲
第一部分数据结构
考试题型:简答题、编程题
参考书目:《数据结构(用面向对象方法C++描述)》殷人昆,清华大学出版社
总分:100分
考试的基本要求
要求考生比较系统地理解数据结构的基本概念和基本理论,掌握各种数据结构的特点和基本方法,着重强调考生要具有综合运用所学的知识分析问题和解决问题的能力。
对编程语言的要求
数据结构考试中所有的算法,要求用C或C++语言描述。
一、数组
考试内容
数据;顺序表;字符串匹配。
考试要求
1. 理解数组的存储结构,掌握在顺序存储的情况下,数组元素与存储单元的对应关系
2. 理解顺序表的结构和特点,掌握顺序表上基本操作的实现算法。
3. 掌握字符串比较的基本算法(包括KMP算法)。
4. 具有用数组结构解决实际问题的能力。
二、链表
考试内容
单链表;双向链表;循环链表;稀疏矩阵。
考试要求。
数据结构第二主编殷人昆课后答案实用教案

第第3三页页,/共共333页3。页
3. 在线性结构、树形结构和图形结构中,前驱和后继结点之间分别存在 (cúnzài)着1:1、1:N和M:N的联系.
4. 一种抽象数据类型包括数据定义和操作两个部分. 5. 当一个形参类型的长度较大时,应最好说明为引用,以节省参数值的传输时间
和存储参数的空间. 6. 当需要用一个形参访问对应的实参时,则该形参应说明为引用. 7. 在函数中对引用形参的修改就是对相应实参的修改,对值或赋值形参的修改
3) int sum2 ( int n ) {
int s = 0 ;
for ( int i = 1; i <= n ; i++ ) {
int p = 1;
for ( int j = 1; j <= i ; j++)
p *= j ;
计算( jì suàn):
s += p ;
}
return
s;
第第1十5五页页,/共共333页3。页
4) int fun ( int n ) { int i = 1, s = 1 ; while ( s < n ) s += ++i ; return i ;
} 求满足(mǎnzú)不等式1+2+3+...+i >= n的最小i值, 时间复杂度
为O(sqrt (n))
第第1十6六页页,/共共333页3。页
}
第第1十2二页页,/共共333页3。页
2. 指出下列各算法的功能并求出其时间(shíjiān)复杂度. 1) int Prime ( int n ) { int i = 1 ; int x = ( int ) sqrt ( n ) ; while ( ++ i <= x ) if ( n% i == 0) break ; if ( i > x ) return 1 ; else return 0 ; } 判断n是否是一个素数, 若是则返回1, 否则返回0, 时间(shíjiān)复杂度为
殷人昆 数据结构

例如在从磁盘向内存读入一个扇区的数据时, 数据被存放到输入缓冲区,如果下次需要读入 同一个扇区的数据,就可以直接从缓冲区中读 取数据,不需要重新读盘。 缓冲区大小应与操作系统一次读写的块的大小 相适应,这样可以通过操作系统一次读写把信 息全部存入缓冲区中,或把缓冲区中的信息全 部写出到磁盘。 如果缓冲区大小与磁盘上的块大小不适配,就 会造成内存空间的浪费。 缓冲区的构造可以看作一个先进先出的队列。
5
数据的传送速度 = 存储密度走带速度/读写 时间。 在应用中使用文件进行数据处理的基本单位叫 做逻辑记录,简称为记录;在磁带上物理地存 储的记录叫做物理记录。 在使用磁带或磁盘存放逻辑记录时,常常把若 干个逻辑记录打包进行存放,把这个过程叫做 “块化”(blocking)。经过块化处理的物理 记录叫做块化记录。 磁带设备是一种启停设备。磁带每次启停都有 一个加速与减速的过程,在这段时间内走带不
25
顺序文件的存储方式 1. 连续文件:文件的全部记录顺序地存放外 存的一个连续的区域中。优点是存取速度 快、存储利用率高、处理简单。缺点是区 域大小需事先定义,不能扩充。 2. 串联文件:文件记录成块存放于外存中, 在块中记录顺序连续存放,但块与块之间 可以不连续,通过块链指针顺序链接。优 点是文件可以扩充、存储利用率高。缺点 是影响了存取和修改的效率。
桶大小为3的溢出桶链表示例
基桶编号 基桶区
0 1 2 3 4 5 6
溢出桶编号 溢出桶区
O1 O2 O3 O4 O5 O6 O7
9
磁盘(disc)
磁盘存储器通常称为直接存取设备,或随机存 取设备,它访问外存上文件的任一记录的时间 几乎相同。 磁盘存储器可以顺序存取,也可以随机存取。 目前使用较多的是活动臂硬盘组:若干盘片构 成磁盘组,它们安装在主轴上,在驱动装臵的 控制下高速旋转。除了最上面一个盘片和最下 面一个盘片的外侧盘面不用以外,其他每个盘 片上下两面都可存放数据。将这些可存放数据 的盘面称为记录盘面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数递归时的活动记录
long Factorial ( long n ) { int temp; if ( n == 0 ) return 1; else temp = n * Factorial (n-1); RetLoc2 return temp; } void main ( ) { int n; n = Factorial (4); RetLoc1 }
计算Factorial时活动记录的内容
斐波那契数列的递归调用树 调用次数 NumCall(k) = 2*Fib(k+1) - 1。
25
36
72
18
99
49
54
63
81
打印数组A[n]的值
void recfunc ( int A[ ], int n ) { if ( n >= 0 ) { cout << A[n] << " "; n--; recfunc ( A, n ); } }
表中套表情形下的广义表链表表示
广义表结点定义
utype = 0/1/2/3 value = ref /intgrinfo /charinfo / hype, 表明结点类型。0为表头结点,1 为整型原子结点,2为字符型原子结点,3为子 表结点。 值域 value。当 utype = 0 时为表引用计数,= 1 时为整数值,= 2 时为字符值, = 3 时为指向 子表的表头结点的指针。 尾指针域 tlink。当 utype = 0 时为指向该表表 头元素的指针;当 utype 0 时为指向同一层 下一个表结点的指针。
迷宫漫游与求解算法
int Maze::TraverseMaze ( int CurrentPos ) { if ( CurrentPos > 0 ) { //路口从 1 开始
}
} return 0;
if ( CurrentPos == EXIT ) { //出口处理 cout << CurrentPos << " "; return 1; } else //递归向左搜寻可行 if (TraverseMaze(intsec[CurrentPos].left )) { cout << CurrentPos << “ ”; return 1; } else //递归向前搜寻可行 if (TraverseMaze(intsec[CurrentPos].forward)) { cout << CurrentPos << “ ”; return 1; } else //递归向右搜寻可行 if (TraverseMaze(intsec[CurrentPos].right)) { cout << CurrentPos << " "; return 1; }
intsec = new Intersection[MazeSize+1]; //创建迷宫路口数组 for ( int i = 1; i <= MazeSize; i++ ) fin >> intsec[i].left >> intsec[i].forward >> intsec[i].right; fin >> EXIT; //输入迷宫出口 fin.close ( ); }
class GenList { //广义表类 private: GenListNode* first; //广义表表头指针 GenListNode* Copy ( GenListNode* ls ); int depth ( GenListNode *ls ); int equal ( GenListNode *s, GenListNode *t ); void Remove (GenListNode *ls ); public: Genlist ( ); ~GenList ( ); GenListNode& Head ( ); GenListNode& Tail ( );
交通路口结构定义 struct Intersection { int left; int forward; int right; }
Maze :: Maze ( char *filename ) { //构造函数:从文件 filename 中读取各路口 //和出口的数据 ifstream fin; fin.open ( filename, ios::in | ios::nocreate ); //为输入打开文件,文件不存在则打开失败 if ( !fin ) { cout << “迷宫数据文件” << filename << “打不开” << endl; exit (1); } fin >> MazeSize; //输入迷宫路口数
void iterfunc ( int A[ ], int n ) { //消除了尾递归的非递归函数 while ( n >= 0 ) { cout << "value " << A[n] << endl; n--; } }
广义表 (General Lists )
广义表的概念
n ( 0 )个表元素组成的有
递归(Recurve)的概念 迷宫(Maze)问题 递归过程与递归工作栈 广义表 (General Lists ) 小结
递归的概念
递归的定义 若一个对象部分地包含它 自己, 或用它自己给自己定义, 则称这 个对象是递归的;若一个过程直接地 或间接地调用自己, 则称这个过程是递 归的过程。 以下三种情况常常用到递归方法。 定义是递归的 数据结构是递归的 问题的解法是递归的
union { int ref; //utype = 0, 表头结点 int intgrinfo; //utype = 1, 整型 char charinfo; //utype = 2, 字符型 GenListNode *hlink; //utype = 3, 子表结点 } value; public: GenListNode & Info ( GenListNode *elem ); int nodetype ( GenListNode *elem ) { return elem→utype; } void setInfo ( GenListNode *elem, GenListNode *x ); };
限序列,记作 LS = (a0, a1, a2, …, an-1) LS是表名,ai是表元素,它可以是表(称为 子表),可以是数据元素(称为原子)。 n为表的长度。n = 0 的广义表为空表。 n > 0时,表的第一个表元素称为广义表 的表头(head),除此之外,其它表元素组 成的表称为广义表的表尾(tail)。
GenListNode *First ( ); GenListNode *Next ( GenListNode *elem ); void Push ( GenListNode& x ); GenList & Addon ( GenList& list, GenListNode& x ); void setHead ( GenListNode& x ); void setNext ( GenListNode *elem1, GenListNode *elem2 ); void setTail ( GenList& list ); void Copy ( const GenList& l ); int depth ( ); int Createlist ( GenListNode* ls, char* s ); }
数据结构是递归的
例如,单链表结构
搜索链表最后一个结点并打印其数值
template <class Type> void Find ( ListNode<Type> *f ) { if ( f →link == NULL ) cout << f →data << endl; else Find ( f →link ); }
问题的解法是递归的
例如,汉诺塔(Tower of Hanoi)问题
#include <iostream.h> #include "strclass.h” void Hanoi (int n, String A, String B, String C ) { //解决汉诺塔问题的算法 if ( n == 1 ) cout << " move " << A << " to ” << C << endl; else { Hanoi ( n-1, A, C, B ); cout << " move " << A << " to " << C << endl; Hanoi ( n-1, B, A, C ); } }
递归过程与递归工作栈
递归过程在实现时,需要自己调用自己。 每一次递归调用时,需要为过程中使用的参 数、局部变量等另外分配存储空间。 层层向下递归,退出时的次序正好相反:
递归次序
n!
(n-1)!
(n-2)!
1!
0!=1
返回次序
因此,每层递归调用需分配的空间形成递归 工作记录,按后进先出的栈组织。
7 6
小型迷宫的数据
迷宫的类定义
#include <iostream.h> #include <fstream.h> #include <stdlib.h> class Maze { private: int MazeSize; int EXIT; Intersection *intsec; public: Maze ( char *filename ); int TraverseMaze ( int CurrentPos ); }