拓扑排序课程设计报告 (2)

合集下载

拓扑排序实验报告

拓扑排序实验报告

数学与计算机学院数据结构实验报告年级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、调试过程中出现的问题以及解决策略。

拓扑排序实验报告

拓扑排序实验报告

实验题目:图的应用实验目的:(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所示。

求拓扑序列排序课程设计

求拓扑序列排序课程设计

求拓扑序列排序课程设计一、教学目标本课程的教学目标是让学生掌握拓扑序列排序的基本概念、原理和应用,培养学生运用拓扑序列排序解决问题的能力。

具体包括以下三个方面的目标: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.实验设备:计算机、网络设备。

通过以上教学资源的使用,丰富学生的学习体验,提高学生的学习效果。

五、教学评估本课程的教学评估将采取多元化、全过程的方式进行,以全面、客观、公正地评价学生的学习成果。

数据结构拓扑排序实验报告

数据结构拓扑排序实验报告

数据结构拓扑排序实验报告正文:一、实验目的本实验旨在通过实现拓扑排序算法来加深对数据结构中图的相关概念的理解,掌握拓扑排序的具体步骤与实现方法。

二、实验原理拓扑排序是一种对有向无环图进行排序的算法,它可以将有向无环图的顶点按照线性的顺序排列出来,使得对于任何一个有向边(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. 结果分析可以看出,根据有向图的依赖关系,拓扑排序算法能够将顶点按照合理的顺序进行排序。

拓扑排序的结果可以作为图中顶点的执行顺序,具有重要的应用价值。

五、实验总结通过本次实验,我们深入学习了拓扑排序算法,并成功实现了拓扑排序的过程。

拓扑排序在图论和数据结构中具有广泛的应用,对于理解和解决与图相关的问题具有重要意义。

六、附件本文档没有涉及附件内容。

七、法律名词及注释本文档没有涉及法律名词及注释。

拓扑排序课程设计报告

拓扑排序课程设计报告

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:拓扑排序算法院(系):计算机学院专业:计算机科学与技术(嵌入式系统方向)班级: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. 将图以合适的方式存储起来。

图有多种存储方式,其中最常用的存储方式有图的邻接矩阵和邻接表。

拓扑排序实验报告

拓扑排序实验报告

拓扑排序实验报告一、引言拓扑排序是一种图论中重要的算法,用于对有向无环图(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 数据流分析拓扑排序还可以应用于数据流分析的算法中。

数据流分析是指对程序中变量的使用和定义关系进行分析,以便进行性能优化或错误检测。

拓扑排序可以帮助确定变量之间的依赖关系,从而更准确地进行数据流分析。

拓扑排序实习报告

拓扑排序实习报告
return g;
}
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等第三方库来绘制图和进行图的算法分析。

拓扑排序实训报告

拓扑排序实训报告

一、实训目的通过本次拓扑排序实训,掌握拓扑排序的基本原理和算法实现方法,能够运用拓扑排序解决实际问题,提高自己在数据结构和算法方面的应用能力。

二、实训内容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. 通过本次实训,我们掌握了拓扑排序的基本原理和算法实现方法,提高了自己在数据结构和算法方面的应用能力。

拓扑排序c语言课程设计

拓扑排序c语言课程设计

拓扑排序c语言课程设计一、课程目标知识目标:1. 学生理解拓扑排序的概念,掌握其在图论中的应用。

2. 学生掌握使用C语言实现拓扑排序算法的基本步骤和关键代码。

3. 学生能够解释拓扑排序结果的意义,并分析其在实际问题中的应用。

技能目标:1. 学生能够运用C语言编写实现拓扑排序的程序,并对给定的有向无环图进行排序。

2. 学生通过实际操作,培养解决复杂问题的编程能力和逻辑思维能力。

3. 学生学会使用调试工具检测并修正程序中的错误,提高程序调试能力。

情感态度价值观目标:1. 学生在探究拓扑排序的过程中,培养对数据结构和算法的热爱,激发对计算机科学的兴趣。

2. 学生在合作交流中,培养团队协作精神和分享意识,提高沟通能力。

3. 学生通过解决实际问题,体会编程的魅力,增强自信心和自主学习能力。

课程性质:本课程为计算机科学与技术学科的课程设计,旨在让学生掌握拓扑排序的原理和C语言实现方法。

学生特点:学生已具备C语言基础,具有一定的编程能力和逻辑思维能力,对图论相关概念有一定了解。

教学要求:教师需引导学生通过实例分析,动手实践,掌握拓扑排序的编程方法,并在实际应用中提高解决问题的能力。

教学过程中注重培养学生的团队合作意识和自主学习能力。

通过本课程的学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。

二、教学内容1. 图的基本概念复习:回顾图的定义、有向图和无向图、顶点和边、邻接矩阵和邻接表等基础知识。

教材章节:第二章 图的基本概念2. 拓扑排序的概念与性质:介绍拓扑排序的定义、特点和应用场景,讨论拓扑排序与有向无环图的关系。

教材章节:第五章 图的算法应用3. 拓扑排序算法原理:讲解拓扑排序的算法思想、关键步骤以及时间复杂度分析。

教材章节:第五章 图的算法应用4. C语言实现拓扑排序:详细讲解如何使用C语言实现拓扑排序,包括数据结构设计、函数定义和逻辑实现。

教材章节:实验指导书第四章 图的算法实现5. 拓扑排序实例分析:通过具体实例,分析拓扑排序在实际问题中的应用,如任务调度、项目规划等。

数据结构拓扑排序实验报告

数据结构拓扑排序实验报告

数据结构拓扑排序实验报告数据结构拓扑排序实验报告一、引言本实验旨在通过实现拓扑排序算法,对给定的有向图进行排序操作。

拓扑排序是一种对有向图进行排序的算法,根据有向边的方向,将图中的节点排列成线性序列,并满足任意一条边的起点在序列中位于终点之前的要求。

二、实验目的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.拓扑排序:一种对有向图进行排序的算法,要求在排序结果中,任意一条边的起点在序列中位于终点之前。

拓扑排序课程设计报告

拓扑排序课程设计报告

拓扑排序课程设计报告拓扑排序⼀问题描述本次课程设计题⽬是:编写函数实现图的拓扑排序⼆概要设计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. 学生能理解拓扑排序的概念,掌握拓扑排序算法的基本原理和应用场景。

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;三.程序设计根据算法设计中给出的有关数据和算法,选定物理结构,详细设计需求分析中所要求的程序。

数据结构拓扑排序课程设计

数据结构拓扑排序课程设计

课题二拓扑排序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)。

拓扑排序课程设计报告

拓扑排序课程设计报告

拓扑排序课程设计报告拓扑排序一目的通过课程设计,加深对《程序设计语言》和《软件技术基础》课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用等;复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等),熟练掌握和巩固三种基本图形结构的逻辑结构、存储结构以及相关运算和应用。

