`
Touch_2011
  • 浏览: 290466 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

拓扑排序(C语言实现)

阅读更多

对这个有向图进行拓扑排序

/*
 * 拓扑排序(采用邻接矩阵存储)
 */
#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
0
0
分享到:
评论

相关推荐

    c语言实现图的拓扑排序

    通过上述C语言实现,我们可以对任何有向无环图进行拓扑排序。这个过程涉及到图的遍历、队列的操作以及邻接表的管理,是数据结构和算法学习中的经典问题。掌握这种方法不仅可以加深对图的理解,也有助于提升编程解决...

    拓扑 排序 C语言 算法

    拓扑排序是图论中的一个重要概念,...以上就是拓扑排序的基本概念和C语言实现的概述。理解并掌握拓扑排序对于提升编程能力、解决实际问题具有重要意义。通过实际编写和运行代码,你可以更深入地理解和应用这一算法。

    拓扑排序C语言代码实现C代码

    拓扑排序,拓扑排序C语言代码,文档内包含完整的实现C代码

    C语言实现拓扑排序 数据结构

    总之,C语言实现拓扑排序涉及到对图的表示、入度计算、遍历和队列操作等多个数据结构和算法知识点。通过理解这些概念并熟练运用,可以有效地解决实际问题,例如编译器依赖分析、任务调度等场景。在编写代码时,注意...

    c语言拓扑排序算法

    根据提供的文件信息,我们可以推断出这是关于C语言实现拓扑排序算法的代码片段。由于提供的代码不完整且包含了一些非标准字符,我们将基于这部分内容提取关键知识点,并结合拓扑排序的基本概念进行详细阐述。 ### ...

    拓扑排序(C语言原代码)

    在给定的 C 语言代码中,拓扑排序的实现是基于“入度”进行的,即先处理入度为 0 的顶点。 首先,我们分析程序的结构: 1. 定义了三个结构体:`Edgenode` 表示边,包含顶点位置和指向下一个边的指针;`Vertexnode`...

    使用c语言写的拓扑排序

    拓扑排序是图论中的一个重要概念,主要用于有向无环图(DAG,Directed Acyclic ...通过阅读源代码和实验报告,你可以更好地理解拓扑排序的原理及其C语言实现细节,同时也能提升自己在C语言编程和图论算法方面的技能。

    拓扑排序关键路径算法C语言完整代码

    在计算机科学中,拓扑排序和关键路径算法是两种重要的图论概念,广泛应用于项目管理、任务调度等领域。本文将详细介绍这两个概念,并提供一个用C语言实现的完整代码示例。 **拓扑排序(Topological Sorting)** 拓扑...

    AOV网与拓扑排序

    ### AOV网与拓扑排序:深入理解与C语言实现 #### AOV网(Activity On Vertex Network) AOV网络,即活动在顶点上的网络,是一种有向无环图(Directed Acyclic Graph, DAG),主要用于表示项目管理中的任务依赖关系...

    c语言拓扑排序(课表)

    在C语言中实现拓扑排序,通常涉及以下关键部分: - **数据结构**:定义节点(课程)结构,可能包含课程名、入度等信息。 - **输入处理**:读取课程间的依赖关系,更新邻接表或邻接矩阵。 - **排序算法**:实现拓扑...

    数据结构课程设计 图的遍历和拓扑排序

    2. **拓扑排序的BFS实现**:使用队列进行层次遍历,从没有入边的顶点开始,将它们添加到结果序列,然后移除这些顶点,处理它们的邻接点,重复这个过程,直到所有顶点都被处理。 在实际编程实现中,如"图的遍历和...

    在C语言下用邻接表实现拓扑排序

    在C语言下利用C语言创建AOE网,并进行拓扑排序。功能模块包含图的创建,图的输出及拓扑排序。

    利用循环队列实现AOV 网的拓扑排序

    在AOV网中实现拓扑排序通常需要完成以下步骤: 1. 利用邻接表作为AOV网的存储结构。 2. 设置一个包含n(AOV网中的顶点个数)个元素的一维数组,用来保存AOV网中每个顶点的入度值。 3. 设置一个中间存储机构——链栈...

    基于C语言的拓扑排序实现.docx

    基于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)。同时,为了跟踪已访问的节点,可能还需要一个数组来保存每个节点的状态。 在实际应用中,拓扑排序不仅可以应用于课程安排,...

    数据结构之AOV网的拓扑排序算法

    在这个C语言实现的AOV网拓扑排序算法中,我们可能会使用以下步骤: 1. **初始化**:创建一个空的顶点队列和一个表示已访问顶点的标志数组。同时,构建邻接表表示图,这可以通过动态分配内存并逐个添加边来实现。 2...

Global site tag (gtag.js) - Google Analytics