拓扑排序算法

对许多数据结构教材实在不满意,至少我是看不懂……

至于拓扑排序算法,教材上那些伪代码真真教人头晕。只写了几个struct结构,我根本看不出这是邻接表。

如果给出一个清晰明了的图,一切不就简单了?


总之,关键就是建立一个邻接表。然后利用这个表进行拓扑排序。




//边表结点声明
typedef struct EdgeNode
{
	int adjvex;
	struct EdgeNode *next;
}EdgeNode;

//顶点表结点声明
typedef struct VertexNode
{
	int in;             //顶点入度
	int data;
	EdgeNode *firstedge;
}VertexNode, AdjList[MAXVEX];

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

//拓扑排序算法
//若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERROR
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(0 == GL -> adjList[i].in)
		{
			stack[++top] = i;   //将度为0的顶点下标入栈
		}
	}
	
	while (0 != top)
	{
		gettop = stack[top--];   //出栈
		printf("%d ->", GL -> adjList[gettop].data);
		count ++;
		
		for(e = GL -> adjList[gettop].firstedge; e; e = e->next)
		{
			k = e -> adjvex;
			//注意:下边这个if条件是分析整个程序的要点!
			//将k号顶点邻接点的入度-1,因为他的前驱已经消除
			//接着判断-1后入度是否为0,如果为0则也入栈
			if(!(--GL->adjList[k].in))
			{
				stack[++top] = k;
			}
		}
	}
	
	if(count < GL -> numVertexes)       //如果count小于顶点数,说明存在环
	{
		return ERROR;
	}
	else
	{
		return OK;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值