数据结构课程设计——拓扑排序备课讲稿
求拓扑序列排序课程设计
求拓扑序列排序课程设计一、教学目标本课程的教学目标是让学生掌握拓扑序列排序的基本概念、原理和应用,培养学生运用拓扑序列排序解决问题的能力。
具体包括以下三个方面的目标: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.实验设备:计算机、网络设备。
通过以上教学资源的使用,丰富学生的学习体验,提高学生的学习效果。
五、教学评估本课程的教学评估将采取多元化、全过程的方式进行,以全面、客观、公正地评价学生的学习成果。
数据结构课设——有向图的深度、广度优先遍历及拓扑排序
数据结构课设——有向图的深度、⼴度优先遍历及拓扑排序任务:给定⼀个有向图,实现图的深度优先, ⼴度优先遍历算法,拓扑有序序列,并输出相关结果。
功能要求:输⼊图的基本信息,并建⽴图存储结构(有相应提⽰),输出遍历序列,然后进⾏拓扑排序,并测试该图是否为有向⽆环图,并输出拓扑序列。
按照惯例,先上代码,注释超详细:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#pragma warning(disable:4996)#define Max 20//定义数组元素最⼤个数(顶点最⼤个数)typedef struct node//边表结点{int adjvex;//该边所指向结点对应的下标struct node* next;//该边所指向下⼀个结点的指针}eNode;typedef struct headnode//顶点表结点{int in;//顶点⼊度char vertex;//顶点数据eNode* firstedge;//指向第⼀条边的指针,边表头指针}hNode;typedef struct//邻接表(图){hNode adjlist[Max];//以数组的形式存储int n, e;//顶点数,边数}linkG;//以邻接表的存储结构创建图linkG* creat(linkG* g){int i, k;eNode* s;//边表结点int n1, e1;char ch;g = (linkG*)malloc(sizeof(linkG));//申请结点空间printf("请输⼊顶点数和边数:");scanf("%d%d", &n1, &e1);g->n = n1;g->e = e1;printf("顶点数:%d 边数:%d\n", g->n, g->e);printf("请输⼊顶点信息(字母):");getchar();//因为接下来要输⼊字符串,所以getchar⽤于承接上⼀条命令的结束符for (i = 0; i < n1; i++){scanf("%c", &ch);g->adjlist[i].vertex = ch;//获得该顶点数据g->adjlist[i].firstedge = NULL;//第⼀条边设为空}printf("\n打印顶点下标及顶点数据:\n");for (i = 0; i < g->n; i++)//循环打印顶点下标及顶点数据{printf("顶点下标:%d 顶点数据:%c\n", i, g->adjlist[i].vertex);}getchar();int i1, j1;//相连接的两个顶点序号for (k = 0; k < e1; k++)//建⽴边表{printf("请输⼊对<i,j>(空格分隔):");scanf("%d%d", &i1, &j1);s = (eNode*)malloc(sizeof(eNode));//申请边结点空间s->adjvex = j1;//边所指向结点的位置,下标为j1s->next = g->adjlist[i1].firstedge;//将当前s的指针指向当前顶点上指向的结点g->adjlist[i1].firstedge = s;//将当前顶点的指针指向s}return g;//返回指针g}int visited[Max];//标记是否访问void DFS(linkG* g, int i)//深度优先遍历{eNode* p;printf("%c ", g->adjlist[i].vertex);visited[i] = 1;//将已访问过的顶点visited值改为1p = g->adjlist[i].firstedge;//p指向顶点i的第⼀条边while (p)//p不为NULL时(边存在){if (visited[p->adjvex] != 1)//如果没有被访问DFS(g, p->adjvex);//递归}p = p->next;//p指向下⼀个结点}}void DFSTravel(linkG* g)//遍历⾮连通图{int i;printf("深度优先遍历;\n");//printf("%d\n",g->n);for (i = 0; i < g->n; i++)//初始化为0{visited[i] = 0;}for (i = 0; i < g->n; i++)//对每个顶点做循环{if (!visited[i])//如果没有被访问{DFS(g, i);//调⽤DFS函数}}}void BFS(linkG* g, int i)//⼴度优先遍历{int j;eNode* p;int q[Max], front = 0, rear = 0;//建⽴顺序队列⽤来存储,并初始化printf("%c ", g->adjlist[i].vertex);visited[i] = 1;//将已经访问过的改成1rear = (rear + 1) % Max;//普通顺序队列的话,这⾥是rear++q[rear] = i;//当前顶点(下标)队尾进队while (front != rear)//队列⾮空{front = (front + 1) % Max;//循环队列,顶点出队j = q[front];p = g->adjlist[j].firstedge;//p指向出队顶点j的第⼀条边while (p != NULL){if (visited[p->adjvex] == 0)//如果未被访问{printf("%c ", g->adjlist[p->adjvex].vertex);visited[p->adjvex] = 1;//将该顶点标记数组值改为1rear = (rear + 1) % Max;//循环队列q[rear] = p->adjvex;//该顶点进队}p = p->next;//指向下⼀个结点}}}void BFSTravel(linkG* g)//遍历⾮连通图{int i;printf("⼴度优先遍历:\n");for (i = 0; i < g->n; i++)//初始化为0{visited[i] = 0;}for (i = 0; i < g->n; i++)//对每个顶点做循环{if (!visited[i])//如果没有被访问过{BFS(g, i);//调⽤BFS函数}}}//因为拓扑排序要求⼊度为0,所以需要先求出每个顶点的⼊度void inDegree(linkG* g)//求图顶点⼊度{eNode* p;int i;for (i = 0; i < g->n; i++)//循环将顶点⼊度初始化为0{g->adjlist[i].in = 0;}for (i = 0; i < g->n; i++)//循环每个顶点{p = g->adjlist[i].firstedge;//获取第i个链表第1个边结点指针while (p != NULL)///当p不为空(边存在){g->adjlist[p->adjvex].in++;//该边终点结点⼊度+1p = p->next;//p指向下⼀个边结点}printf("顶点%c的⼊度为:%d\n", g->adjlist[i].vertex, g->adjlist[i].in);}void topo_sort(linkG *g)//拓扑排序{eNode* p;int i, k, gettop;int top = 0;//⽤于栈指针的下标索引int count = 0;//⽤于统计输出顶点的个数int* stack=(int *)malloc(g->n*sizeof(int));//⽤于存储⼊度为0的顶点for (i=0;i<g->n;i++)//第⼀次搜索⼊度为0的顶点{if (g->adjlist[i].in==0){stack[++top] = i;//将⼊度为0的顶点进栈}}while (top!=0)//当栈不为空时{gettop = stack[top--];//出栈,并保存栈顶元素(下标)printf("%c ",g->adjlist[gettop].vertex);count++;//统计顶点//接下来是将邻接点的⼊度减⼀,并判断该点⼊度是否为0p = g->adjlist[gettop].firstedge;//p指向该顶点的第⼀条边的指针while (p)//当p不为空时{k = p->adjvex;//相连接的顶点(下标)g->adjlist[k].in--;//该顶点⼊度减⼀if (g->adjlist[k].in==0){stack[++top] = k;//如果⼊度为0,则进栈}p = p->next;//指向下⼀条边}}if (count<g->n)//如果输出的顶点数少于总顶点数,则表⽰有环{printf("\n有回路!\n");}free(stack);//释放空间}void menu()//菜单{system("cls");//清屏函数printf("************************************************\n");printf("* 1.建⽴图 *\n");printf("* 2.深度优先遍历 *\n");printf("* 3.⼴度优先遍历 *\n");printf("* 4.求出顶点⼊度 *\n");printf("* 5.拓扑排序 *\n");printf("* 6.退出 *\n");printf("************************************************\n");}int main(){linkG* g = NULL;int c;while (1){menu();printf("请选择:");scanf("%d", &c);switch (c){case1:g = creat(g); system("pause");break;case2:DFSTravel(g); system("pause");break;case3:BFSTravel(g); system("pause");break;case4:inDegree(g); system("pause");break;case5:topo_sort(g); system("pause");break;case6:exit(0);break;}}return0;}实验⽤图:运⾏结果:关于深度优先遍历 a.从图中某个顶点v 出发,访问v 。
求拓扑排序序列课程设计
求拓扑排序序列课程设计一、教学目标本节课的教学目标是让学生掌握拓扑排序序列的概念、性质和求解方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分:1.知识目标:学生能够理解拓扑排序的定义,了解拓扑排序的性质和应用场景,掌握拓扑排序的求解方法。
2.技能目标:学生能够运用拓扑排序解决实际问题,如任务调度、项目规划等,提高问题解决的效率。
3.情感态度价值观目标:培养学生对计算机科学和图论的兴趣,培养学生的逻辑思维和创新能力。
二、教学内容本节课的教学内容主要包括以下三个方面:1.拓扑排序的定义和性质:介绍拓扑排序的定义,解释拓扑排序的性质,如无环性、唯一性等。
2.拓扑排序的求解方法:讲解拓扑排序的求解方法,如DFS、BFS等,并通过实例进行演示。
3.拓扑排序的应用:介绍拓扑排序在实际问题中的应用,如任务调度、项目规划等,并通过实例进行讲解。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用以下教学方法:1.讲授法:讲解拓扑排序的定义、性质和求解方法,为学生提供系统的知识结构。
2.案例分析法:通过分析实际问题,让学生了解拓扑排序的应用,提高学生的解决问题的能力。
3.实验法:让学生动手实践,求解实际问题,培养学生的实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:为学生提供系统的知识结构,方便学生课后复习。
2.多媒体资料:通过动画、图片等形式,直观地展示拓扑排序的概念和性质,提高学生的学习兴趣。
3.实验设备:为学生提供实际操作的机会,培养学生的实际操作能力。
五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。
2.作业:布置相关的拓扑排序题目,评估学生对拓扑排序概念和求解方法的理解和应用能力。
3.考试:设计考试题目,全面考察学生对拓扑排序的定义、性质、求解方法和应用的掌握程度。
课程设计拓扑排序摘要
课程设计拓扑排序摘要一、教学目标本课程的教学目标是使学生掌握拓扑排序的基本概念和方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分: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 ABSTRACT1.1图和栈的结构定义struct SqStack////栈部分{SElemType *base;//栈底指针SElemType *top;//栈顶指针int stacksize;//栈的大小int element_count;//栈中元素个素};/////////AOE网的存储结构struct ArcNode //表结点{int lastcompletetime;//活动最晚开始时间int adjvex; //点结点位置int info; //所对应的弧的权值struct ArcNode *next;//指向下一个表结点指针};struct VNode //点结点{VertexType data; //结点标志int indegree; //该结点入度数int ve; //记录结点的最早开始时间int vl; //记录结点的最晚开始时间struct ArcNode *first_out_arc; //存储下一个出度的表结点struct ArcNode *first_in_arc;//存储下一个入度的表结点};struct ALGraph{ VNode *vertices; //结点数组int vexnum; //结点数int arcnum; //弧数int kind; //该图的类型};2系统总分析2.1关键路径概念分析2.1.1什么是关键路径关键路径法(Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。
这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样CPM就应运而生了。
对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。
拓扑排序(算法与数据结构课程设计)
拓扑排序一、问题描述在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)直到课程序列中所有元素均被遍历,则该序列是拓扑序列,否则不是拓扑序列。
拓扑排序c语言课程设计
拓扑排序c语言课程设计一、课程目标知识目标:1. 学生理解拓扑排序的概念,掌握其在图论中的应用。
2. 学生掌握使用C语言实现拓扑排序算法的基本步骤和关键代码。
3. 学生能够解释拓扑排序结果的意义,并分析其在实际问题中的应用。
技能目标:1. 学生能够运用C语言编写实现拓扑排序的程序,并对给定的有向无环图进行排序。
2. 学生通过实际操作,培养解决复杂问题的编程能力和逻辑思维能力。
3. 学生学会使用调试工具检测并修正程序中的错误,提高程序调试能力。
情感态度价值观目标:1. 学生在探究拓扑排序的过程中,培养对数据结构和算法的热爱,激发对计算机科学的兴趣。
2. 学生在合作交流中,培养团队协作精神和分享意识,提高沟通能力。
3. 学生通过解决实际问题,体会编程的魅力,增强自信心和自主学习能力。
课程性质:本课程为计算机科学与技术学科的课程设计,旨在让学生掌握拓扑排序的原理和C语言实现方法。
学生特点:学生已具备C语言基础,具有一定的编程能力和逻辑思维能力,对图论相关概念有一定了解。
教学要求:教师需引导学生通过实例分析,动手实践,掌握拓扑排序的编程方法,并在实际应用中提高解决问题的能力。
教学过程中注重培养学生的团队合作意识和自主学习能力。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。
二、教学内容1. 图的基本概念复习:回顾图的定义、有向图和无向图、顶点和边、邻接矩阵和邻接表等基础知识。
教材章节:第二章 图的基本概念2. 拓扑排序的概念与性质:介绍拓扑排序的定义、特点和应用场景,讨论拓扑排序与有向无环图的关系。
教材章节:第五章 图的算法应用3. 拓扑排序算法原理:讲解拓扑排序的算法思想、关键步骤以及时间复杂度分析。
教材章节:第五章 图的算法应用4. C语言实现拓扑排序:详细讲解如何使用C语言实现拓扑排序,包括数据结构设计、函数定义和逻辑实现。
教材章节:实验指导书第四章 图的算法实现5. 拓扑排序实例分析:通过具体实例,分析拓扑排序在实际问题中的应用,如任务调度、项目规划等。
数据结构-拓扑排序介绍
成绩14信计 2015-2016(一)数据结构课程设计设计题目拓扑排序设计时间——学生姓名冯佳君学生学号20140401105所在班级14信计 1指导教师刘风华徐州工程学院数学与物理科学学院一、需求剖析1.问题描绘本次课程设计题目是:用毗邻表结构图而后进行拓扑排序,输出拓扑排序序列。
拓扑排序的基本思想为:1)从有向图中选一个无前驱的极点输出;2)将此极点和以它为起点的弧删除;3)重复 1) 、 2) 直到不存在无前驱的极点;4)若此时输出的极点数小于有向图中的极点数,则说明有向图中存在回路,不然输出的极点的次序即为一个拓扑序列。
2.拓扑排序有向图拓朴排序算法的基本步骤以下:1 )从图中选择一个入度为0 的极点,输出该极点;2 )从图中删除该极点及其有关系的弧,调整被删弧的弧头结点的入度(入度-1 );3)重复履行 1)、 2)直到全部极点均被输出,拓朴排序达成或许图中再也没有入度为 0 的极点(此种状况说明原有向图含有环)。
3.基本要求(1)输入的形式和输入值的范围;第一是输入要排序的极点数和弧数,都为整型,中间用分开符分开;再输入各极点的值,为正型,中间用分开符分开;而后输入各条弧的两个极点值,先输入弧头,再输入弧尾,中间用分开符分开,输入的值只好是开始输入的极点值不然系统会提示输入的值的极点值不正确,请从头输入,只需持续输入正确的值就行。
(2)输出的形式;第一输出成立的毗邻表,而后是最后各极点的出度数,再是拓扑排序的序列,而且每输出一个极点,就会输出一次各极点的入度数。
(3)程序所能达到的功能;因为该程序是求拓扑排序,所以算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用极点表示活动,有向边就表示活动间先后次序,那么输出的拓扑序列就表示各极点间的关系为反应出各点的储存结构,以毗邻表储存并输出各极点的入度。
二、纲要设计1.算法顶用到的全部各样数据种类的定义在该程序顶用毗邻表作为图的储存结构。
拓扑排序课程设计
长沙理工大学《数据结构》课程设计报告赵思雨学院计算机与通信工程专业网络工程班级网络1101班学号************ 学生姓名赵思雨指导教师乐晓波课程成绩完成日期2013年7月12日课程设计任务书计算机与通信工程学院网络工程专业课程名称数据结构课程设计时间2012-2013学年第2学期19周--20周学生姓名赵思雨指导老师乐晓波题目拓扑排序算法的研究与实现主要内容:研究图的存储结构,研究AOV网(活动在顶点的网,有向网)的存储结构与输入算法,并研究拓扑排序算法的实现方法,在此基础上对该算法进行分析。
要求:(1)研究AOV网(活动在顶点的网,有向网)的存储结构与输入算法,并研究拓扑排序算法的实现方法。
(2)通过对拓扑排序问题的分析、设计、编码、测试等工作,掌握针对实际应用问题设计数据结构,结合C语言解决实际应用问题的一般方法和过程,初步掌握利用数据结构解决实际应用问题的一般方法。
(3)对所设计的算法要求进行认真的分析、测试与调试,所提交的相关程序要能正确运行。
(4)按要求认真撰写课程设计报告书。
应当提交的文件:(1)课程设计报告书打印稿一份。
(2)课程设计相关电子文档一套(含任务书、报告书、可正确执行的程序等)。
课程设计成绩评定学院计算机与通信工程专业网络工程班级网络11-01 学号201158080110学生姓名赵思雨指导教师乐晓波完成日期2013年7月12日指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量指导教师对课程设计的评定意见综合成绩指导教师签字年月日拓扑排序算法的研究与实现学生姓名:赵思雨指导老师:乐晓波摘要该课程设计研究AOV网。
研究图的存储结构,研究AOV网(活动在顶点的网,有向网)的存储结构与输入算法,并研究拓扑排序算法的实现方法,在此基础上对该算法进行分析。
数据结构拓扑排序课程设计
数据结构拓扑排序课程设计正文: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)测试用例见严蔚敏《数据结构习题集(C语言版)》p48题7.9图要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下容:1. 问题描述简述题目要解决的问题是什么。
2. 设计存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计;3. 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4. 经验和体会(包括对算法改进的设想)5. 附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。
说明:1. 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0分记。
时间安排:1.第17周完成,验收时间由指导教师指定2.验收地点:实验中心3.验收容:可执行程序与源代码、课程设计报告书。
指导教师签名:2013年6月14日系主任(或责任教师)签名:年月日拓扑排序目录1问题描述2具体设计2.1存储结构设计2.2主要算法设计2.2.1拓扑排序的算法总体设计2.2.2将有向图表示为邻接表2.2.3拓扑排序函数的设计2.2.4顺序表的运算设计2.3测试用例设计3调试报告3.1设计和编码的分析3.2调试过程问题及解决4经验与体会5用户使用说明6参考文献7附录源代码与运行结果1问题描述题目:拓扑排序如果用有向图表示一个工程,在这种有向图中,用顶点表示活动,用有向边<vi,vj>表示活动vi必须先于活动vj进行,这种有向图叫做顶点表示活动的网络,记作AOV 网络。
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得AOV网络中的所有应存在前驱和后继的关系都能得到满足,这种构造AOV网络全部顶点的拓扑有序序列的运算叫做拓扑排序。
数据结构,拓扑排序和关键路径ppt课件
拓扑排序算法
算法TopoOrder( ) /* 图的拓扑排序算法,n表示顶点数 */ T1[初始化] for( i = 1 ; i<= n ; i ++ ) count[i] = 0; for( i = 1 ; i<= n ; i ++ ) for( p = Head[i].adjacent ; p ; p = p->link ) count[ p->VerAdj ] ++; for( i = 1 ; i<= n ; i ++ ) if( count[i] == 0 ) count[i] = top , top = i ;
算法分析
定理5.2 设G=(V, E)是有向无环图,V(G)={1, 2 ,…, n}, e=|E(G)|. 则算法TopoOrder是正确 的且算法的时间复杂性为 O(n+e). 正确性证明:
初始化T1时,栈不为空 T2时,如果G不空,栈也不空。输出n个顶点结束
设<v,w>是边,则 v 一定 排在 w 之前。
算法设计
AOV网用邻接表的形式存储; 数组count[ ],count[i]的值是顶点i的入度; 使用一个数据结构,存放入度为0的点。
线性表 存放时发生在一端;取用顺序无所谓,在同一端 (栈)或另一端(队列)。
栈的模拟
利用变量top和count数组元素的值来模拟堆 栈的压入和弹出。 原理:利用入度为0的count[i]空间记录栈元 素的下标;top始终记录栈顶元素的下标。
1
3 4 6
2
count
数据结构课程设计环拓扑排序和纸牌游戏 (1)
目录课题一 joseph环 41.1 问题的提出1.1.问题的提出41.2 概要设计2.1算法思想51.3流程图根据算法思想,画程序流程图如下:661.4 源代码1.3.详细设计 7 输入m 、nm>0且n>0的整数建立含n 个结点的链表且用head 指向第一个元素,结点数据域包含password 、No 、以及指向下一结点的指head=>pn ≥2(m%n)==0?n:m%n=>1=>i i<mp →next=>pi++输出p →Nop →password=>m删除p 所指向结点n--输出p →No结束开始1.5 结果与分析.4 测试及性能分析10课题二拓扑排序 112.1 问题的提出2.1 问题的提出112. 2 概要设计112.3 流程图2.根据算法思想,画流程图如下:1212 开始设辅助数组indegree 记录图的各顶点的入度值,并将indegree 数组各变量赋初值。
输入图的顶点数、边数建立一个栈,存储图的顶点的序号用邻接表法建图,并计算出indegree 数组中各变量值根据indegree 数组将入度为0的顶点入栈count 对输出顶点计数0=>count栈不空删除栈顶元素,赋给i count++将与第i 个顶点链接的各顶点入度减1输出第i 个顶点值 顶点入度为0 顶点序号入栈count<G.vexnum输出“拓扑排序成功” 输出“拓扑排序不成功” 结束2.4 源代码132.5 结果与分析2.4 测试及性能分析17课题三纸牌游戏 193.1 问题的提出.1 问题的提出193. 2 概要设计191.当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几个。
举例说明一下,比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。
数据结构拓扑排序课程设计
课题二拓扑排序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)。
第七章--拓扑排序
3 拓扑排序的定义
拓扑排序
拓扑排序就是将AOV网中的所有顶点排列成一个线性序 列,并且满足条件:在AOV网中,如果从顶点vi到顶点vj存在 一条路径,则在该线性序列中,顶点vi一定出现在vj之前。拓 扑排
在有向图中选一个没有前驱(入度为0)的顶点,并且输出之。 从图中删除该顶点和所有以它为尾的弧。
《数据结构》 课程
拓扑排序
主讲教师:李晓娜
目录 CONTENTS
1 问题的导入 2 AOV网的定义 3 拓扑排序的定义 4 拓扑排序的过程
1 问题的导入
例如:我们非常想学习一门计算机 操作系统的课程,但是在修这门 课程之前,我们必须学习一些基 础课,比如程序设计基础、数据 结构、离散数学等等。那么学生 应按怎样的顺序学习这些课程, 才能无矛盾、顺利地完成呢?
课程编号 C1
课程 名称
高等数学
C2
程序设计基础
C3
离散数学
C4
数据结构
C5
算法语言
C6
编译技术
C7
操作系统
C8
普通物理
C9
计算机原理
先修 课程
无
无
C1,C2 C2,C3
C2 C4,C5 C4,C9
C1 C8
1 问题的导入
如何安排学习 计划?
C2
C5
C4 C3
C6
01 AOV网
C1
C8
C7
建立描述课程之间优先关系的有向无环图
重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止 (此时图中存在环)
V1
V5
拓扑序列:
v0, V1, V2, V3, V4, V5, V6,
拓扑排序教学内容课件
data
count firstarc
13
25
30
2
1
6^
42
5 -1
63
拓扑排序算法--2
2. 所有邻接点入度-1处理过程
if (h[k].count==0)
{ printf(“%d”,h[k].data); wp=h[k].firstarc; //指向第一个邻接点
while (wp!=NULL) //单链表未结束 { h[wp->data].count--; //相应结点入度-1
AOV 图的拓扑序列,就是满足图中结点之间 次序制约关系的结点序列。
拓扑排序的控制思想
有向无环图,至少存在一个以上入度为0的结点, 该类结点就是拓扑序列的起始结点,在工程上就表 示工程中第一步可做的工作。
处理一个结点的操作就是删除该结点的所有出边。 这一操作的结果可以导致,当某一结点的直接前驱 结点都处理完成,则该结点的入度就为0了。在课 程设置上表示,当某课程的所有先修课都学过了, 这门课程就可以选修(激活)了。
c
输出:a,b,c 删除结点 C 的出边
ABCD A0 1 1 0 B0001 C0001 D0 0 0 0
abcd 0111
拓扑排序过程
算法说明:
b
a
d
c
输出:a,b,c 调整邻接句矩阵
ABCD A0 1 1 0 B0001 C0001 D0 0 0 0
abcd 0111
拓扑排序过程
算法说明:
导致序列不可能满足上述原则。 一个有向无环图的拓扑序列不唯一。
AOV图
与拓扑排序有关的概念
AOV图:有向无环图的一种名称,由于这种 图往往只由活动于它们次序间的制约关系构成, 所以图又称为“活动网络”,英文表示为: Activity On Vertex AOV(活动顶点)。 通常,拓扑排序就是针对 AOV 图来考虑的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计——拓扑排序课程设计任务书学生姓名:专业班级:指导教师:工作单位:计算机科学系题目: 拓扑排序初始条件:(1)采用邻接表作为有向图的存储结构;(2)给出所有可能的拓扑序列。
(3)测试用例见严蔚敏《数据结构习题集(C语言版)》p48题7.9图要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1. 问题描述简述题目要解决的问题是什么。
2. 设计存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计;3. 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4. 经验和体会(包括对算法改进的设想)5. 附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。
说明:1. 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0分记。
时间安排:1.第17周完成,验收时间由指导教师指定2.验收地点:实验中心3.验收内容:可执行程序与源代码、课程设计报告书。
指导教师签名: 2013年6月14日系主任(或责任教师)签名:年月日拓扑排序目录1问题描述2具体设计2.1存储结构设计2.2主要算法设计2.2.1拓扑排序的算法总体设计2.2.2将有向图表示为邻接表2.2.3拓扑排序函数的设计2.2.4顺序表的运算设计2.3测试用例设计3调试报告3.1设计和编码的分析3.2调试过程问题及解决4经验与体会5用户使用说明6参考文献7附录源代码与运行结果1问题描述题目:拓扑排序如果用有向图表示一个工程,在这种有向图中,用顶点表示活动,用有向边<vi,vj>表示活动vi必须先于活动vj进行,这种有向图叫做顶点表示活动的网络,记作AOV网络。
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得AOV网络中的所有应存在前驱和后继的关系都能得到满足,这种构造AOV网络全部顶点的拓扑有序序列的运算叫做拓扑排序。
在AOV-网中,不应该出现有向环,用拓扑排序就可以判断网中是否有环,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网必定不存在环。
进行拓扑排序步骤如下:1、输入AOV网络即有向图。
令n为顶点个数。
2、从有向图上选择一个没有入度的节点并输出。
3、从网中删去该点,同时删去从该顶点发出的全部有向边。
4、重复上述2,3,直到(1)、全部顶点均已输出,拓扑有序序列形成,拓扑排序完成。
(2)、图中还有未输出的顶点,但已跳出处理循环。
这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了,这时AOV网络中必定存在有向环。
要求:(1)、采用邻接表作为有向图的存储结构;(2)、给出所有可能的拓扑序列。
2具体设计2.1存储结构设计本问题中,我将采用三种数据结构:邻接表,顺序表和数组。
<1>邻接表:邻接表是图的链式存储结构,在邻接表的存储结构中,图中的每个顶点对应一个单链表。
从拓扑排序的步骤个方法来看,在整个排序过程中需要频繁地检查顶点的前驱以及作删除顶点和边的操作、恢复顶点和顶点前驱入度的操作。
所以,可以采用邻接表作为有向无环图的存储结构。
为了快速的判断顶点是否有前驱,可以在表头结点中增加一个“入度域(into)”用来指示顶点当前的入度。
当into域的值为0时,表明该顶点没有前驱,可以加入到结果序列中。
而删除顶点及以它为起点的边操作时,可以通过把该顶点的所有邻接点的入度域减一来完成,恢复则入度域加一。
邻接表的定义如下:typedef struct ARCNODE{ //表结点int adjvex; //邻接点的位置ARCNODE *nextarc;//指向下一个结点}ARCNODE; //邻接表中的结点类型typedef struct VEXNODE{ //头结点int vexdata; //顶点信息int into; //每个顶点的入度ARCNODE *firstarc; //指向第一个邻接结点}VEXNODE,AdjList[MAX];//邻接表的表头结点类型typedef struct{AdjList vexs; //表头结点数组int vexnum,arcnum;//顶点数、边数}ALGraph; //邻接表类型<2>顺序表:在整个拓扑排序的过程中,把满足条件(在此轮中未访问过visited[i]=0以及入度为0)的顶点加入到顺序表的末尾,使last加1。
当一轮排序结束后,输出顺序表中的排序。
接着,是恢复部分,每恢复一步,都要把visit[i]置0并且相应的入度加1,把这个顶点从顺序表中删除,重新加入到图中,进行下一轮的拓扑排序。
邻接表的顺序表定义如下:typedef struct {VEXNODE data[MAX];int last;}Sequenlist; //顺序表类型<2>数组:产生所有的拓扑排序是一个递归(回溯)过程。
其中,定义的visited[MAX]数组是一个辅助变量,数组元素的初值为0,当第i个顶点被访问后,便置visited[i]为1.记录该顶点是否被访问过。
Visited[MAX];2.2主要算法设计2.2.1拓扑排序的算法总体设计因为这个课程设计题目是让AOV网络产生所有的拓扑排序,所以我想必然要用到递归或者回溯的思想。
考虑到要不断的对数据进行删除,恢复,所以考虑了顺序表,单链表,堆栈,发现用顺序表删除和插入都很简单,好实施,只要在表尾插入或是删除即可。
在整个过程中主要用到三部分:一、从图中删除,添加到顺序表中;二、递归;三、把删除的顶点和边恢复到图中并从顺序表中删除。
首先,在整个图中搜索即没有被访问过而且入度为0 的顶点Vi,进行拓扑排序。
在拓扑排序的函数里,首先将这个顶点加入到顺序表中,然后将这个顶点标志为被访问过,即Visited[i]=1。
把以这个顶点为起点的邻接点的入度均减1.然后,判断顺序表的表长是否等于图的顶点数。
如果不相等的话,则继续判断图中是否还存在满足拓扑排序条件的顶点,若存在就再次调用拓扑排序函数。
接下来,就是使刚排序过的顶点Vi的标志恢复到原始状态0,每个以Vi为起点的邻接点的入度加1,恢复到原来的状态。
把顶点Vi从顺序表中删除。
如果,顺序表的表长等于图的顶点数,那么就输出这一种拓扑排序序列。
计数器count加1之后,就是采用递归,不断的调用拓扑排序函数,不断的恢复、删除,直到排出所有的拓扑序列。
最后,如果count大于0的话,那么就输出有count种拓扑排序。
否则,输出此图不是AOV网,无拓扑排序序列产生。
2.2.2将有向图表示为邻接表在产生拓扑排序的算法设计中,首先要将有向图用邻接表表示,主要流程如下:2.2.3拓扑排序函数的设计2.2.4顺序表的运算设计2.3测试用例设计1 Array图2图3图43调试报告3.1设计和编码的分析1、邻接表实现拓扑序列shixian()在本函数里,首先定义一个顺序表,然后把它置空。
接着,以邻接表创建一个图,并且把它赋给图G。
接着,把全局变量数组visited[]初始化。
对于整个图中,没被访问过的而且入度为0的顶点进行拓扑排序。
如果常量count等于0的话,说明图有回路,不能拓扑排序。
否则,在拓扑排序函数中会输出所有的拓扑排序序列。
void shixian(){Sequenlist A,*L=&A;L=(Sequenlist *)malloc(sizeof(Sequenlist));Setnull(L);ALGraph G;G=creatGraph();for(int n=1;n<=G.vexnum;n++){visited[n]=0;}int i;cout<<"该图的所有拓扑排序为:"<<endl;for(i=1;i<=G.vexnum;i++)topusort(L,G,i);if(count<=0)cout<<"您输入的图不是有向无环图,故无拓扑排序序列产生."<<endl;else{ cout<<"此图有"<<count<<"种拓扑排序\n\n";count=0;}}2、邻接表的主要算法拓扑排序topusort()void topusort(Sequenlist *L,ALGraph G,int i){int j,k;SqLinsert(L,G.vexs[i]); //把顶点Vi加入到顺序表中P=G.vexs[i].firstarc;visited[i]=1; //把排序过的点标记while(P!=NULL){j=P->adjvex;G.vexs[j].into--; //把以Vi为头的终止结点入度减1P=P->nextarc;}for(k=1;k<=G.vexnum;k++)if((visited[k]==0)&&(G.vexs[k].into==0))// 如果Vk在此轮中未被访问过且入度为0 topusort(L,G,k);if(L->last==G.vexnum) //判断顺序表中一种拓扑排序完成{output(L);cout<<endl;count++;}visited[i]=0; //使Vi恢复为未访问{j=P->adjvex;G.vexs[j].into++; //使Vj的入度恢复P=P->nextarc;}SqLdelete(L,G.vexs[i]);}3、顺序表函数在这个设计中,只有顺序表的简单应用,置空,插入,删除和输出。
插入和删除都只是在表尾插入和删除。
即只要把表长加1或是减1.Sequenlist *Setnull(Sequenlist *L)//顺序表置空{L->last=0;return(L);}void SqLinsert(Sequenlist *L,VEXNODE x)//在顺序表尾插入新接点{L->last=L->last+1;L->data[L->last]=x;}void SqLdelete(Sequenlist *L,VEXNODE x)//删除顺序表中的最后一个节点{L->last=L->last-1;}int count=0;void output(Sequenlist *L) //输出顺序表中的元素{int i;for(i=1;i<=L->last;i++){cout<<"V"<<L->data[i].vexdata<<"----->";else cout<<"V"<<L->data[i].vexdata;}cout<<endl<<endl;}3.2调试过程问题及解决在调试的过程中出现了很多语法错误,如:开始没有申明iostream头文件,导致所有的<<,>>输入输出流都是错误的,还有error C2562: 'main' : 'void' function returning avalue,发现main函数被我定义为了void返回类型,可是我在函数语句里又使用了return0;把main函数的返回值改成int即可,还有其他的语法错误都根据提示一一改进了。