拓扑排序课程设计报告
拓扑排序课程设计报告
吉林省2023年一级注册建筑师考试设计汇总模拟试题本卷共分为2大题50小题,作答时间为180分钟,总分100分,60分及格。
一、单项选择题(共25 题,每题 2 分,每题旳备选项中,只有 1 个事最符合题意)1、调制解调器旳功能是__。
A.数字信号旳编号B.模拟信号旳编号C.数字信号转换成其他信号D.数字信号与模拟信号之间旳转换2、超过出让协议约定旳动工开发日期满一年而未动工开发旳,可以征收相称于土地使用权出让金旳百分之多少如下旳土地闲置费(2023,82)A.10%B.20%C.25%D.30%3、根据《抗震规范》,多高层钢构造房屋旳抗震构造措施与下列何种原因无关A.设防烈度B.抗震等级C.构造类型D.房屋高度4、我国现行建设项目工程选价旳构成中,工程建设其他费用包括:(2023,1) A.基本预备费B.税金C.建设期贷款利息D.与未来企业生产经营有关旳其他费用5、初步设计文献扉页上应签订或授权盖章下列哪一组人(2023,74)A.法定代表人、技术总负责人、项目总负责人、各专业审核人B.法定代表人、项目总负责人、各专业审核人、各专业负责人C.法定代表人、技术总负责人、项目总负责人、各专业负责人D.法定代表人、项目总负责人、部门负责人、各专业负责人6、长途客运汽车站、火车站、客运码头重要出入口__m范围内应设公交车站。
A.30B.50C.80D.1007、在吊顶内铺放纤维吸声材料时,应采用旳施工技术措施是:(2023,49) A.防潮措施B.防火措施C.防散落措施D.防霉变措施8、建筑工程定额按生产要素可分为______。
A.全国统一定额、地区定额、行业定额、企业定额等B.劳动定额、材料消耗定额、机械台班使用定额C.施工定额、预算定额、概算定额、概算指标D.建筑工程定额、安装工程定额、市政工程定额等9、铝合金门窗与墙体旳连接应为弹性连接,下面理由对旳旳是()①建筑物在一般振动、沉降变形时不致损坏门窗②建筑物受热胀冷缩变形时,不致损坏门窗③让门窗框不直接与混凝土、水泥砂浆接触,以免碱腐蚀④便于施工与维修A.①②③B.②③C.②④D.①10、工程量清单应由哪个部门对其精确性负责(2023,72)A.招标人B.承包人C.发包人D.设计人11、大型建设项目在选择场地时要搜集地形图,如下__比例尺旳图纸合适。
求拓扑序列排序课程设计
求拓扑序列排序课程设计一、教学目标本课程的教学目标是让学生掌握拓扑序列排序的基本概念、原理和应用,培养学生运用拓扑序列排序解决问题的能力。
具体包括以下三个方面的目标:1.知识目标:(1)理解拓扑序列排序的定义和性质;(2)掌握拓扑排序算法及其实现;(3)了解拓扑序列排序在实际应用中的重要性。
2.技能目标:(1)能够运用拓扑排序解决简单的问题;(2)能够运用图论知识分析和解决拓扑排序相关问题;(3)能够运用编程语言实现拓扑排序算法。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣和热情;(2)培养学生团队合作、自主学习的能力;(3)培养学生运用所学知识解决实际问题的意识。
二、教学内容本课程的教学内容主要包括以下几个部分:1.拓扑序列排序的基本概念:图、顶点、边、度数、入度、出度等;2.拓扑排序的原理:拓扑排序的定义、拓扑排序的存在性、拓扑排序的算法;3.拓扑排序算法实现:深度优先搜索(DFS)算法、广度优先搜索(BFS)算法;4.拓扑排序的应用:任务调度、项目规划等实际问题。
三、教学方法为了达到本课程的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解拓扑序列排序的基本概念、原理和应用,使学生掌握相关知识;2.讨论法:学生分组讨论拓扑排序算法实现和应用问题,培养学生的思考和表达能力;3.案例分析法:分析实际应用中的拓扑排序问题,让学生学会将理论知识应用于实际问题;4.实验法:安排拓扑排序算法的编程实验,培养学生的动手能力和实际问题解决能力。
四、教学资源为了支持本课程的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《图论与算法导论》;2.参考书:《计算机网络》、《数据结构与算法》;3.多媒体资料:PPT课件、教学视频;4.实验设备:计算机、网络设备。
通过以上教学资源的使用,丰富学生的学习体验,提高学生的学习效果。
五、教学评估本课程的教学评估将采取多元化、全过程的方式进行,以全面、客观、公正地评价学生的学习成果。
求拓扑排序序列课程设计
求拓扑排序序列课程设计一、教学目标本节课的教学目标是让学生掌握拓扑排序序列的概念、性质和求解方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分:1.知识目标:学生能够理解拓扑排序的定义,了解拓扑排序的性质和应用场景,掌握拓扑排序的求解方法。
2.技能目标:学生能够运用拓扑排序解决实际问题,如任务调度、项目规划等,提高问题解决的效率。
3.情感态度价值观目标:培养学生对计算机科学和图论的兴趣,培养学生的逻辑思维和创新能力。
二、教学内容本节课的教学内容主要包括以下三个方面:1.拓扑排序的定义和性质:介绍拓扑排序的定义,解释拓扑排序的性质,如无环性、唯一性等。
2.拓扑排序的求解方法:讲解拓扑排序的求解方法,如DFS、BFS等,并通过实例进行演示。
3.拓扑排序的应用:介绍拓扑排序在实际问题中的应用,如任务调度、项目规划等,并通过实例进行讲解。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用以下教学方法:1.讲授法:讲解拓扑排序的定义、性质和求解方法,为学生提供系统的知识结构。
2.案例分析法:通过分析实际问题,让学生了解拓扑排序的应用,提高学生的解决问题的能力。
3.实验法:让学生动手实践,求解实际问题,培养学生的实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:为学生提供系统的知识结构,方便学生课后复习。
2.多媒体资料:通过动画、图片等形式,直观地展示拓扑排序的概念和性质,提高学生的学习兴趣。
3.实验设备:为学生提供实际操作的机会,培养学生的实际操作能力。
五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。
2.作业:布置相关的拓扑排序题目,评估学生对拓扑排序概念和求解方法的理解和应用能力。
3.考试:设计考试题目,全面考察学生对拓扑排序的定义、性质、求解方法和应用的掌握程度。
数据结构拓扑排序实验报告
数据结构拓扑排序实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的拓扑排序算法,并通过实际编程实现来验证其有效性和应用场景。
拓扑排序在解决有向无环图(DAG)中的依赖关系问题上具有重要作用,例如任务调度、工程流程规划等。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
Python具有简洁易懂的语法和丰富的库函数,能够方便地实现拓扑排序算法。
三、实验原理拓扑排序是对有向无环图的顶点进行排序,使得对于图中的每条有向边(u, v),顶点 u 都在顶点 v 之前。
其基本思想是选择一个入度为0 的顶点,将其输出,并删除与其相关的边,从而更新其他顶点的入度,重复这个过程直到图中所有顶点都被输出。
实现拓扑排序的常见方法有两种:基于深度优先搜索(DFS)和基于广度优先搜索(BFS)。
四、实验步骤1、构建有向无环图的数据结构我们使用邻接表来表示有向图,其中每个顶点对应一个列表,存储其指向的顶点。
2、计算顶点的入度遍历邻接表,统计每个顶点的入度。
3、执行拓扑排序基于 BFS 的方法:创建一个队列,将入度为 0 的顶点入队。
然后不断取出队首顶点,输出,并更新与其相邻顶点的入度。
若有新的入度为 0 的顶点,则入队。
基于 DFS 的方法:使用递归函数,从一个未访问的顶点开始,访问其相邻顶点,并在回溯时输出顶点。
4、输出排序结果五、实验代码以下是基于 BFS 实现拓扑排序的 Python 代码示例:```pythonfrom collections import dequeclass Graph:def __init__(self, vertices):selfvertices = verticesselfadjacency_list = for _ in range(vertices)selfindegree = 0 verticesdef add_edge(self, source, destination):selfadjacency_listsourceappend(destination) selfindegreedestination += 1def topological_sort_bfs(self):queue = deque()for vertex in range(selfvertices):if selfindegreevertex == 0:queueappend(vertex)sorted_order =while queue:current_vertex = queuepopleft()sorted_orderappend(current_vertex)for adjacent_vertex in selfadjacency_listcurrent_vertex: selfindegreeadjacent_vertex = 1if selfindegreeadjacent_vertex == 0: queueappend(adjacent_vertex)if len(sorted_order)!= selfvertices:print("Graph contains a cycle Topological sort is not possible")else:print("Topological Sort:", sorted_order)测试示例g = Graph(6)gadd_edge(5, 2)gadd_edge(5, 0)gadd_edge(4, 0)gadd_edge(4, 1)gadd_edge(2, 3)gadd_edge(3, 1)gtopological_sort_bfs()```以下是基于 DFS 实现拓扑排序的 Python 代码示例:```pythonclass Graph:def __init__(self, vertices):selfvertices = verticesselfadjacency_list = for _ in range(vertices) selfvisited = False verticesselfstack =def add_edge(self, source, destination):selfadjacency_listsourceappend(destination) def topological_sort_dfs(self, vertex):selfvisitedvertex = Truefor adjacent_vertex in selfadjacency_listvertex: if not selfvisitedadjacent_vertex: selftopological_sort_dfs(adjacent_vertex) selfstackappend(vertex)def perform_topological_sort(self):for vertex in range(selfvertices):if not selfvisitedvertex:selftopological_sort_dfs(vertex)print("Topological Sort:", selfstack::-1)测试示例g = Graph(6)gadd_edge(5, 2)gadd_edge(5, 0)gadd_edge(4, 0)gadd_edge(4, 1)gadd_edge(2, 3)gadd_edge(3, 1)gperform_topological_sort()```六、实验结果分析1、基于 BFS 的方法对于上述测试示例,输出的拓扑排序结果为 4, 5, 0, 2, 3, 1,符合预期。
课程设计拓扑排序摘要
课程设计拓扑排序摘要一、教学目标本课程的教学目标是使学生掌握拓扑排序的基本概念和方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要理解拓扑排序的定义、特点和应用场景,掌握拓扑排序算法的实现和优化。
2.技能目标:学生能够运用拓扑排序算法解决基本的图论问题,如任务调度、课程安排等。
3.情感态度价值观目标:通过学习拓扑排序,学生能够培养逻辑思维能力、问题解决能力和创新意识,提高对计算机科学和图论的兴趣。
二、教学内容本课程的教学内容主要包括拓扑排序的定义和性质、拓扑排序算法的实现和优化、拓扑排序的应用场景。
具体安排如下:1.第一章:拓扑排序的定义和性质,介绍拓扑排序的基本概念和特点,分析拓扑排序的性质和限制。
2.第二章:拓扑排序算法的实现和优化,讲解常见的拓扑排序算法,如Kahn算法和Dijkstra算法,探讨算法的效率和优化方法。
3.第三章:拓扑排序的应用场景,介绍拓扑排序在任务调度、课程安排等实际问题中的应用,并通过案例分析让学生掌握拓扑排序的运用。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学。
具体包括:1.讲授法:通过讲解拓扑排序的基本概念、算法和应用,使学生掌握拓扑排序的理论基础。
2.案例分析法:通过分析实际问题案例,让学生了解拓扑排序在实际中的应用和解决问题的方式。
3.实验法:安排课后实验,让学生动手实现拓扑排序算法,培养学生的实际操作能力和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选择一本关于图论和拓扑排序的经典教材,作为学生学习的基础资料。
2.参考书:提供一些相关领域的参考书籍,供学生深入学习和拓展知识。
3.多媒体资料:制作PPT、教学视频等多媒体资料,帮助学生更好地理解和掌握拓扑排序的知识。
4.实验设备:准备计算机实验室,让学生能够进行课后实验和实践操作。
拓扑排序课程设计报告
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:拓扑排序算法院(系):计算机学院专业:计算机科学与技术(嵌入式系统方向)班级:14010105班学号:2011040101221姓名:王芃然指导教师:丁一军目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图 (2)2.2.2 流程图分析 (3)3 数据结构分析 (7)3.1存储结构 (7)3.2算法描述 (7)4 调试与分析 (12)4.1调试过程 (12)4.2程序执行过程 (12)参考文献 (14)附录(关键部分程序清单) (15)1 课程设计介绍1.1 课程设计内容由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
若在图一的有向图上人为的加一个表示V2<=V3的弧(“<=”表示V2领先于V3)则图一表示的亦为全序且这个全序称为拓扑有序,而由偏序定义得到拓扑有序的操作便是拓扑排序。
在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。
编写算法建立有向无环图,主要功能如下:1.能够求解该有向无环图的拓扑排序并输出出来;2.拓扑排序应该能处理出现环的情况;3.顶点信息要有几种情况可以选择。
1.2 课程设计要求1.输出拓扑排序数据外,还要输出邻接表数据;2.参考相应的资料,独立完成课程设计任务;3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析本课设题目要求编写算法能够建立有向无环图,有向无环图,顾名思义,即一个无环的有向图,是一类较有向图更一般的特殊有向图。
其功能要求及个人在写程序时对该功能的实现作如下分析:1. 将图以合适的方式存储起来。
图有多种存储方式,其中最常用的存储方式有图的邻接矩阵和邻接表。
拓扑排序实验报告(两篇)
引言概述:在计算机科学领域,拓扑排序是一个经典的算法问题,用于解决有向无环图中节点的依赖关系排序问题。
通过拓扑排序,可以确定节点之间的先后顺序,从而确保在执行某些操作时不会出现冲突。
本实验报告旨在探讨和分析拓扑排序算法的实现过程和应用场景,以及拓扑排序在解决任务调度、编译器优化等问题中的作用。
正文内容:1. 算法原理1.1 定义拓扑排序是指对于一个有向无环图(DAG)中的节点,按照它们之间的依赖关系进行排序的过程。
在拓扑排序中,如果存在一条从节点 A 到节点 B 的有向边,那么在排序结果中,节点 A 必须在节点 B 之前。
1.2 算法过程拓扑排序算法的基本思想是不断地选择没有前驱节点的节点,并将其添加到排序结果中。
具体实现过程可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法。
1.3 算法示例假设有一个任务调度图,其中每个节点表示一个任务,节点之间的有向边表示任务之间的依赖关系。
拓扑排序算法可以按照任务之间的依赖顺序将任务排序,以确定它们的执行顺序。
2. 拓扑排序的应用场景2.1 任务调度拓扑排序可以用于解决任务调度问题。
在一个任务调度系统中,每个任务可能有多个前置任务,拓扑排序可以帮助确定任务的执行顺序,确保没有任务在其前置任务完成之前执行。
2.2 编译器优化在编译器优化过程中,拓扑排序可应用于解决指令调度问题。
指令调度是指在一个指令流中对指令进行重新排序,以提高执行效率。
通过拓扑排序,可以确定指令之间的依赖关系,避免出现冲突,从而优化编译器生成的指令流。
2.3 依赖关系管理在软件开发中,模块之间可能存在依赖关系。
拓扑排序可以帮助开发人员管理这些依赖关系,确保模块的顺序正确,减少错误和冲突的发生。
2.4 数据流分析拓扑排序还可以应用于数据流分析的算法中。
数据流分析是指对程序中变量的使用和定义关系进行分析,以便进行性能优化或错误检测。
拓扑排序可以帮助确定变量之间的依赖关系,从而更准确地进行数据流分析。
拓扑排序实习报告
}
void BianLi(ALGraph g,int n) //通过已建立的邻接表来遍历图
{
int i;
Vertex *p;
printf("遍历图的结果如下:\n");
for(i=1;i<=n;i++)
{
printf("%d=>",i);//邻接表中的一个结点
p=g.vertices[i].link;//邻接表中一个结点的第一个邻接点
while(p!=NULL)//一个顶点的全部邻接点
{
if(p->next!=NULL)
printf("%d-->",p->adjvex);
else
printf("%d",p->adjvex);
p=p->next;//下一个邻接点
}
printf("^\n");//结束符号
}
}
void TuoPuPaiXu(ALGraph g,int n) //输出拓扑排序的结果
利用DFS求拓扑序列的抽象算法可描述为:
void DFSTopSort(G,i,T){
//在DisTraverse中调用此算法,i是搜索的出发点,T是栈
int j;
visited[i]=TRUE;//访问i
for(所有i的邻接点j)//即<i,j>∈E(G)
if(!visited[j])
DFSTopSort(G,j,T);
④一个DAG可能有多个拓扑序列。
【例】对图G9进行拓扑排序,至少可得到如下的两个(实际远不止两个)拓扑序列:C0,C1,C2,C4,C3,C5,C7,
拓扑排序(算法与数据结构课程设计)
拓扑排序一、问题描述在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。
拓扑排序可以应用于教学计划的安排,根据课程之间的依赖关系,制定课程安排计划。
按照用户输入的课程数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出符合拓扑排序的课程安排计划。
二、基本要求1、选择合适的存储结构,建立有向无环图,并输出该图;2、实现拓扑排序算法;3、运用拓扑排序实现对教学计划安排的检验。
三、算法思想1、采用邻接表存储结构实现有向图;有向图需通过顶点数、弧数、顶点以及弧等信息建立。
2、拓扑排序算法void TopologicalSort(ALGraph G) 中,先输出入度为零的顶点,而后输出新的入度为零的顶点,此操作可利用栈或队列实现。
考虑到教学计划安排的实际情况,一般先学基础课(入度为零),再学专业课(入度不为零),与队列先进先出的特点相符,故采用队列实现。
3、拓扑排序算法void TopologicalSort(ALGraph G),大体思想为:1)遍历有向图各顶点的入度,将所有入度为零的顶点入队列;2)队列非空时,输出一个顶点,并对输出的顶点数计数;3)该顶点的所有邻接点入度减一,若减一后入度为零则入队列;4)重复2)、3),直到队列为空,若输出的顶点数与图的顶点数相等则该图可拓扑排序,否则图中有环。
4、要对教学计划安排进行检验,因此编写了检测用户输入的课程序列是否是拓扑序列的算法void TopSortCheck(ALGraph G),大体思想为:1)用户输入待检测的课程序列,将其存入数组;2)检查课程序列下一个元素是否是图中的顶点(课程),是则执行3),否则输出“课程XX 不存在”并跳出;3)判断该顶点的入度是否为零,是则执行4),否则输出“入度不为零”并跳出;4)该顶点的所有邻接点入度减一;5)重复2)、3)、4)直到课程序列中所有元素均被遍历,则该序列是拓扑序列,否则不是拓扑序列。
拓扑排序实验报告
拓扑排序实验报告第一点:实验背景及目的在计算机科学中,拓扑排序是一种针对有向无环图(DAG)的算法,其目的是对图中的所有节点进行排序,使得对于图中的每一条有向边(u,v),节点u在排序中都出现在节点v之前。
拓扑排序的应用非常广泛,如任务调度、编译单元的生成等。
本实验的目的在于使学生理解和掌握拓扑排序的基本概念和方法,培养学生运用拓扑排序解决实际问题的能力。
通过实验,学生应能熟练使用拓扑排序算法对给定的有向无环图进行排序,并理解算法的时间复杂度。
第二点:实验原理与方法拓扑排序算法的基本原理是先找到所有入度为0的节点,将它们加入结果序列中,然后从图中删除这些节点以及它们的出边,之后再找到新的入度为0的节点,重复上述过程,直到所有节点都被加入结果序列中或者图中仍有节点存在。
如果图中仍有节点存在,则说明图中含有环,无法进行拓扑排序。
实验中,我们将使用深度优先搜索(DFS)算法来实现拓扑排序。
具体方法是,从图中的任意节点开始,进行深度优先搜索,每当访问一个节点时,就将它从图中删除,并将其入边所指向的节点入度减一。
当某个节点的入度变为0时,将其加入结果序列中。
重复这个过程,直到所有节点都被删除或者图中仍有节点存在。
以上就是拓扑排序实验报告的第一点和第二点内容,希望能对你有所帮助。
第三点:实验环境与工具为了完成拓扑排序的实验,我们需要准备以下环境和工具:1.编程语言:本实验可以使用C++、Java、Python等编程语言完成。
在这里,我们推荐使用Python,因为Python具有简洁的语法和强大的第三方库支持,非常适合进行算法实验。
2.开发环境:Python开发者可以使用PyCharm、VSCode等集成开发环境进行实验。
这些开发环境提供了代码高亮、调试、语法检查等功能,可以提高开发效率。
3.第三方库:在Python中,我们可能需要使用如matplotlib、networkx等第三方库来绘制图和进行图的算法分析。
拓扑排序c语言课程设计
拓扑排序c语言课程设计一、课程目标知识目标:1. 学生理解拓扑排序的概念,掌握其在图论中的应用。
2. 学生掌握使用C语言实现拓扑排序算法的基本步骤和关键代码。
3. 学生能够解释拓扑排序结果的意义,并分析其在实际问题中的应用。
技能目标:1. 学生能够运用C语言编写实现拓扑排序的程序,并对给定的有向无环图进行排序。
2. 学生通过实际操作,培养解决复杂问题的编程能力和逻辑思维能力。
3. 学生学会使用调试工具检测并修正程序中的错误,提高程序调试能力。
情感态度价值观目标:1. 学生在探究拓扑排序的过程中,培养对数据结构和算法的热爱,激发对计算机科学的兴趣。
2. 学生在合作交流中,培养团队协作精神和分享意识,提高沟通能力。
3. 学生通过解决实际问题,体会编程的魅力,增强自信心和自主学习能力。
课程性质:本课程为计算机科学与技术学科的课程设计,旨在让学生掌握拓扑排序的原理和C语言实现方法。
学生特点:学生已具备C语言基础,具有一定的编程能力和逻辑思维能力,对图论相关概念有一定了解。
教学要求:教师需引导学生通过实例分析,动手实践,掌握拓扑排序的编程方法,并在实际应用中提高解决问题的能力。
教学过程中注重培养学生的团队合作意识和自主学习能力。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。
二、教学内容1. 图的基本概念复习:回顾图的定义、有向图和无向图、顶点和边、邻接矩阵和邻接表等基础知识。
教材章节:第二章 图的基本概念2. 拓扑排序的概念与性质:介绍拓扑排序的定义、特点和应用场景,讨论拓扑排序与有向无环图的关系。
教材章节:第五章 图的算法应用3. 拓扑排序算法原理:讲解拓扑排序的算法思想、关键步骤以及时间复杂度分析。
教材章节:第五章 图的算法应用4. C语言实现拓扑排序:详细讲解如何使用C语言实现拓扑排序,包括数据结构设计、函数定义和逻辑实现。
教材章节:实验指导书第四章 图的算法实现5. 拓扑排序实例分析:通过具体实例,分析拓扑排序在实际问题中的应用,如任务调度、项目规划等。
拓扑排序课程设计报告
拓扑排序课程设计报告拓扑排序⼀问题描述本次课程设计题⽬是:编写函数实现图的拓扑排序⼆概要设计1.算法中⽤到的所有各种数据类型的定义在该程序中⽤邻接表作为图的存储结构。
⾸先,定义表结点和头结点的结构类型,然后定义图的结构类型。
创建图⽤邻接表存储的函数,其中根据要求输⼊图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插⼊到邻接表中。
拓扑排序的函数在该函数中⾸先要对各顶点求⼊度,其中要⽤到求⼊度的函数,为了避免重复检测⼊度为零的顶点,设置⼀个辅助栈,因此要定义顺序栈类型,以及栈的函数:⼊栈,出栈,判断栈是否为空。
2.各程序模块之间的层次调⽤关系第⼀部分,void CreatGraph(ALGraph *G)函数构建图,⽤邻接表存储。
这个函数没有调⽤函数。
第⼆部分,void TopologicalSort(ALGraph *G)输出拓扑排序函数,这个函数⾸先调⽤FindInDegree(G,indegree)对各顶点求⼊度indegree[0……vernum-1];然后设置了⼀个辅助栈,调⽤InitStack(&S)初始化栈,在调⽤Push(&S,i)⼊度为0者进栈,while(!StackEmpty(&S))栈不为空时,调⽤Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,⼊度indegree[k]--,当输出某⼀⼊度为0的顶点时,便将它从栈中删除。
第三部分,主函数,先后调⽤void CreatGraph(ALGraph *G)函数构建图、void TopologicalSort(ALGraph *G)函数输出拓扑排序实现整个程序。
3.设计的主程序流程三详细设计1.实现概要设计中定义的所有数据类型#include#include#include#define MAX_VEXTEX_NUM 20 //*定义点最⼤的数值为顶30*// #define M 20#define STACK_INIT_SIZE 100 //*定义点最⼤的数值为顶30*//#define STACKINCREMENT 10 //*定义栈的增量为10*//#define OK 1#define ERROR 0typedef char ElemType; //*定义栈顶元素类型*//typedef struct ArcNode{int adjvex; //该弧所指向的顶点的位置//struct ArcNode *nextarc; //指向下⼀条弧的指针//}ArcNode; //*表结点*//typedef struct VNode{char data; //顶点信息ArcNode *firstarc; //指向第⼀条依附该顶点的弧的指针// }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum; //图的当前顶点数和弧数//}ALGraph;typedef struct //构建栈//{ElemType *base;//*在栈构造之前的指针*//ElemType *top;//*栈顶指针*//int stacksize;//*定义所分配的存储空间*//}SqStack;//*顺序栈*//2.算法和各模块的代码程序中各函数算法思想如下:○1void InitStack(SqStack *S)初始化栈将栈的空间设为STACK-INIT-SIZE。
数据结构拓扑排序课程设计
数据结构拓扑排序课程设计正文:1:引言1.1 研究背景在计算机科学领域中,数据结构是描述和组织数据的方式。
而拓扑排序是一种常用的数据结构算法,用于对有向图中的节点进行排序。
本文将介绍拓扑排序的算法原理以及如何实现一个拓扑排序算法。
1.2 研究目的本文的目的是设计一个高效的拓扑排序算法,用于解决日常生活中一些实际问题。
2:拓扑排序原理2.1 有向图有向图是由节点和边组成的图,边表示节点之间的关系,并且有方向性。
在有向图中,每个节点都有一个入度和一个出度。
2.2 拓扑排序定义拓扑排序是一种将有向无环图(DAG)中的节点线性排序的算法。
排序的结果满足:若节点 A 在排序结果中位于节点 B 之前,则在图中不存在一条从节点 B 指向节点 A 的路径。
2.3 拓扑排序算法步骤:1) 初始化一个队列,将所有入度为 0 的节点入队。
2) 当队列不为空时,执行以下操作:a) 取出队首节点,并将其加入排序结果中。
b) 将该节点的所有邻居节点的入度减 1:c) 若邻居节点的入度为 0,则将其入队。
3) 若排序结果中的节点数等于图中的节点数,则排序成功;否则,图中存在环,排序失败。
3:拓扑排序的实现3.1 数据结构设计为了实现拓扑排序算法,我们需要定义两个数据结构:节点和图。
节点类包含以下属性:- 节点标识符- 节点的入度- 节点的邻居列表图类包含以下方法:- 添加节点- 添加边- 拓扑排序3.2 代码实现示例代码如下:```pythonclass Node:def __init__(self, id): self:id = idself:indegree = 0 self:neighbors = [] class Graph:def __init__(self):self:nodes = []def addNode(self, id):self:nodes:append(Node(id)) def addEdge(self, id1, id2):node1 = self:getNode(id1)node2 = self:getNode(id2)node2:indegree += 1node1:neighbors:append(node2) def getNode(self, id):for node in self:nodes:if node:id == id:return nodereturn Nonedef topologicalSort(self):queue = []result = []for node in self:nodes:if node:indegree == 0:queue:append(node)while queue:currNode = queue:pop(0)result:append(currNode)for neighbor in currNode:neighbors: neighbor:indegree -= 1if neighbor:indegree == 0:queue:append(neighbor)if len(result) == len(self:nodes):return resultelse:return None```4:实例应用4.1 任务调度拓扑排序可以用于任务调度,其中每个节点表示一个任务,边表示任务之间的依赖关系。
课程设计实现拓扑排序算法
课程设计实现拓扑排序算法一、课程目标知识目标:1. 学生能理解拓扑排序的概念,掌握拓扑排序算法的基本原理和应用场景。
2. 学生能描述有向无环图(DAG)的特点,并识别出给定图中的关键路径。
3. 学生能运用所学知识,对实际问题进行拓扑排序,解决项目管理、任务调度等实际问题。
技能目标:1. 学生能通过分析问题,构建出相应的有向无环图,并进行拓扑排序。
2. 学生能运用编程语言实现拓扑排序算法,解决具体问题。
3. 学生能通过实例分析,培养解决问题的能力和逻辑思维能力。
情感态度价值观目标:1. 学生通过学习拓扑排序算法,体验算法在实际问题中的应用价值,增强学习兴趣和动力。
2. 学生在团队协作中,培养沟通能力、合作精神和集体荣誉感。
3. 学生在学习过程中,树立正确的价值观,认识到科学技术的进步对社会发展的重要意义。
课程性质:本课程属于数据结构与算法领域,旨在帮助学生掌握拓扑排序这一重要算法,提高解决实际问题的能力。
学生特点:学生具备一定的编程基础和图论知识,具有一定的抽象思维和逻辑分析能力。
教学要求:结合学生特点和课程性质,教师应注重启发式教学,引导学生通过实例分析、编程实践等方式,掌握拓扑排序算法,提高实际应用能力。
同时,关注学生的情感态度价值观培养,激发学生的学习兴趣和动力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。
二、教学内容1. 图的基本概念复习:介绍图的相关术语,如顶点、边、邻接点、度等,回顾有向图和无向图的特点。
2. 有向无环图(DAG)的判定:讲解DAG的定义,引导学生识别DAG及其在实际问题中的应用。
3. 拓扑排序的概念与算法:介绍拓扑排序的定义,阐述拓扑排序的算法步骤,分析拓扑排序与DAG的关系。
4. 拓扑排序算法的实现:结合教材,教授编程语言实现拓扑排序算法,包括邻接表和邻接矩阵两种表示方法。
5. 拓扑排序的应用案例:分析拓扑排序在项目管理、任务调度等领域的应用,结合实际案例进行讲解。
数据结构-拓扑排序-实验报告与代码
实验报告七----拓扑排序一.需求分析1、采用邻接表法的存储结构来定义有向图2、实现有向图的创建、遍历3、实现栈的创建及其基本操作(进栈、退栈、判空)4、求图中顶点的入度二.算法设计本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系拓扑排序的基本思想是以下两点:1、在有向图中选一个没有前驱的顶点且输出之。
2、从图中删除该顶点何所有以它为尾的弧。
3、查邻接表中入度为零的顶点,并进栈。
当栈为空时,进行拓扑排序。
(a)退栈,输出栈顶元素V。
(b)在邻接表中查找Vj的直接后继Vk,将Vk的入度减一,并令入度减至零的顶点进栈。
4、重复上述两步,直至全部顶点均已输出。
如每输出完,则证明有环。
程序基本结构:设定栈的抽象数据类型定义:ADT Stack {数据对象:D={i a |i a ∈CharSet ,i=1,2,3,…..,n,n>=0;}数据关系:R={<1-i a ,i a >|1-i a ,i a ∈D,i=2,…,n}存储结构:(1)表结点typedef struct ArcNode{i nt adjvex;s truct ArcNode *nextarc;}ArcNode;(2)链表的存储结构typedef struct VNode{i nt data;A rcNode *firstarc;}VNode,AdjList[MAX_VEXTEX_NUM];(3)图的存储结构typedef struct{A djList vertices;i nt vexnum, arcnum;}ALGraph;(4)栈的存储结构typedef struct{E lemType *base;E lemType *top;i nt stacksize;}SqStack;三.程序设计根据算法设计中给出的有关数据和算法,选定物理结构,详细设计需求分析中所要求的程序。
数据结构课程设计拓扑排序(顺序,逆序输出)
目录一.需求分析说明 (1)二.概要设计说明 (1)三.详细设计说明 (2)四.调试分析 (6)五.用户使用说明 (6)六.课程设计总结 (7)七.测试结果 (8)八.参考书目 (9)九. 附录 (10)一、需求分析说明为了更好的学习数据结构,深刻理解数据结构在解决实际问题中的应用,体会其重要性,熟练掌握线性表、栈和队列、串、数组、树、图等常用的数据结构,熟悉各自的特点和应用场合。
同时锻炼自己独立分析理解问题的能力,学会根据不同的问题选择合适的数据结构,然后结合适当的算法解决问题。
锻炼自己的设计和编写程序的技巧,进一步调试和测试自己所写的程序,使其功能更加完善,养成较好的编写程序习惯。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
设计的基本要求:1)选择邻接表作为有向图的存储结构模拟整个过程,并输出拓扑排序的顶点序列。
2)给出逆向的拓扑有序序列。
二、概要设计说明2.1 算法思想采用邻接表存储结构实现有向图;有向图需通过顶点数、边数、顶点以及边等信息建立。
拓扑排序算法大体思想为:1)遍历有向图各顶点的入度,将所有入度为零的顶点入栈;2)栈非空时,输出一个顶点,并对输出的顶点数计数;3)该顶点的所有邻接点入度减一,若减一后入度为零则入栈;4)重复2)、3),直到栈为空,若输出的顶点数与图的顶点数相等则该图可拓扑排序,否则图中有环;5)重复2)、3)、4)直到序列中所有元素均被遍历,则该序列是拓扑序列,否则不是拓扑序列。
2.2 系统功能模块结构图本程序包括拓扑排序模块和拓扑排序核心算法模块。
3.13.2 数据结构1)图typedef struct stack{int *base;int *top;int stacksize;}sqstack;//栈的结构,存储图的顶点序号typedef struct lnode{int adjvex;struct lnode *next;}ArcNode;//弧结点typedef struct node2{int data;ArcNode *fristarc;}VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧typedef struct{AdjList vertices;int vexnum,arcnum;}Graph;//邻接表图void CreatGraph(Graph &G,int *indegree){cout<<"请输入图的顶点数和边数(且顶点数不能超过"<<MAX<<"个)"<<endl;cin>>G.vexnum>>G.arcnum;cout<<"请输入各个顶点值(整形):"<<endl;for(int i=0;i<G.vexnum;i++)//输入图的顶点{cin>>G.vertices[i].data;G.vertices[i].fristarc=NULL;indegree[i]=0;}for(i=0;i<G.arcnum;i++)//输入图的边{int m,n;ArcNode *p;cout<<"请输入第"<<i+1<<"条边的头结点和尾结点:"<<endl;cin>>m>>n;p=new ArcNode;if(!p)exit(0);indegree[n-1]++;//求每个顶点的入度值p->adjvex=n-1;p->next=G.vertices[m-1].fristarc;G.vertices[m-1].fristarc=p;}}2)栈void Initstack(sqstack &s){s.base=new int;if(!s.base)exit(0);s.top=s.base;s.stacksize= STACK_INIT_SIZE;}void Push(sqstack &s,int &e){*s.top++=e;}int Emptystack(sqstack &s){if(s.base==s.top)return 1;elsereturn 0;}int Pop(sqstack &s,int &e){if(s.base==s.top)return ERROR;e=*--s.top;}3.3 具体实现函数1)程序所需头文件及全局变量#include<iostream>using namespace std;const int MAX=30;const int STACK_INIT_SIZE=100;const int ERROR=0;2)栈的操作①void Initstack(sqstack &s)功能:初始化栈,构造一个空栈S参数:S待初始化的栈②i nt Emptystack(sqstack &s)功能:判断栈是否为空参数:S 待判断的栈返回值:栈为空返回1,栈非空返回0③void Push(sqstack &s,int &e)功能:元素入栈参数:S 待操作的栈:插入元素e为新的栈顶元素④int Pop(sqstack &s,int &e)功能:元素出栈参数:S 待操作的栈:若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回03)图的建立void CreatGraph(Graph &G,int *indegree)功能:建立有向图,并记录每个节点的入度值参数:G 待建立的图:用indegree记录节点的入度值4)拓扑排序int Toposort(Graph &G,int *indegree)功能:对有向图进行拓扑排序,对排序结果进行顺序和逆序输出参数:G 待排序的图:indegree是节点的入度值5)主函数int main()对各个函数进行调用,实现程序功能判断是否排序成功四、调试分析4.1 数据测试1、对存在环的有向图进行测试有向图的顶点数和边数:4 4各顶点的值:1 2 3 4第一条边1 2第二条边的头结点和尾结点:2 3第三条边的头结点和尾结点:3 4第四条边的头结点和尾结点:4 1测试结果:拓扑排序不成功。
数据结构课程设计 拓扑排序(顺序,逆序输出)
目录一.需求分析说明 (1)二.概要设计说明 (1)三.详细设计说明 (2)四.调试分析 (6)五.用户使用说明 (6)六.课程设计总结 (7)七.测试结果 (8)八.参考书目 (9)九. 附录 (10)一、需求分析说明为了更好的学习数据结构,深刻理解数据结构在解决实际问题中的应用,体会其重要性,熟练掌握线性表、栈和队列、串、数组、树、图等常用的数据结构,熟悉各自的特点和应用场合。
同时锻炼自己独立分析理解问题的能力,学会根据不同的问题选择合适的数据结构,然后结合适当的算法解决问题。
锻炼自己的设计和编写程序的技巧,进一步调试和测试自己所写的程序,使其功能更加完善,养成较好的编写程序习惯。
提高综合运用所学的理论知识和方法独立分析和解决问题的能力,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
设计的基本要求:1)选择邻接表作为有向图的存储结构模拟整个过程,并输出拓扑排序的顶点序列。
2)给出逆向的拓扑有序序列。
二、概要设计说明2.1 算法思想采用邻接表存储结构实现有向图;有向图需通过顶点数、边数、顶点以及边等信息建立。
拓扑排序算法大体思想为:1)遍历有向图各顶点的入度,将所有入度为零的顶点入栈;2)栈非空时,输出一个顶点,并对输出的顶点数计数;3)该顶点的所有邻接点入度减一,若减一后入度为零则入栈;4)重复2)、3),直到栈为空,若输出的顶点数与图的顶点数相等则该图可拓扑排序,否则图中有环;5)重复2)、3)、4)直到序列中所有元素均被遍历,则该序列是拓扑序列,否则不是拓扑序列。
2.2 系统功能模块结构图本程序包括拓扑排序模块和拓扑排序核心算法模块。
3.13.2 数据结构1)图typedef struct stack{int *base;int *top;int stacksize;}sqstack;//栈的结构,存储图的顶点序号typedef struct lnode{int adjvex;struct lnode *next;}ArcNode;//弧结点typedef struct node2{int data;ArcNode *fristarc;}VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧typedef struct{AdjList vertices;int vexnum,arcnum;}Graph;//邻接表图void CreatGraph(Graph &G,int *indegree){cout<<"请输入图的顶点数和边数(且顶点数不能超过"<<MAX<<"个)"<<endl;cin>>G.vexnum>>G.arcnum;cout<<"请输入各个顶点值(整形):"<<endl;for(int i=0;i<G.vexnum;i++)//输入图的顶点{cin>>G.vertices[i].data;G.vertices[i].fristarc=NULL;indegree[i]=0;}for(i=0;i<G.arcnum;i++)//输入图的边{int m,n;ArcNode *p;cout<<"请输入第"<<i+1<<"条边的头结点和尾结点:"<<endl;cin>>m>>n;p=new ArcNode;if(!p)exit(0);indegree[n-1]++;//求每个顶点的入度值p->adjvex=n-1;p->next=G.vertices[m-1].fristarc;G.vertices[m-1].fristarc=p;}}2)栈void Initstack(sqstack &s){s.base=new int;if(!s.base)exit(0);s.top=s.base;s.stacksize= STACK_INIT_SIZE;}void Push(sqstack &s,int &e){*s.top++=e;}int Emptystack(sqstack &s){if(s.base==s.top)return 1;elsereturn 0;}int Pop(sqstack &s,int &e){if(s.base==s.top)return ERROR;e=*--s.top;}3.3 具体实现函数1)程序所需头文件及全局变量#include<iostream>using namespace std;const int MAX=30;const int STACK_INIT_SIZE=100;const int ERROR=0;2)栈的操作①void Initstack(sqstack &s)功能:初始化栈,构造一个空栈S参数:S待初始化的栈②i nt Emptystack(sqstack &s)功能:判断栈是否为空参数:S 待判断的栈返回值:栈为空返回1,栈非空返回0③void Push(sqstack &s,int &e)功能:元素入栈参数:S 待操作的栈:插入元素e为新的栈顶元素④int Pop(sqstack &s,int &e)功能:元素出栈参数:S 待操作的栈:若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回03)图的建立void CreatGraph(Graph &G,int *indegree)功能:建立有向图,并记录每个节点的入度值参数:G 待建立的图:用indegree记录节点的入度值4)拓扑排序int Toposort(Graph &G,int *indegree)功能:对有向图进行拓扑排序,对排序结果进行顺序和逆序输出参数:G 待排序的图:indegree是节点的入度值5)主函数int main()对各个函数进行调用,实现程序功能判断是否排序成功四、调试分析4.1 数据测试1、对存在环的有向图进行测试有向图的顶点数和边数:4 4各顶点的值:1 2 3 4第一条边1 2第二条边的头结点和尾结点:2 3第三条边的头结点和尾结点:3 4第四条边的头结点和尾结点:4 1测试结果:拓扑排序不成功。
数据结构拓扑排序课程设计
课题二拓扑排序2.1 问题的提出2.1 问题的提出任务:编写函数实现图的拓扑排序。
程序所实现的功能:建立对应的邻接表,对该图进行拓扑排序,并显示排序结果。
输入:顶点数, 边数及各顶点信息(数据格式为整形)输出:拓扑排序结果。
2. 2 概要设计1.拓扑排序是指由某个集合上的一个偏序得到该集合上的一个全序。
更直观地讲,一个偏序是自反的、反对称的,用图表示时每个点都有环且只有单向边。
拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。
2.解决拓扑排序的方法如下:(1)在有向图中选一个没有前驱的顶点且输出之。
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。
后一种情况则说明有向图中存在环。
具体的算法实现参照源程序。
3.构造邻接表图:typedef struct{AdjList vertices;int vexnum,arcnum;}Graph;//邻接表图4.为了避免重复检测入度为零的顶点,源程序中设了一个栈,暂存所有入度为零的顶点:typedef struct stack{int *base;int *top;int stacksize;}sqstack;//栈的结构,存储图的顶点序号2.3 流程图2.根据算法思想,画流程图如下:2.4 源代码//采用尾插法创的邻接图#include<iostream>using namespace std;const int MAX=20;const int STACK_INIT_SIZE=100;const int ERROR=0;typedef struct stack{int *base;int *top;int stacksize;}sqstack;//栈的结构,存储图的顶点序号typedef struct lnode{int adjvex;struct lnode *next;}ArcNode;//弧结点typedef struct node2{char data;ArcNode *fristarc;}VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧typedef struct{AdjList vertices;int vexnum,arcnum;}Graph;//邻接表图void Initstack(sqstack &s){s.base=new int;if(!s.base)exit(0);s.top=s.base;s.stacksize= STACK_INIT_SIZE;}void Push(sqstack &s,int &e){*s.top++=e;}int Emptystack(sqstack &s){if(s.base==s.top)return 1;elsereturn 0;}int Pop(sqstack &s,int &e){if(s.base==s.top)return ERROR;e=*--s.top;}void CreatGraph(Graph &G,int *indegree){cout<<"请输入图的顶点数和弧数(且顶点数不能超过"<<MAX<<")"<<endl; cin>>G.vexnum>>G.arcnum;cout<<"请输入顶点值:"<<endl;for(int i=0;i<G.vexnum;i++)//输入图的顶点{cin>>G.vertices[i].data;G.vertices[i].fristarc=NULL;indegree[i]=0;}for(i=0;i<G.arcnum;i++)//输入图的弧{int m,n;ArcNode *p;cout<<"请输入第"<<i+1<<"条弧的弧尾和弧头:"<<endl;cin>>m>>n;p=new ArcNode;if(!p)exit(0);indegree[n-1]++;//求每个顶点的入度值p->adjvex=n-1;p->next=G.vertices[m-1].fristarc;G.vertices[m-1].fristarc=p;}}int Toposort(Graph &G,int *indegree){sqstack S;Initstack(S);for(int i=0;i<G.vexnum;i++)//0入度顶点入栈{if(!indegree[i])Push(S,i);}int count=0;while(!Emptystack(S)){Pop(S,i);cout<<G.vertices[i].data<<" ";count++;//记录输出的顶点数for(ArcNode *p=G.vertices[i].fristarc;p;p=p->next)//把与顶点{ //相邻接的顶点的入度int k=p->adjvex;if(!(--indegree[k]))Push(S,k);}}if(count<G.vexnum)return 0;elsereturn 1;}int main(){Graph G;int *indegree;indegree=new int;CreatGraph(G,indegree);if(!Toposort(G,indegree)){cout<<endl;cout<<"拓扑排序不成功!"<<endl;}else{cout<<endl;cout<<"拓扑排序成功!"<<endl;}return 0;}2.5 结果与分析2.4 测试及性能分析1.它的时间复杂度是O(G.vexnum+G.arcnum)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:拓扑排序算法院(系):计算机学院专业:计算机科学与技术(嵌入式系统方向)班级:14010105班学号:*******************指导教师:***目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图 (2)2.2.2 流程图分析 (3)3 数据结构分析 (7)3.1存储结构 (7)3.2算法描述 (7)4 调试与分析 (12)4.1调试过程 (12)4.2程序执行过程 (12)参考文献 (14)附录(关键部分程序清单) (15)1 课程设计介绍1.1 课程设计内容由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
若在图一的有向图上人为的加一个表示V2<=V3的弧(“<=”表示V2领先于V3)则图一表示的亦为全序且这个全序称为拓扑有序,而由偏序定义得到拓扑有序的操作便是拓扑排序。
在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。
编写算法建立有向无环图,主要功能如下:1.能够求解该有向无环图的拓扑排序并输出出来;2.拓扑排序应该能处理出现环的情况;3.顶点信息要有几种情况可以选择。
1.2 课程设计要求1.输出拓扑排序数据外,还要输出邻接表数据;2.参考相应的资料,独立完成课程设计任务;3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析本课设题目要求编写算法能够建立有向无环图,有向无环图,顾名思义,即一个无环的有向图,是一类较有向图更一般的特殊有向图。
其功能要求及个人在写程序时对该功能的实现作如下分析:1. 将图以合适的方式存储起来。
图有多种存储方式,其中最常用的存储方式有图的邻接矩阵和邻接表。
本人在构思时使用邻接表来建立有向无环图,将其存储起来;2. 求解该有向无环图的拓扑排序,并将其输出出来。
若通过构造,建立了一个有向无环图,那么一定可以求出其拓扑排序,其原理比较简单。
即统计每个节点的入度,将入度为0的结点提取出来,然后再统计剩下的结点的入度,再次将入度为零的结点提取出来,以此类推,这样就形成了一个序列,这样的序列就是该图的拓扑排序序列;3. 拓扑排序算法应能够处理出现环的情况。
个人在写程序时,考虑到构造图时,会有构造成有向有环图的情况,应该在运行程序时,试着统计依次按照入读为零的节点输出的节点数是否为整个节点的总数,如果是,那么拓扑排序成功,输出拓扑排序的结果,否者输出“有环出现”;4. 输出除拓扑排序外,还要求输出邻接表数据。
由于图是用邻接表存储的,所以将邻接表按照顺序依次打印输出。
2.2 原理图介绍2.2.1 功能模块图图2.1 功能模块图 2.2.2 流程图分析1. 如图2.2所示,根据题目要求建立一个有向无环图,按照提示,依次输入节点数和变数,然后输入两个联通的节点<u,v>,前者指向后者,当输入边数为所要输入的数目时,输入结束,有向图建立完成(未判断是否有环)。
图2.2 建立有向无环图拓扑排序 打印邻接表图的建立 邻接表 入读为零的依次输出有向无环图可进行拓扑排序算法邻接矩阵2.如图2.3所示,判断有向图是否为有向无环图。
按照输入的有向图建立一个邻接表,将图储存在邻接表中,并将邻接表打印,然后对该邻接表进行拓扑排序,依次取入度为零的节点,入栈,并删除该节点和该节点有关的所边,若入栈节点个数与节点数相同,则全部入栈,该图为无环图,可以进行拓扑排序,若该图节点数大于入栈节点数,则该图为有环图。
图2.3 判断是否为无环图3.此时该图为有向无环图,可进行拓扑排序,在上一过程中,所有节点已经入栈,将栈顶弹出进入另一个空栈,,然后依次输出栈顶,拓扑排序成功。
如图2.4所示。
图2.4 输出拓扑排序结果4.具体内容-图2.5 拓扑排序3 数据结构分析3.1 存储结构一个无环的有向图叫做有向无环图,简称DAG图。
本算法首先要建立一个有向无环图,即通过输入各边的数据,搭建图的结构。
对于图的存储,用到邻接表,是一种链式存储结构。
弧结点结构类型:typedef struct ArcNode{int adjvex; /*该弧指向的顶点的位置*/struct ArcNode *nextarc; /*指向下一条弧的指针*/}ArcNode;邻接表头结点类型:typedef struct VNode{int data; /*顶点信息*/ArcNode *firstarc; /*指向第一条依附于该点的弧的指针*/}VNode,AdjList[MAX_VEXTEX_NUM];3.2 算法描述1. 邻接表的构建创建一个邻接表,首先要输入节点数和边数,然后输入确定一条边的两个节点,通过输入顺序来确定边的方向,构成有向图,具体方法如下:初始化头结点for (i=1; i<=G->vexnum;i++){G->vertices[i].data=i; /*编写顶点的位置序号*/G->vertices[i].firstarc=NULL;}先将头结点清零,编写顶点位置序号。
输入确定弧的两点,如果输入数字大于节点数或者小于零,则输出错误信息,并重新输入一组节点,申请新的节点来储存新的节点信息,该弧指向位置编号为m的节点,下一条弧指向的是依附于n的第一条弧,最后打印生成的邻接表。
for (i=1;i<=G->arcnum;i++){printf("\n输入确定弧的两个顶点u,v:");scanf("%d %d",&n,&m);while (n<0||n>G->vexnum||m<0||m>G->vexnum){printf("输入的顶点序号不正确请重新输入:");scanf("%d%d",&n,&m);}p=(ArcNode*)malloc(sizeof(ArcNode)); /*开辟新的弧结点*/if(p==NULL){printf("ERROR!");exit(1);}p->adjvex=m; /*该弧指向位置编号为m的结点*/p->nextarc=G->vertices[n].firstarc;G->vertices[n].firstarc=p;}printf("\n建立的邻接表为:\n"); /*打印生成的邻接表(以一定的格式)*/for(i=1;i<=G->vexnum;i++){printf("%d",G->vertices[i].data);for(p=G->vertices[i].firstarc;p;p=p->nextarc)printf("-->%d",p->adjvex);printf("\n"); }邻接表构建完成。
2. 入栈操作在本算法中栈主要用来构造拓扑排序序列。
由于栈具有先入后出的特点,所以,将每次选择入度为零的结点入栈,这样当结点都入栈的时候,再依次出栈,进入另一个新栈,这样,排序序列显而易见。
它将图这样的非线性结构转化为栈这样的线性结构。
建立空栈typedef struct{int *base; /*栈底指针*/int *top; /*栈顶指针*/int stacksize;}SqStack;初始化栈void InitStack(SqStack *S){S->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));if(!S->base) /*存储分配失败*/{printf("ERROR!");exit(1);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;}入栈操作,压入新的元素为栈顶,e为新的栈顶元素。
void Push(SqStack *S,int e) /*压入新的元素为栈顶*/{if(S->top-S->base>=S->stacksize){S->base=(int*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));if(!S->base){printf("ERROR!");exit(1);}S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=e;}3. 拓扑排序本程序的拓扑排序,必须在图的邻接表已知的情况下。
它还有另外一个功能:判断一个图是不是无环图。
确切的说,不能单纯的叫拓扑排序,但考虑它主要的作用,在不引起误解的情况下就叫拓扑排序算法。
判断一个图是否为有向无环图并进行拓扑排序,对于本题目来说,由于本题要求是对有向无环图进行拓扑排序,其主要方法是将入度为零的结点依次输出出来,知道图的所有定点全部输出为止。
那么若图为有环图,在环上的结点在其他结点都选择出来后,入度都不为零,即无法被输出出来。
那么就可以认为按照拓扑排序的方法输出结点后,若不是将节点全部输出出来的,则此图为有环图。
输出有向图有环,拓扑排序失败。
若无环,则进行拓扑排序。
通过入栈出栈的操作来完成拓扑排序。
主要算法如下:void TopoSort(ALGraph G){ int indegree[M];int i, k, n;int count=0; /*初始化输出计数器*/ArcNode *p;SqStack S;FindInDegree(G,indegree);InitStack(&S);printf("\n");for(i=1;i<=G.vexnum;i++) /*入度为0的入栈*/{ if(!indegree[i])Push(&S,i);}printf("\n拓扑排序序列为:");while(!StackEmpty(&S)) /*栈不为空*/{Pop(&S,&n); /*弹出栈顶*/printf("%4d",G.vertices[n].data); /*输出栈顶并计数*/count++;for(p=G.vertices[n].firstarc; p!=NULL;p=p->nextarc){k=p->adjvex;if(!(--indegree[k])) /*若入度减为零,则再入栈*/{Push(&S,k);}}}if(count<G.vexnum) { printf("有向图中有环"); }else{ printf(" 排序成功!"); }}4 调试与分析4.1调试过程在调试程序是主要遇到一下几类问题:1.数组的数据容易出现混乱,比如节点用数字标识,数组结点的位置是从0开始,而标识符往往从1开始,这在程序的开始就应该注意到;2.各函数的形参和实参的区别,全局变量,局部变量的区别,特别是在做大型程序的时候,如果多个函数都要用到一个变量,那么就应把该变量定义为全局变量,若错误的定义为局部变量,很容易出现错误;3.程序应该调理清晰,结构明朗,各个函数代表各个模块,起到不同的作用,并协调运作,形成含有不同功能的程序。