排序步骤:
1.从AOV网中选取一个没有前驱的顶点(该顶点入度为0),并输出它
2.从AOV网中删去该顶点及以它为弧尾的所有有向边
3.重复上述步骤直到剩余的网中不再存在没有前驱的顶点
结果:
一、AOV网中顶点未被全部输出,说明存在回路
二、反之,全部输出,说明不存在回路
算法
typedef stuct edge{
int adjvex; //该边终止顶点在顶点结点中的位置
int weight; //该边权值
struct edge *next;//指向下一个边结点
}Elink;
typedef struct ver{
int indegree ;//入度
vertype vertex;//顶点信息
Elink* link;//顶点结点类型定义
}OVLink;
voidTOPO_SORT(OVLink G[ ], int n, vertype V[]){
Elink*p;
int i,j,k,top=-1;
for(i=0;i<n;i++){ //堆栈初始化
if(G[i].indegree==0){//依次将入度为0的顶点压入堆栈
G[i].indegree=top;
top=i;
}
}
for(i=0;i<n;i++){
if(top==-1){
printf("\n存在回路");
break;
}
else{
j=top;
top=G[top],indegree; //退出栈顶元素
V[i]=G[j].vertex; //输出一个顶点,V存放拓扑序列
p=G[j].link;
while(p!=NULL){ //删除由该顶点引出的边
k=p->adjvex;
G[k].indegree--;//入度-1
if(G[k].indegree==0){
G[k].indegree=top;
top=k;
}
p=p->next;
}
}
}
}