学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。

二需求分析题目描述:判断一个有向图是否存在回路,并求出有向无环图的拓扑序列。

1、输入数据在工程文件中保存输入2个字符串数TXT文件。

第一个为图按次序排列的所有边的前顶点,第二个为相对应的第二个顶点。

2、输出数据图的定点数,边数,每个顶点的信息及入度,构造的邻接表,图的拓扑排序。

3、程序功能已将AOV网存入文件中,运行时从文件读取数据;对一个AOV网,应判断其是否是有向无环图,若是则输出其任意一个拓扑排序序列,不是则进行相关的说明;构造图的邻接表;输出所有顶点的入度。

三概要设计1、全局变量或类型说明//********结构体定义***********//typedef struct A_Node //定义表结点结构{int adjvex; //与vi相邻接的顶点编号struct A_Node *nextarc; //指向下一条弧(边)的指针} A_Node;typedef struct V_Node //定义表头结点结构{int data;A_Node *firstarc; //指向第一条弧(边)的指针} V_Node, AdjList[MAX_NUM];typedef struct //定义邻接表结构{AdjList vertices; //表头结点数组int vex_num, arc_num; //顶点和弧(边)的个数} ALGraph;typedef struct //构件栈{Elem_T *base;Elem_T *top;int stacksize;} Sq;2、模块功能1)void Init(Sq *S);功能:初始化栈。

拓扑排序算法实验报告

拓扑排序算法实验报告

一、实验目的1. 理解拓扑排序算法的基本原理和实现方法。

2. 掌握Kahn算法和DFS算法两种拓扑排序的实现过程。

3. 通过实际操作,加深对拓扑排序算法的理解和应用。

二、实验内容1. 理解拓扑排序算法的基本原理。

2. 实现Kahn算法和DFS算法进行拓扑排序。

3. 分析两种算法的优缺点及适用场景。

4. 通过实例验证拓扑排序算法的正确性和有效性。

