typedef struct EdgeNode //边表结点
{
int adjvex;//邻接点
int weight;//权值
struct EdgeNode *next;//下一个结点
};
typedef struct VertexNode //顶点表结点
{
int in;//顶点入度
int data;//顶点存储的信息
EdgeNode *firstedge;//边表的头指针
}VertexNode,AdjList[MAXVEX];
typedef struct
{
AdjList adjlist;
int numVertexes, numEdges;
}graphAdjList,*GraphAdjList;
int 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)//如果该顶点的入度为0,就将这个顶点入栈
stack[++top] = i;
}
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就入栈,方便下次用来循环输出
}
}
if (count < GL->numVertexes)//如果count小于顶点数,说明存在环
return ERROR;
else
return OK;
}