#include<iostream> using namespace std; #define maxsize 50 struct node { int adjvex; node * next; }; struct graph { int vexter; int in; node * firstedge; }; typedef struct { int *base; int *top; int stacksize; }sqstack; void initstack(sqstack &S) { S.base=(int *)malloc(sizeof(int)); S.top=S.base; S.stacksize=maxsize+1; } void createadlist(graph inDegree[],int n,int e)//创建邻接链表 { int i,k,j; node * q; for(i=1;i<=n;i++) { inDegree[i].vexter=i; inDegree[i].in=0; inDegree[i].firstedge=NULL; } for(k=1;k<=e;k++) { cout<<"依次输入每一条边:/n"; cout<<"从"; cin>>i; cout<<"邻接到"; cin>>j; cout<<'/n'; inDegree[j].in++; q=(node *)malloc(sizeof(struct node)); q->adjvex=j; q->next=inDegree[i].firstedge; inDegree[i].firstedge=q; } } void TopoSort(graph inDegree[],int n) { int i,v,count=0; sqstack S; node * p; initstack(S); for(i=1;i<=n;i++) if(inDegree[i].in==0) *S.top++=i; while(S.top!=S.base) { v=*--S.top; cout<<v<<"/t"; count++; p=inDegree[v].firstedge; while(p!=NULL) { inDegree[p->adjvex].in--; if(inDegree[p->adjvex].in==0) *S.top++=p->adjvex; p=p->next; } } cout<<endl; if(count<n) cout<<"有回路"<<endl; else cout<<"无回路"<<endl; } void main() { graph inDegree[maxsize]; int v,e; cout<<"该AOV网的顶点数:"; cin>>v; cout<<"该AOV网的边条数:"; cin>>e; createadlist(inDegree,v,e); cout<<"拓扑排序序列为:"<<endl; TopoSort(inDegree,v); }