三、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:IntelliJ IDEA四、实验原理拓扑排序是一种针对有向无环图(DAG)的线性排序方法,确保图中每条有向边的起始顶点在排序结果中位于终止顶点之前。

拓扑排序算法主要包括以下两种:1. Kahn算法:基于入度的拓扑排序算法,通过不断移除入度为0的顶点及其边来构建拓扑排序。

2. DFS算法:基于深度优先搜索的拓扑排序算法,通过递归遍历每个顶点,将顶点压入栈中,最终从栈顶弹出顶点的顺序即为拓扑排序结果。

五、实验步骤1. 创建一个有向无环图,包括顶点和边。

2. 使用Kahn算法进行拓扑排序。

a. 初始化:计算图中所有顶点的入度,并将所有入度为0的顶点添加到一个队列中。

b. 构建排序:从队列中取出一个顶点,将其添加到拓扑排序的结果中,并移除该顶点及其所有出边。

对于每个被移除的出边,如果目标顶点的入度减为0,则将该顶点添加到队列中。

c. 检测环:重复步骤b,直到队列为空。

如果排序结果中的顶点数量小于图中的顶点数量,则说明图中存在环,无法进行拓扑排序。

3. 使用DFS算法进行拓扑排序。

a. 初始化:创建一个栈用于存储结果和标记顶点未访问。

b. 对每个未访问的顶点进行DFS遍历,访问后将顶点压入栈。

c. 从栈顶弹出顶点的顺序即为拓扑排序结果。

4. 对比两种算法的执行时间,分析优缺点及适用场景。

六、实验结果与分析1. Kahn算法和DFS算法均能正确对有向无环图进行拓扑排序。

2. Kahn算法的执行时间明显优于DFS算法,特别是在顶点数量较多的情况下。

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

