邻接表的
void Topo(ALGraph G) //拓扑排序
{int i,j,k;
int count,top;
ArcNode *p;
printf("\nBy ToPo\n");
top=-1; //姑且当作栈的初始化吧
count=0; //打印计数
for(i=0;i<G.vexnum;i++)
{if(G.Vertice[i].indegree==0)
{G.Vertice[i].indegree=top; //indegree域中存的是栈的下一个元素的存储位置
top=i; //top用来记录栈的首元素存储的位置
}
} //让入度为0的顶点入栈
while(top!=-1) //top等于初值时表示栈空了
{j=top;
top=G.Vertice[j].indegree; //这两句是出栈的操作
printf("%d ",G.Vertice[j].data); //出栈打印节点信息
count++; //打印节点累加
for(p=G.Vertice[j].firstarc;p;p=p->next) //出栈一个将与该顶点有后继关系的的顶点的入度减1
{
k=p->adj;
if(!(--G.Vertice[k].indegree)) //此处实现减1操作,如果减1后度为零则入栈
{G.Vertice[k].indegree=top;
top=k;
}//if
}//for
}//while
if(count==G.vexnum) //判断是否有环,相等则无环,否则有环
printf("\nNO circle\n");
else
printf("\nHAVE circle\n");
}