邻接表的
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");
}