《软件技术》课程设计
#define M 20 #define ERROR 0 #define NUM 15 typedef int Elem_T; char number1[NUM]; char number2[NUM]; typedef struct A_Node //定义表结点结构 { int adjvex; //与vi相邻接的顶点编号 struct A_Node *nextarc; //指向下一条弧(边)的指针 } A_Node; typedef struct V_Node //定义表头结点结构 { int data; A_Node *firstarc; //指向第一条弧(边)的指针 } V_Node, AdjList[MAX_NUM]; typedef struct //定义邻接表结构 { AdjList vertices; //表头结点数组 int vex_num, arc_num; //顶点和弧(边)的个数 } ALGraph; typedef struct //构件栈 { Elem_T *base; Elem_T *top; int stacksize; } Sq; void Init(Sq *); //函数声明 int Int(Sq *, Elem_T *); void Out(Sq *, Elem_T); int Stack(Sq *); void Creat_Graph(ALGraph *); void Find_InDegree(ALGraph, int *); void T_Sort(ALGraph); int main(void) //主函数 { char num='Y'; FILE *fp; fp=fopen("num1.txt","r");//打开num1文件 if(fp!=NULL) { for(int i=1;i<=NUM;i++) { fscanf(fp,"%d",&number1[i]);//将文件的内容读入number1数组中 } fclose(fp);//关闭文件 } fp=fopen("num2.txt","r");//打开文件num2 if(fp!=NULL) { for(int i=1;i<=NUM;i++) { fscanf(fp,"%d",&number2[i]);//读取文件的内容到number2中
中南民族大学计算机科学学院 专业 :自动化 学号:10064126 姓名 :杨玉斌 4
《软件技术》课程设计
{ int m, n, i,j; A_Node *p; printf("\n***************************************************\n"); printf("********* 欢迎使用拓扑排序 ***********\n"); printf("********* 制作者:杨玉斌 ***********\n"); printf("********* 学号:10064126 ***********\n"); printf("********* 退出:(Y) ***********\n"); printf("***************************************************\n"); printf("请输入顶点数和边数:10 15"); G->vex_num=10 ;//要构建的顶点个数 G->arc_num=15;//要构建的边数 for (i = 1; i <= G->vex_num; i++) { G->vertices[i].data = i;//构建顶点 G->vertices[i].firstarc = NULL; } j=1; for (i = 1; i <= G->arc_num; i++) //输入存在边的点集合 { if(j>15) { j=1;} n=number1[j];//起点数组 m=number2[j];//终点数组 printf("\n输入存在边的两个顶点的序号:"); printf("%d ",n);//打印构建的边 printf("%d",m); j++; //scanf("%d%d", &n, &m); while (n < 0 || n > G->vex_num || m < 0 || m > G->vex_num) { printf("输入的顶点序号不正确 请重新输入:"); scanf("%d%d", &n, &m); } p = (A_Node*) malloc(sizeof (A_Node));//构建空链表 if (p == NULL) { printf("memory allocation failed,goodbey"); exit(1); } p->adjvex = m;//表头指向终点 p->nextarc = G->vertices[n].firstarc; G->vertices[n].firstarc = p; } } void Find_InDegree(ALGraph G, int indegree[])//找入度为零的节点 { int i; for (i = 1; i <= G.vex_num; i++) { indegree[i] = 0; } for (i = 1; i <= G.vex_num; i++) { while (G.vertices[i].firstarc) { indegree[G.vertices[i].firstarc->adjvex]++; G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc; } } } void T_Sort(ALGraph G) //进行拓扑排序 {
已将 AOV 网存入文件中,运行时从文件读取数据;对一个 AOV 网,应判断其是否是有 向无环图,若是则输出其任意一个拓扑排序序列,不是则进行相关的说明;构造图的邻接 表;输出所有顶点的入度。
三 概要设计
1、全局变量或类型说明
typedef struct A_Node //定义表结点结构 { int adjvex; //与vi相邻接的顶点编号 struct A_Node *nextarc; //指向下一条弧(边)的指针 } A_Node; typedef struct V_Node //定义表头结点结构 { int data; A_Node *firstarc; //指向第一条弧(边)的指针 } V_Node, AdjList[MAX_NUM]; typedef struct //定义邻接表结构 {
四 详细设计
源代码如下:
#include<STDIO.H> #include<STDLIB.H> #define MAX_NUM 20 //最大顶点个数#define M 20 #define STACK_SIZE 100 #define STACK_MENT 10 #define OK 1
中南民族大学计算机科学学院 专业 :自动化 学号:10064126 姓名 :杨玉斌 2
二 需求分析
题目描述:判断一个有向图是否存在回路,并求出有向无环图的拓扑序列。
1、输入数据
在工程文件中保存输入 2 个字符串数 TXT 文件。第一个为图按次序排列的所有边的前 顶点,第二个为相对应的第二个顶点。
2、输出数据
图的定点数,边数,每个顶点的信息及入度,构造的邻接表,图的拓扑排序。
3、程序功能
《软件技术》课程设计
拓扑排序
一 目的
通过课程设计,加深对《程序设计语言》和《软件技术基础》课程所学知识的理解, 熟练掌握和巩固 C 语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指 针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程 序结构(顺序结构、判断选择结构、循环结构);库函数应用等;复杂任务功能分解方法 (自顶向下逐步求精、模块化设计、信息隐藏等),熟练掌握和巩固三种基本图形结构的逻 辑结构、存储结构以及相关运算和应用。 学会编制结构清晰、风格良好、数据结构适当的 C 语言程序,从而具备利用计算机编 程分析解决综合性实际问题的初步能力。
中南民族大学计算机科学学院 专业 :自动化 学号:10064126 姓名 :jList vertices; //表头结点数组 int vex_num, arc_num; //顶点和弧(边)的个数 } ALGraph; typedef struct //构件栈 { Elem_T *base; Elem_T *top; int stacksize; } Sq;
2、模块功能
1) void Init(Sq *S); 功能:初始化栈。构造一个空栈 S 参数:*S 待初始化的栈 2) int Stack(Sq *S) 功能:判断空栈 参数:S 待判断的栈 返回值:栈为空返回 1;栈非空返回 0 3) Void Int(Sq *S, Elem_T e) 功能:元素入栈 参数:*S 待操作的栈;插入元素 e 为新的栈顶元素 4) void Out(Sq *S, Elem_T e); 功能:元素出栈 参数:*S 待操作的栈;若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 1;否则 返回 0 5) void Creat_Graph(ALGraph *G) 功能:建立图。函数内包含了由用户输入顶点数、弧数、顶点以及弧的操作 参数:*G 待操作的图 返回值:图建立成功返回 1;图建立失败返回 0 6) void Find_InDegree(ALGraph G, int indegree[]) 功能:求顶点的入度 参数:G 待操作的图,indegree[]储存每个顶点的入度的数组 7) void T_Sort(ALGraph G); 功能:实现拓扑排序,并在图形界面上演示排序过程 参数:G 待进行拓扑排序的图 错误判断:包含有向图是否有环的判断
相关文档
最新文档