拓扑排序方法如下:
1.从有向图中选择一个没有前驱(即入度为0)的结点并输出它。
2.从图中删去该结点,并删去从该结点出发的所有边。
3.重复(1)、(2),直到当前有向图中不存在没有前驱结点的结点为止,或者当前有向图中的所有结点均已输出为止。
Status TopoLogicalSort(ALGraph G)
{
//创建一个栈
int i;
Initstack(s);
//将入度为0的结点进栈
for (i = 0;i < G.vexnum;++i)
if (indegree[i])
push(s, i);
//统计输出结点数
count = 0;
//将栈顶结点弹出并打印,同时count加一
while (!stackempty(s))
{
pop(s, i);
printf(G.vertices[i].data);
++count;
//依次遍历栈中结点
for (p = G.vertices[i];p;p = p->next)
{
//k为当前结点的邻接结点
k = p->adjvex;
//当前结点的邻接结点入度减一,判断是否为0,为0则压入栈中
if (--indegree[k])
push(s, k);
}
}
//当count小于结点数即从栈中弹出的结点小于原结点数,代表有环,返回error,否则返回ok
if (count < G.vexnum)
return error;
else
return ok;
}