对这个有向图进行拓扑排序
/*
* 拓扑排序(采用邻接矩阵存储)
*/
#include<stdio.h>
#define MAX_VERTEX_NUM 20
//图的定义
typedef struct
{
int vertexNum;
char vertex[MAX_VERTEX_NUM];
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
}Graph,*PGraph;
//构造有向图
void createdGraph(PGraph g)
{
int i,j;
g->vertexNum=6;
for(i=0;i<g->vertexNum;i++)
g->vertex[i]='A'+i;
for(i=0;i<g->vertexNum;i++)
for(j=0;j<g->vertexNum;j++)
g->arc[i][j]=0;
g->arc[0][1]=1;
g->arc[0][2]=1;
g->arc[0][3]=1;
g->arc[1][4]=1;
g->arc[2][1]=1;
g->arc[2][4]=1;
g->arc[4][3]=1;
g->arc[4][5]=1;
}
//拓扑排序
void TopologicalSort(PGraph g)
{
int i,j,k=0,m;
char vertex[MAX_VERTEX_NUM];
while(k < g->vertexNum){
//1.找没有入度的顶点,存入数组vertex中
for(i=0;i<g->vertexNum;i++){
for(j=0;j<g->vertexNum;j++){
if(g->arc[j][i]!=0)
break;
}
if(j==g->vertexNum){
//检查g->vertex[i]是否已经遍历
for(m=0;m<k;m++)
if(vertex[m]==g->vertex[i])
break;
if(m==k){
vertex[k++]=g->vertex[i];
break;
}
}
}
//2.没有入度为0的顶点
if(i==g->vertexNum){
printf("存在回路!\n");
return ;
}
//3.删除这个顶点的出度
for(j=0;j<g->vertexNum;j++)
g->arc[i][j]=0;
}
//输出排序后的结果
printf("拓扑排序结果:\n");
for(i=0;i<k;i++)
printf("%-3c",vertex[i]);
printf("\n");
}
void main()
{
Graph graph;
createdGraph(&graph);
TopologicalSort(&graph);
}
- 大小: 23.6 KB
分享到:
相关推荐
通过上述C语言实现,我们可以对任何有向无环图进行拓扑排序。这个过程涉及到图的遍历、队列的操作以及邻接表的管理,是数据结构和算法学习中的经典问题。掌握这种方法不仅可以加深对图的理解,也有助于提升编程解决...
拓扑排序是图论中的一个重要概念,...以上就是拓扑排序的基本概念和C语言实现的概述。理解并掌握拓扑排序对于提升编程能力、解决实际问题具有重要意义。通过实际编写和运行代码,你可以更深入地理解和应用这一算法。
拓扑排序,拓扑排序C语言代码,文档内包含完整的实现C代码
总之,C语言实现拓扑排序涉及到对图的表示、入度计算、遍历和队列操作等多个数据结构和算法知识点。通过理解这些概念并熟练运用,可以有效地解决实际问题,例如编译器依赖分析、任务调度等场景。在编写代码时,注意...
根据提供的文件信息,我们可以推断出这是关于C语言实现拓扑排序算法的代码片段。由于提供的代码不完整且包含了一些非标准字符,我们将基于这部分内容提取关键知识点,并结合拓扑排序的基本概念进行详细阐述。 ### ...
在给定的 C 语言代码中,拓扑排序的实现是基于“入度”进行的,即先处理入度为 0 的顶点。 首先,我们分析程序的结构: 1. 定义了三个结构体:`Edgenode` 表示边,包含顶点位置和指向下一个边的指针;`Vertexnode`...
拓扑排序是图论中的一个重要概念,主要用于有向无环图(DAG,Directed Acyclic ...通过阅读源代码和实验报告,你可以更好地理解拓扑排序的原理及其C语言实现细节,同时也能提升自己在C语言编程和图论算法方面的技能。
在计算机科学中,拓扑排序和关键路径算法是两种重要的图论概念,广泛应用于项目管理、任务调度等领域。本文将详细介绍这两个概念,并提供一个用C语言实现的完整代码示例。 **拓扑排序(Topological Sorting)** 拓扑...
### AOV网与拓扑排序:深入理解与C语言实现 #### AOV网(Activity On Vertex Network) AOV网络,即活动在顶点上的网络,是一种有向无环图(Directed Acyclic Graph, DAG),主要用于表示项目管理中的任务依赖关系...
在C语言中实现拓扑排序,通常涉及以下关键部分: - **数据结构**:定义节点(课程)结构,可能包含课程名、入度等信息。 - **输入处理**:读取课程间的依赖关系,更新邻接表或邻接矩阵。 - **排序算法**:实现拓扑...
2. **拓扑排序的BFS实现**:使用队列进行层次遍历,从没有入边的顶点开始,将它们添加到结果序列,然后移除这些顶点,处理它们的邻接点,重复这个过程,直到所有顶点都被处理。 在实际编程实现中,如"图的遍历和...
在C语言下利用C语言创建AOE网,并进行拓扑排序。功能模块包含图的创建,图的输出及拓扑排序。
在AOV网中实现拓扑排序通常需要完成以下步骤: 1. 利用邻接表作为AOV网的存储结构。 2. 设置一个包含n(AOV网中的顶点个数)个元素的一维数组,用来保存AOV网中每个顶点的入度值。 3. 设置一个中间存储机构——链栈...
基于C语言的拓扑排序实现.docx
/*----------------输出拓扑排序-------------*/ int topsort(linkmap *map) { int k=0,i,j,v,tag[100];//tag用来标记是否已访问到 int queue[100];//用队列存储 int front=0,real=0; edgenode *p; for(i=0;i...
1. **深度优先搜索(DFS)**或**广度优先搜索(BFS)**:这两种算法都可以用于实现拓扑排序。DFS通常会产生一个深浅不一的排序,而BFS则会得到一个较为均匀的排序结果。在排课场景中,BFS可能更为合适,因为它可以...
在C语言实现中,可能涉及的数据结构包括链表(表示图的边)和栈或队列(用于DFS或BFS)。同时,为了跟踪已访问的节点,可能还需要一个数组来保存每个节点的状态。 在实际应用中,拓扑排序不仅可以应用于课程安排,...
在这个C语言实现的AOV网拓扑排序算法中,我们可能会使用以下步骤: 1. **初始化**:创建一个空的顶点队列和一个表示已访问顶点的标志数组。同时,构建邻接表表示图,这可以通过动态分配内存并逐个添加边来实现。 2...