大数据结构拓扑排序实验报告材料
拓扑排序实验报告
数学与计算机学院数据结构实验报告年级09数计学号2009432125 姓名刘宝成绩专业数电实验地点主楼401 指导教师苗秀芬实验项目拓扑排序实验日期10年12月24日一、实验目的1掌握图的存储结构及其基本操作,学会定义图的邻接表存储结构,并能在实际问题中灵活运用。
2掌握拓扑排序算法。
3、通过本实验的具体应用实例,灵活运用拓扑排序并进一步巩固队列/栈的运用。
二、实验问题描述1简介:用邻接表形式存储实验中的有向无环图,此有向无环图称为:AOV网,若网中每一个顶点都在他的拓扑排序中,则说明不存在环。
2步骤:①从AOV网中选出一个没有前驱的结点,并输出他;②从网中删除此结点,并且删除从该顶点发出的所有有向边(邻接点的入度-1)③重复以上两步,直到途中不存在入度为0的顶点为止三、实验步骤1、实验问题分析(1)顶点表typedef struct//顶点表结点{int in;//入度int vertex;//顶点域edgenode * firstedge;//边表头指针}vertexnode;(2)边表typedef struct node //边表结点{int adjvex;//邻接点域struct node * next;//指向下一个邻接点的指针域}edgenode;(3)以邻接表类型存储的图类型typedef struct{Adjlist adjlist; //邻接表int vnum,Enum; //顶点数和边数}Algraph;2、功能(函数)设计(1)建立一个以邻接表存储的有向图函数原型:void creatalgraph(Algraph *G)(2)拓扑排序函数原型:void TopoSort(Algraph *G)四、实验结果(程序)及分析1、实验主要模块代码(带注释!)或模块的流程图(1)建立一个以邻接表存储的有向图void creatalgraph(Algraph *G)//创建邻接链表{int i,k,j;edgenode *s;cout<<"该AOV网的顶点数和边数:"<<endl;cin>>G->vnum>>G->Enum; //读入顶点数和边数cout<<"请输入顶点信息:"<<endl;for(i=0;i<G->vnum;i++) //建立有vnum个顶点的顶点表{cin>>G->adjlist[i].vertex; //读入顶点信息G->adjlist[i].in=0;G->adjlist[i].firstedge=NULL; //顶点的边表头指针设为空}cout<<"请输入边的信息:"<<endl; //for(k=0;k<G->Enum;k++) //建立边表{cout<<"依次输入每一条边:"<<endl;cout<<"从";cin>>i;cout<<"邻接到";cin>>j;cout<<endl;//读入边<vi,vj>的顶点对应的序号s=new edgenode; //生成新的边表结点s->adjvex=j; //邻接点的序号为js->next=G->adjlist[i].firstedge; //将新边表结点s插入到顶点vi的边表头部G->adjlist[i].firstedge=s;}}(2)拓扑排序int toposort(Algraph *G){int i,j,k;int m=0,top;edgenode *ptr;top=-1;for(i=0;i<G->vnum;i++)if(G->adjlist[i].in==0){ G->adjlist[i].in=top;top=i;}while(top!=-1){j=top;top=G->adjlist[top].in;cout<<G->adjlist[j].vertex<<endl;m++;ptr=G->adjlist[j].firstedge;while(ptr!=NULL){k=ptr->adjvex;G->adjlist[k].in--;if(G->adjlist[k].in==0){G->adjlist[k].in=top;top=k;}ptr=ptr->next;//头插入}}if(m<G->vnum){cout<<"此图中存在环!无法进行拓扑排序"<<endl;return 0;//返回错误代码0}elsereturn 1;//成功返回1}2、测试数据3、调试过程中出现的问题以及解决策略。
数据结构拓扑排序实验报告
数据结构拓扑排序实验报告数据结构拓扑排序实验报告一、引言本实验报告旨在介绍拓扑排序算法在数据结构中的应用。
拓扑排序是一种用于有向无环图(DAG)的排序算法,它可以将DAG中的节点按照拓扑顺序进行排列,即节点的排列满足所有的有向边都是从排在前面的节点指向排在后面的节点。
拓扑排序在实际生活中有广泛应用,比如任务调度、课程安排等。
二、算法原理拓扑排序的基本原理是通过在DAG中不断删除入度为0的节点,并将这些节点输出,直到所有节点都被输出。
具体步骤如下: 1-统计每个节点的入度。
2-将入度为0的节点加入输出结果中。
3-删除所有以该节点为起点的边,即将它指向的节点的入度减1。
4-重复步骤2和步骤3,直到没有节点的入度为0。
三、实验步骤及结果本实验通过实现拓扑排序算法,对给定的有向图进行拓扑排序,并输出排序结果。
具体步骤如下:1-构建有向图,并初始化每个节点的入度为0。
2-输入有向边的信息,并根据有向边更新每个节点的入度。
3-使用拓扑排序算法对有向图进行排序,并输出排序结果。
4-验证排序结果是否符合要求。
实验结果如下:给定的有向图为:A -> CB -> CB -> DC -> ED -> FE -> F经过拓扑排序算法排序后的结果为:A ->B ->C ->D ->E -> F四、实验分析通过对实验结果的观察和分析发现,拓扑排序算法能够正确地对有向图进行排序。
在本实验中,所有的节点都能够按照拓扑顺序进行排列,说明该有向图是一个有向无环图(DAG)。
五、实验总结通过本次实验,我们深入了解了拓扑排序算法在数据结构中的应用。
拓扑排序算法能够有效地对有向无环图进行排序,广泛应用于任务调度、课程安排等实际问题中。
在实验过程中,我们成功实现了拓扑排序算法,并验证了其正确性和可靠性。
附件:本文档未涉及附件。
法律名词及注释:本文档未涉及法律名词及注释。
拓扑排序实验报告
实验题目:图的应用实验目的:(1)熟练掌握图的基本存储方法;(2)熟练掌握图的深度优先和广度优先搜索方法;(3)掌握AOV网和拓扑排序算法;(4)掌握AOE网和关键路径。
实验内容:拓扑排序。
任意给定一个有向图,设计一个算法,对它进行拓扑排序。
拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓朴有序序列;或者直到图中没有无前趋的顶点为止,此情形表明有向图中存在环。
设计分析:为实现对无权值有向图进行拓扑排序,输出拓扑序列,先考虑如何存储这个有向图。
拓扑排序的过程中要求找到入度为0的顶点,所以要采用邻接表来存储有向图,而要得到邻接表,则先要定义有向图的邻接矩阵结构,再把邻接矩阵转化成邻接表。
在具体实现拓扑排序的函数中,根据规则,当某个顶点的入度为0(没有前驱顶点)时,就将此顶点输出,同时将该顶点的所有后继顶点的入度减1,为了避免重复检测入度为0的顶点,设立一个栈St,以存放入度为0的顶点。
源程序代码:#include<stdio.h>#include<stdlib.h>#define MAXV 10 // 最大顶点个数typedef struct{int edges[MAXV][MAXV]; // 邻接矩阵的边数组int n; // 顶点数}MGraph;typedef struct ANode{int adjvex; // 该弧的终点位置struct ANode * nextarc; // 指向下一条弧的指针}ArcNode;typedef struct{int no; // 顶点信息int count; // 顶点入度ArcNode * firstarc; // 指向第一条弧}VNode, AdjList[MAXV];typedef struct{AdjList adjlist; // 邻接表int n; // 图的顶点数}ALGraph;void MatTolist(MGraph g, ALGraph * &G){int i, j, n=g.n;ArcNode * p;G = (ALGraph *)malloc(sizeof(ALGraph));for (i=0; i<n; i++)G->adjlist[i].firstarc = NULL;for (i=0; i<n; i++)for (j=n-1; j>=0; j--)if (g.edges[i][j]!=0){p=(ArcNode *)malloc(sizeof(ArcNode));p->adjvex = j;p->nextarc = G->adjlist[i].firstarc;G->adjlist[i].firstarc = p;}G->n=n;}void TopSort(ALGraph * G){int i,j,flag=0,a[MAXV];int St[MAXV], top = -1; // 栈St的指针为topArcNode * p;for (i=0; i<G->n; i++) // 入度置初值为0 G->adjlist[i].count = 0;for (i=0; i<G->n; i++) // 求所有顶点的入度{p=G->adjlist[i].firstarc;while (p!=NULL){G->adjlist[p->adjvex].count++;p=p->nextarc;}}for (i=0; i<G->n; i++)if (G->adjlist[i].count==0) // 入度为0的顶点进栈{top++; St[top] = i;}while (top>-1) // 栈不为空时循环{i = St[top]; top--; // 出栈a[flag++]=i; // 输出顶点p=G->adjlist[i].firstarc; // 找第一个相邻顶点while (p!=NULL){j = p->adjvex;G->adjlist[j].count--;if (G->adjlist[j].count==0){top++; St[top] = j; // 入度为0的相邻顶点进栈}p = p->nextarc; // 找下一个相邻顶点}}if (flag<G->n)printf("该图存在回路,不存在拓扑序列!\n");else{printf("该图的一个拓扑序列为:");for(i=0; i<flag; i++)printf("%d", a[i]);printf("\n");}}void main(){int i, j;MGraph g;ALGraph * G;G=(ALGraph *)malloc(sizeof(ALGraph));printf("请输入图的顶点数:");scanf("%d", &g.n);printf("请输入图的邻接矩阵:\n");for(i=0; i<g.n; i++)for(j=0; j<g.n; j++)scanf("%d", &g.edges[i][j]);MatTolist(g, G);TopSort(G);} 测试用例:对图7-1所示的有向图进行拓扑排序的测试结果如下:图7-1图7-2程序执行界面,提示输入图的顶点数,输入之后又提示输入其邻接矩阵,对图7-1所示的有向图的邻接矩阵输入如图7-2所示。
拓扑排序的实现实验报告
拓扑排序的实现实验报告GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称拓扑排序的实现课程名称数据结构与算法教程课程号学院(系) 数学与计算机专业软件工程班级学生姓名学号实验地点实验日期一、实验内容、目的掌握拓扑排序的原理和方法。
二、实验原理a)算法基本思想用Kahn算法。
先使用一个栈保存入度为0 的顶点,然后输出栈顶元素并且将和栈顶元素有关的边删除,减少和栈顶元素有关的顶点的入度数量并且把入度减少到0的顶点也入栈。
b)实验程序说明1.创建栈。
2.计算每个顶点的入度,保存在数组中。
3.将入度为0的顶点入栈。
4.创建循环,将栈顶元素出栈,输出拓扑序列,再创建循环,顶点入度减1,若为0则入栈。
5.判断图是否有环,若有则失败。
三、程序流程图四、实现步骤1.在有向图中选一个没有前驱的顶点并且输出2.从图中删除该顶点和所有以它为尾的弧(白话就是:删除所有和它有关的边)3.重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。
五、实验结果一个有向无环图,输入6 81 21 31 43 23 54 56 46 5六、操作说明需要对有向无环图分解,顶点个数,边条数,每条边的起点终点编号,然后再输入。
七、附录:代码bool Graph_DG::topological_sort() {cout << "图的拓扑序列为:" << endl;//栈s用于保存栈为空的顶点下标stack s;int i;ArcNode * temp;//计算每个顶点的入度,保存在indgree数组中for (i = 0; i != this->vexnum; i++) {temp = this->arc[i].firstarc;while (temp) {++this->indegree[temp->adjvex];temp = temp->next;}}//把入度为0的顶点入栈for (i = 0; i != this->vexnum; i++) {if (!indegree[i]) {s.push(i);}}//count用于计算输出的顶点个数int count=0;while (!s.empty()) {//如果栈为空,则结束循环i = s.top();s.pop();//保存栈顶元素,并且栈顶元素出栈cout << this->arc[i].data<<" ";//输出拓扑序列temp = this->arc[i].firstarc;while (temp) {if (!(--this->indegree[temp->adjvex])) {//如果入度减少到为0,则入栈s.push(temp->adjvex);}temp = temp->next;}++count;}if (count == this->vexnum) {cout << endl;return true;}cout << "此图有环,无拓扑序列" << endl; return false;//说明这个图有环}成绩指导教师日期注:请用A4纸书写,不够另附纸。
数据结构拓扑排序实验报告
数据结构拓扑排序实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的拓扑排序算法,并通过实际编程实现来验证其有效性和应用场景。
拓扑排序在解决有向无环图(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,符合预期。
数据结构拓扑排序实验报告
数据结构拓扑排序实验报告正文:一、实验目的本实验旨在通过实现拓扑排序算法来加深对数据结构中图的相关概念的理解,掌握拓扑排序的具体步骤与实现方法。
二、实验原理拓扑排序是一种对有向无环图进行排序的算法,它可以将有向无环图的顶点按照线性的顺序排列出来,使得对于任何一个有向边(u, v),都有顶点 u 在排列中出现在顶点 v 之前。
拓扑排序常用于表示图中的依赖关系,如任务调度、编译顺序等场景。
三、实验步骤1. 构建有向图根据实际需求构建有向图,可以使用邻接表或邻接矩阵等数据结构来表示有向图。
2. 执行拓扑排序算法利用拓扑排序算法对构建的有向图进行排序,可选择使用深度优先搜索(DFS)或广度优先搜索(BFS)等算法实现。
3. 输出排序结果将排序后的顶点按照线性的顺序输出,得到拓扑排序的结果。
四、实验结果与分析1. 实验数据以图 G = (V, E) 的顶点集合 V 和边集合 E,构建了如下的有向图:V = {A, B, C, D, E, F}E = {(A, C), (B, C), (C, D), (D, E), (E, F)}2. 拓扑排序结果经过拓扑排序算法的处理,得到的拓扑排序结果如下: A, B, C, D, E, F3. 结果分析可以看出,根据有向图的依赖关系,拓扑排序算法能够将顶点按照合理的顺序进行排序。
拓扑排序的结果可以作为图中顶点的执行顺序,具有重要的应用价值。
五、实验总结通过本次实验,我们深入学习了拓扑排序算法,并成功实现了拓扑排序的过程。
拓扑排序在图论和数据结构中具有广泛的应用,对于理解和解决与图相关的问题具有重要意义。
六、附件本文档没有涉及附件内容。
七、法律名词及注释本文档没有涉及法律名词及注释。
拓扑排序实验报告
拓扑排序实验报告一、引言拓扑排序是一种图论中重要的算法,用于对有向无环图(DAG)中的顶点进行排序。
在该实验中,我们将对拓扑排序的算法进行实现,并对其进行性能分析和评估。
二、实验目的1. 了解拓扑排序的基本概念和算法;2. 实现拓扑排序的算法;3. 进行性能分析和评估,探究其时间复杂度。
三、实验方法1. 根据给定的有向无环图构建邻接表;2. 使用深度优先搜索(DFS)算法实现拓扑排序;3. 对不同规模的图进行拓扑排序,并记录所用时间;4. 分析并评估算法的性能。
四、实验过程1. 构建邻接表:根据给定的有向无环图,我们首先构建它的邻接表表示。
邻接表中的每个节点表示一个顶点,其指针指向该顶点的所有后继节点。
2. 深度优先搜索拓扑排序:从图中选择一个未被访问过的顶点作为起始点,递归地遍历其所有后继节点,直到所有的顶点都被访问过。
通过递归的方式,可以得到一个拓扑排序的结果。
3. 性能分析和评估:我们使用不同规模的图进行拓扑排序,并记录所用的时间。
根据实验数据,分析算法的时间复杂度,并评估其性能。
五、实验结果我们使用了10个不同规模的有向无环图进行了拓扑排序,并记录了所用的时间。
实验结果表明,随着图规模的增加,算法的时间复杂度也随之增加。
具体结果如下:图规模时间(ms)5 0.00110 0.00350 0.012100 0.025250 0.067500 0.135750 0.2561000 0.3872000 0.8055000 2.016通过以上实验结果,我们可以看出,拓扑排序算法的时间复杂度约为O(n + m),其中n为图中的顶点数,m为图中的边数。
实验结果与理论分析相符。
六、实验总结在本次实验中,我们实现了拓扑排序的算法,并进行了性能分析和评估。
通过实验结果可以看出,随着图规模的增加,算法的时间复杂度也随之增加。
拓扑排序算法是一种非常有用的算法,广泛应用于各个领域,例如编译器的依赖关系分析和任务调度等。
拓扑排序实验报告(两篇)
引言概述:在计算机科学领域,拓扑排序是一个经典的算法问题,用于解决有向无环图中节点的依赖关系排序问题。
通过拓扑排序,可以确定节点之间的先后顺序,从而确保在执行某些操作时不会出现冲突。
本实验报告旨在探讨和分析拓扑排序算法的实现过程和应用场景,以及拓扑排序在解决任务调度、编译器优化等问题中的作用。
正文内容: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,
拓扑排序实验报告
拓扑排序实验报告第一点:实验背景及目的在计算机科学中,拓扑排序是一种针对有向无环图(DAG)的算法,其目的是对图中的所有节点进行排序,使得对于图中的每一条有向边(u,v),节点u在排序中都出现在节点v之前。
拓扑排序的应用非常广泛,如任务调度、编译单元的生成等。
本实验的目的在于使学生理解和掌握拓扑排序的基本概念和方法,培养学生运用拓扑排序解决实际问题的能力。
通过实验,学生应能熟练使用拓扑排序算法对给定的有向无环图进行排序,并理解算法的时间复杂度。
第二点:实验原理与方法拓扑排序算法的基本原理是先找到所有入度为0的节点,将它们加入结果序列中,然后从图中删除这些节点以及它们的出边,之后再找到新的入度为0的节点,重复上述过程,直到所有节点都被加入结果序列中或者图中仍有节点存在。
如果图中仍有节点存在,则说明图中含有环,无法进行拓扑排序。
实验中,我们将使用深度优先搜索(DFS)算法来实现拓扑排序。
具体方法是,从图中的任意节点开始,进行深度优先搜索,每当访问一个节点时,就将它从图中删除,并将其入边所指向的节点入度减一。
当某个节点的入度变为0时,将其加入结果序列中。
重复这个过程,直到所有节点都被删除或者图中仍有节点存在。
以上就是拓扑排序实验报告的第一点和第二点内容,希望能对你有所帮助。
第三点:实验环境与工具为了完成拓扑排序的实验,我们需要准备以下环境和工具:1.编程语言:本实验可以使用C++、Java、Python等编程语言完成。
在这里,我们推荐使用Python,因为Python具有简洁的语法和强大的第三方库支持,非常适合进行算法实验。
2.开发环境:Python开发者可以使用PyCharm、VSCode等集成开发环境进行实验。
这些开发环境提供了代码高亮、调试、语法检查等功能,可以提高开发效率。
3.第三方库:在Python中,我们可能需要使用如matplotlib、networkx等第三方库来绘制图和进行图的算法分析。
拓扑排序实训报告
一、实训目的通过本次拓扑排序实训,掌握拓扑排序的基本原理和算法实现方法,能够运用拓扑排序解决实际问题,提高自己在数据结构和算法方面的应用能力。
二、实训内容1. 拓扑排序原理及算法拓扑排序是一种针对有向无环图(DAG)的排序方法,它将图中的顶点按照某种顺序排列,使得图中所有的有向边都满足方向要求。
具体来说,拓扑排序要求在有向边(u,v)中,顶点u必须在顶点v之前。
拓扑排序的基本思想是:从入度为0的顶点开始,将其加入拓扑序列,然后删除该顶点及其所有出边,更新其他顶点的入度。
重复这个过程,直到所有顶点都被加入拓扑序列。
2. 拓扑排序算法实现本次实训中,我们将学习两种拓扑排序算法实现:(1)基于邻接矩阵的拓扑排序首先,我们使用邻接矩阵表示有向图。
然后,遍历邻接矩阵,找出所有入度为0的顶点,将其加入拓扑序列。
接着,删除该顶点及其所有出边,更新其他顶点的入度。
重复这个过程,直到所有顶点都被加入拓扑序列。
(2)基于邻接表的拓扑排序邻接表是一种链式存储结构,它将图中所有顶点存储在一个链表中,每个顶点对应一个链表,链表中存储与该顶点相连的所有顶点。
基于邻接表的拓扑排序算法如下:(1)初始化拓扑序列为空,入度数组为顶点数大小的数组,所有元素的值设为0。
(2)遍历邻接表,找出所有入度为0的顶点,将其加入拓扑序列,并将入度数组中相应元素的值减1。
(3)删除拓扑序列中的顶点及其所有出边,更新入度数组。
(4)重复步骤(2)和(3),直到拓扑序列不为空。
三、实训过程1. 阅读拓扑排序相关资料,了解其原理和算法实现方法。
2. 使用C++编写基于邻接矩阵的拓扑排序程序,实现图数据的构建、拓扑排序和输出拓扑序列。
3. 使用C++编写基于邻接表的拓扑排序程序,实现图数据的构建、拓扑排序和输出拓扑序列。
4. 对比两种算法的优缺点,分析其在实际应用中的适用场景。
5. 运行程序,测试不同图数据的拓扑排序结果,验证程序的正确性。
四、实训总结1. 通过本次实训,我们掌握了拓扑排序的基本原理和算法实现方法,提高了自己在数据结构和算法方面的应用能力。
拓扑程序开发实验报告(3篇)
第1篇一、实验背景随着计算机网络技术的飞速发展,网络拓扑结构的设计与优化对于提高网络性能、保障网络稳定运行具有重要意义。
本实验旨在通过开发一个拓扑程序,实现对网络拓扑结构的可视化展示、分析及优化,加深对网络拓扑结构的理解,并提升编程实践能力。
二、实验目的1. 理解网络拓扑结构的基本概念及常见类型。
2. 掌握拓扑程序的开发流程,包括需求分析、设计、实现和测试。
3. 学习使用图形化编程工具进行网络拓扑的展示和分析。
4. 提高编程能力,掌握面向对象编程、数据结构及算法等相关知识。
三、实验内容1. 需求分析本拓扑程序应具备以下功能:- 可视化展示网络拓扑结构;- 分析网络拓扑的连通性、层次性、冗余性等特性;- 优化网络拓扑结构,提高网络性能;- 支持多种网络拓扑结构,如星形、树形、环形等。
2. 设计本拓扑程序采用面向对象编程思想,将网络拓扑结构抽象为类,包括节点类、链路类和拓扑类。
节点类用于表示网络中的设备,链路类用于表示设备之间的连接,拓扑类用于表示整个网络拓扑结构。
3. 实现- 节点类:包含节点编号、名称、位置等属性,以及添加链路、删除链路等方法。
- 链路类:包含链路编号、起点、终点、带宽等属性,以及计算链路长度、判断链路是否存在等方法。
- 拓扑类:包含节点列表、链路列表等属性,以及添加节点、删除节点、添加链路、删除链路、计算连通性、分析层次性、优化拓扑结构等方法。
4. 测试本实验采用黑盒测试和白盒测试相结合的方法对拓扑程序进行测试。
黑盒测试主要针对程序的功能进行测试,白盒测试主要针对程序的代码进行测试。
四、实验结果与分析1. 可视化展示通过拓扑程序,可以直观地展示网络拓扑结构,包括设备位置、连接关系等。
2. 分析拓扑程序能够分析网络拓扑的连通性、层次性、冗余性等特性,为网络优化提供依据。
3. 优化拓扑程序可以根据网络需求,优化网络拓扑结构,提高网络性能。
五、实验总结通过本次拓扑程序开发实验,我们深入了解了网络拓扑结构的基本概念及常见类型,掌握了拓扑程序的开发流程,提高了编程能力。
数据结构-拓扑排序-实验报告与代码
实验报告七----拓扑排序一.需求分析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. 加深对数据结构排序算法的理解:通过实验,掌握不同排序算法的工作原理和实现方式。
2. 分析和比较不同排序算法的性能:对比不同排序算法在不同数据规模下的时间复杂度和空间复杂度,理解它们的优劣势。
3. 提高编程和算法设计能力:通过实验的编写,提升对排序算法的实现能力和代码质量。
二、实验内容1. 选择排序算法:选择排序是一种简单直观的排序算法,将序列分为有序和无序两部分,每次从无序部分选择最小(最大)元素,放到有序部分的末尾(开头)。
- 算法原理及步骤- 实现过程中的注意事项- 时间复杂度和空间复杂度的分析2. 插入排序算法:插入排序逐步构建有序序列,对于未排序的元素,在已排序序列中从后向前扫描,找到对应位置插入。
- 算法原理及步骤- 实现过程中的注意事项- 时间复杂度和空间复杂度的分析3. 快速排序算法:快速排序利用分治的思想,将序列分为左右两部分,选取基准元素,将小于基准的放在左边,大于基准的放在右边,递归地对左右部分进行排序。
- 算法原理及步骤- 实现过程中的注意事项- 时间复杂度和空间复杂度的分析4. 归并排序算法:归并排序是一种稳定的排序算法,通过将序列分为若干子序列,分别进行排序,然后再将排好序的子序列合并成整体有序序列。
- 算法原理及步骤- 实现过程中的注意事项- 时间复杂度和空间复杂度的分析5. 堆排序算法:堆是一种特殊的树状数据结构,堆排序利用堆的性质进行排序,通过构建大顶堆或小顶堆,并逐个将堆顶元素移出形成有序序列。
- 算法原理及步骤- 实现过程中的注意事项- 时间复杂度和空间复杂度的分析三、实验结果分析1. 比较不同排序算法的执行时间:根据实验数据和分析,对比不同排序算法在不同数据规模下的执行时间,并针对其时间复杂度进行验证和分析。
数据结构排序实验报告
数据结构排序实验报告一、实验目的本次数据结构排序实验的主要目的是深入理解和掌握常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序和归并排序,并通过实际编程和实验分析,比较它们在不同规模数据下的性能表现,从而为实际应用中选择合适的排序算法提供依据。
二、实验环境本次实验使用的编程语言为 Python 3x,开发环境为 PyCharm。
实验中使用的操作系统为 Windows 10。
三、实验原理1、冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法。
它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
2、插入排序(Insertion Sort)插入排序是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个数组有序。
3、选择排序(Selection Sort)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
4、快速排序(Quick Sort)通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
5、归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
四、实验步骤1、算法实现使用 Python 语言分别实现上述五种排序算法。
为每个算法编写独立的函数,函数输入为待排序的列表,输出为排序后的列表。
2、生成测试数据生成不同规模(例如 100、500、1000、5000、10000 个元素)的随机整数列表作为测试数据。
【数据结构算法】实验9 图的拓扑排序问题(附源代码)
浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验九图的拓扑排序问题实验成绩指导老师(签名)日期一.实验目的和要求1.掌握拓扑排序概念。
2.理解并能实现拓扑排序算法(采用邻接表表示图)。
二. 实验内容1、编写用邻接表表示有向无权图时图的基本操作的实现函数,具体包括:①初始化用邻接表表示的有向无权图void InitAdjoin(adjlist G);②建立用邻接表表示的有向无权图void CreateAdjoin (adjlist G, int n) (即通过输入图的每条边建立图的邻接表);③输出用邻接表表示的有向无权图void PrintAdjoin (adjlist G, int n) (即输出图的每条边)。
把邻接表的结构定义及这些基本操作实现函数存放在头文件Graph3.h中。
2、编写拓扑排序算法void Toposort( adjlist G, int n) (输入为图的邻接表,输出为相应的拓扑序列)。
3、编写测试程序(即主函数),首先建立并输出有向无权图,然后进行拓扑排序。
要求:把拓扑排序函数Toposort以及主函数存放在主文件test9_3.cpp中。
测试数据如下:4、填写实验报告,实验报告文件取名为report9.doc。
5、上传实验报告文件report9.doc与源程序文件test9_3.cpp及Graph3.h到Ftp服务器上自己的文件夹下。
三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路【结构说明】const int MaxVertexNum =10; //图的最大顶点数const int MaxEdgeNum =100; //边数的最大值struct EdgeNode{ //链表边结点,表示弧int adjvex; //存放与头结点顶点有关的另一个顶点在邻接表(数组)中的下标。
EdgeNode *next; //指向链表下一个结点};typedef struct VNode{ //邻接表,表示顶点int data; // 顶点数据,顶点名称EdgeNode *firstarc; // 指向边结点链表第一个结点} adjlist[MaxVertexNum];【函数说明】①void InitAdjoin(adjlist G)功能:初始化用邻接表表示的有向无权图思路:将邻接表的所有顶点置为-1,边结点链表指针置为NULL②void CreateAdjoin (adjlist &G, int n)功能:建立用邻接表表示的有向无权图(即通过输入图的每条边建立图的邻接表)思路:按照输入的顶点信息,新建边结点链入邻接表中对应位置③void PrintAdjoin (adjlist G, int n)功能:输出用邻接表表示的有向无权图(即输出图的每条边)思路:按照一定的格式输出邻接表④void Toposort( adjlist G, int n)功能:输入图的邻接表,输出相应的拓扑序列思路:初始化数组d[ ],利用数组的空间建立入度为零的顶点栈并设置栈顶指针。
数据结构拓扑排序实验报告
数据结构拓扑排序实验报告数据结构拓扑排序实验报告一、引言本实验旨在通过实现拓扑排序算法,对给定的有向图进行排序操作。
拓扑排序是一种对有向图进行排序的算法,根据有向边的方向,将图中的节点排列成线性序列,并满足任意一条边的起点在序列中位于终点之前的要求。
二、实验目的1.理解拓扑排序的概念及原理;2.掌握拓扑排序的具体实现方法;3.实现拓扑排序算法,并对给定的有向图进行排序实验。
三、理论知识1.有向图:由一组顶点和一组有向边组成的图结构,每条有向边连接两个顶点,有方向性。
2.有向边:连接有向图中两个顶点的边,表明了两个顶点之间的关系,有起点和终点之分。
3.入度:指向某一顶点的有向边的数量。
4.拓扑排序:一种对有向图进行排序的算法,要求在排序结果中,任意一条边的起点在序列中位于终点之前。
四、实验步骤1.创建图的数据结构,包括顶点和有向边的表示;2.读入有向图的顶点和边的信息,并构建图的结构;3.计算每个顶点的入度,并初始化拓扑排序结果序列;4.选择一个入度为0的顶点,将其加入拓扑排序结果序列,并将其所连接的顶点的入度减1;5.重复步骤4,直到所有顶点被加入拓扑排序结果序列;6.输出最终的拓扑排序结果。
五、实验结果- 给定的有向图:- 图片附件1:有向图示意图- 通过拓扑排序算法得到的排序结果:- 顶点A →顶点B →顶点C →顶点D →顶点E六、实验分析与总结在本次实验中,我们成功实现了拓扑排序算法,并对给定的有向图进行了排序。
通过实验结果可以看出,拓扑排序可以将有向图中的节点按照依赖关系进行排序。
通过拓扑排序,我们可以找到一个满足依赖关系的节点序列,用于解决诸如任务调度、依赖关系分析等问题。
七、附件- 图片附件1:有向图示意图八、法律名词及注释1.有向图:在图论中,有向图是由一组顶点和一组有向边组成的图结构,每条边连接两个顶点,并有方向性。
2.拓扑排序:一种对有向图进行排序的算法,要求在排序结果中,任意一条边的起点在序列中位于终点之前。
拓扑排序数据结构实验
拓扑排序问题描述:假设用有向网表示教学打算,其中极点表示某门课程,有向边表示课程之间的先修关系(若是A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。
试设计一个教学打算编制程序,获取一个不冲突的线性的课程教学流程。
(课程线性排列,每门课上课时其先修课程已经被安排)。
大体要求:(1)输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。
(2)假设依照输入条件问题无解,那么报告适当的信息;不然将教学打算输出到用户指定的文件中。
需求分析:(测试数据增强版)1、输入形式:第一行是是个整数t,表示有t组测试数据;每一组测试数据的第一行是一个整数n,表示结点数量接下来的n行是n个极点的信息接下来的一行是一个整数m,表示有向边的数量接下来是m行数据每一行是一条有向边的起止结点信息二、输出形式:若是能够实现拓扑排序,输出其取得的合法线性序列不然,输出“Input Error!”;3、功能描述:帮忙判定当前的课程是不是能够安排适当;若是适当,输出一个合法的修读顺序;4、样例输入输出:输入:25MathEnglishPhysicsChineseMusic5Math EnglishMath PhysicsEnglish ChinesePhysic ChineseChinese Music5MathEnglishPhysicsChineseMusic4Math EnglishMath PhysicsEnglish ChinesePhysic Chinese输出:Input Error!Math English Physics Chinese Music 抽象数据结构类型描述(ADT):采纳邻接表的方式来存储数据:抽象数据类型描述:Typedef struct Arc * link;struct Arc{Int adjvex;nfo))return i;}void creat(){cout<<"课程总数:"<<endl;cin>>n;cout<<"请输入各个极点信息(即课程的编号):"<<endl;for(int i=1;i<=n;i++){cin>>v[i].info;v[i].indgree=0;v[i].firstarc=NULL;}cout<<"请输入有向边数量:";cin>>m;cout<<"输入有向边(先修课程编号在前):"<<endl;for(int i=0;i<m;i++){char ss[15],tt[15];cin>>ss>>tt;int s=find(ss),t=find(tt);v[t].indgree++;link p=(link)malloc(sizeof(Arc));strcpy(p->info,v[t].info);p->adjvex=t;p->nextarc=v[s].firstarc;v[s].firstarc=p;}}void update(int node){link p=v[node].firstarc;while(p){if(v[p->adjvex].indgree>0) v[p->adjvex].indgree--; p=p->nextarc;}}int main(){int rel[Max],len=0,t;cout<<"请输入测试数据数量:"<<endl;cin>>t;while(t--){creat();for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)if(!v[i].indgree){rel[len++]=i;v[i].indgree=-1;update(i);}cout<<"------------------------"<<endl; if(len<n) cout<<"Input Error!"<<endl; else{for(int i=0;i<len;i++)cout<<v[i].info<<" ";cout<<endl;}cout<<"------------------------"<<endl; }system("pause");return 0;}/*25MathEnglishPhysicsChineseMusic5Math EnglishMath PhysicsEnglish ChinesePhysic ChineseChinese Music5MathEnglishPhysicsChineseMusic4Math EnglishMath PhysicsEnglish ChinesePhysic Chinese*/调试分析:调试进程中没有发觉什么问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拓扑排序[基本要求] 用邻接表建立一个有向图的存储结构。
利用拓扑排序算法输出该图的拓扑排序序列。
[编程思路]首先图的创建,采用邻接表建立,逆向插入到单链表中,特别注意有向是不需要对称插入结点,且要把输入的字符在顶点数组中定位(LocateVex(Graph G,char *name),以便后来的遍历操作,几乎和图的创建一样,图的顶点定义时加入int indegree,关键在于indegree 的计算,而最好的就是在创建的时候就算出入度,(没有采用书上的indegree【】数组的方法,那样会增加一个indegree算法,而是在创建的时候假如一句计数的代码(G.vertices[j].indegree)++;)最后调用拓扑排序的算法,得出拓扑序列。
[程序代码]头文件:#define MAX_VERTEX_NUM 30#define STACKSIZE 30#define STACKINCREMENT 10#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status;typedef int InfoType;typedef int Status;typedef int SElemType;/* 定义弧的结构*/typedef struct ArcNode{int adjvex; /*该边所指向的顶点的位置*/struct ArcNode *nextarc; /*指向下一条边的指针*/InfoType info; /*该弧相关信息的指针*/}ArcNode;/*定义顶点的结构*/typedef struct VNode{int indegree;char data[10]; /*顶点信息*/ArcNode *firstarc; /*指向第一条依附该顶点的弧的指针*/ }VNode,AdjList[MAX_VERTEX_NUM];/*定义图的结构*/typedef struct {AdjList vertices;int vexnum,arcnum; /*图的当前顶点数和弧数*/int kind; /*图的类型标志*/}Graph;/*定义栈的结构*/typedef struct{SElemType *base;SElemType *top;int stacksize;}Stack;/*顶点定位*/int LocateVex(Graph G,char *name);/*创建有向图*/void CreateGraph(Graph &G);/*拓扑排序*/StatusTopologicalSort(Graph G);/*初始化栈*/Status InitStack(Stack &s) ;/*判断空*/Status EmptyStack(Stack s);/*压栈*/Status Push(Stack &s,int e);/*出栈*/Status Pop(Stack &s,int &e);实现文件:#include <stdio.h>#include"malloc.h"#include "tuopupaixuhead.h"#include "stdlib.h"#include "string.h"bool visited[MAX_VERTEX_NUM];/************************************************************ 顶点定位,返回位序 ************************************************************/int LocateVex(Graph G,char *name){int i;for(i=1;i<=G.vexnum;i++)if(strcmp(name,G.vertices[i].data)==0) //返回数组的位置return i;return -1;}/************************************************************ 创建有向图 ************************************************************/void CreateGraph(Graph &G){ArcNode *p;char name1[10],name2[10];int i,j,k;printf(" 请输入顶点数,按回车键结束:");scanf("%d",&G.vexnum);printf(" 请输入弧数,按回车键结束:");scanf("%d",&G.arcnum);printf(" 请依次输入顶点名(用空格分开且字符小于10),按回车键结束:\n"); printf(" ");for(i=1;i<=G.vexnum;i++) //初始化{scanf("%s",G.vertices[i].data);G.vertices[i].firstarc=NULL;G.vertices[i].indegree=0; //度数均初始化为0}printf("\n\n\n\n");printf(" ………………………………………输入小提示………………………………………\n");printf(" &&&&1 为避免输入遗漏,最好从选择任意一点,输入所有相邻边\n"); printf(" &&&&2 输入边时格式(用空格分开,即格式为顶点(空格)顶点(空格))\n");printf(" ………………………………………输入小提示………………………………………\n\n\n\n");for(k=0;k<G.arcnum;k++){printf(" 请输入相邻的两个顶点,按回车键结束:");scanf("%s%s",name1,name2);i=LocateVex(G,name1);j=LocateVex(G,name2);(G.vertices[j].indegree)++; //每次作为弧的邻接点,则度数加1p=(ArcNode *)malloc(sizeof(ArcNode)); //申请边节点p->adjvex=j; //插入到邻接表中,注意此处为逆向插入到单链表中p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}}/************************************************************ 初始化栈 ************************************************************/Status InitStack(Stack &s) //创建一个空栈{s.base=(int*)malloc(STACKSIZE*sizeof(int));if(!s.base)return (OVERFLOW);s.top=s.base;s.stacksize=STACKSIZE;return OK;}/************************************************************ 判空 ************************************************************/Status EmptyStack(Stack s){if(s.base==s.top)return 1;elsereturn 0;}/************************************************************ 压栈 ************************************************************/Status Push(Stack &s,int e){if((s.top-s.base)>s.stacksize){s.base=(SElemType*)realloc(s.base,(STACKSIZE+STACKINCREMENT)*sizeof(SElemType) );if(!s.base)return(OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;return OK;}/************************************************************ 出栈 ************************************************************/Status Pop(Stack &s,int &e){e=*--s.top;return OK;}/************************************************************ 拓扑排序 ************************************************************/Status TopologicalSort(Graph G) //拓扑排序函数{int i,j,k,e;int count=0; //用来统计顶点的个数Stack S; //定义一个栈,用来保存入度为0的顶点InitStack(S); //初始化栈for(i=1;i<=G.vexnum;++i)if(G.vertices[i].indegree==0) //若第i个顶点的入度为0 ,i表示顶点在图中的位置Push(S,i); //将第i个顶点入栈while(!EmptyStack(S)){Pop(S,e); // 将为入度0的顶点位置出栈j=e;count++; //统计顶点的个数printf("%s ",G.vertices[j].data); //输出入度为0的顶点ArcNode *p;for(p=G.vertices[j].firstarc; p ;p=p->nextarc) //找与第j个顶点的邻接顶点,并将其入度减1{k=p->adjvex;--(G.vertices[k].indegree);if(G.vertices[k].indegree==0) //如果入度为0,就入栈Push(S,k);}}return OK;if(count<G.vexnum) //count小于顶点的个数时候,说明有环,不符合拓扑排序的要求{printf("\n不是有向无环图!\n");return ERROR; //退出}}主文件:#include <stdio.h>#include"malloc.h"#include "tuopupaixuhead.h"#include "stdlib.h"#include "string.h"/************************************************************ 界面控制 ************************************************************/void main(){Graph G;printf("\n################################# 拓扑排序#################################\n");printf("\n $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("\n");CreateGraph(G);printf("各点入度分布如下:\n\n");for(int i=1;i<=G.vexnum;i++){ //输出顶点的度数printf("第%d个顶点%s的度数是%d\n",i,G.vertices[i].data,G.vertices[i].indegree ); }printf("\n\n\n");printf("有向图所有顶点的拓扑排序:\n");TopologicalSort(G);printf("\n");}[实验数据与结果]测试数据:实验结果。