拓扑排序算法

结构定义:

typedef struct EdgeNode
{
	int adjvex;
	int weight;
	struct EdgeNode *next;
} EdgeNode;

typedef struct VertexNode
{
	int in;
	int data;
	EdgeNode *firstedge;
} VertexNode,  AdjList[MAXVEX];

typedef struct
{
	AdjList adjList;
	int numVertexes, numEdges;
} graphAdjList, *GraphAdjList; 

拓扑排序:

Status TopologicalSort(GraphAdjList GL)
{
	EdgeNode *e;               
	int i, k, gettop;          
	int top = 0;             // 用于栈指针下标
	int count = 0;           // 用于统计输出定点的个数
	int *stack;              // 建栈,存储入度为0的顶点 
	stack = (int *) malloc(GL->numVertexes * sizeof(int));
	for (i = 0; i < GL->numVertexes; i++)
		if (GL->adjList[i].in == 0) stack[++top] = i;        // 将入度为0的顶点入栈
	while (top != 0)
	{
		gettop = stack[top--];                             //  出栈
		printf("%d -> ", GL->adjList[gettop].data);         //打印顶点
		count++;                                           //统计输出顶点数
		for (e = GL->adjList[gettop].firstedge; e; e = e->next)
		{/*  对此顶点边表遍历  */
			k = e->adjvex;
			if (!(--GL->adjList[k].in))                 //将 k 号顶点邻接点的入度减1
				stack[++top] = k;                       // 若为0则入栈,以便于下次循环输出
		}//for
	}//while
	if (count < GL->numVertexes)            // 如果 count 小于顶点数,则说明存在环
		return Error;
	else
		return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值