- #define MAXVEX 100
- typedef struct EdgeNode{//边表结点结构
- int adjvex;//存储该结点在数组中的下标
- int weight;//存储权值,可不用
- struct EdgeNode *next;//指向下一个邻接点
- }EdgeNode;
- typedef struct VertexNode{
- int in;//顶点入度
- int data;//存储顶点信息
- EdgeNode *firstedge;//边表头结点
- }VertexNode;
- typedef struct{
- VertexNode adjList[MAXVEX];//
- int numVertexes,numEdges;//图中当前顶点数和边数
- }*GraphAdjList,graphAdjList;
- bool TopoLogicalSort(GraphAdjList GL){
- EdgeNode *e;//用来遍历边表
- int i,k,gettop;
- int top = -1;//栈顶指针
- 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!=-1){//栈不为空就继续循环
- gettop = stack[top--];//出栈
- printf("%d->",GL->adjList[gettop].data);//打印
- count++;//计数增加
- for(e=GL->adjList[gettop].firstedge;e;e=e->next){//对出栈的结点的边表进行遍历
- k = e->adjvex;//k为出栈结点的邻接点在数组中的下标
- if(!(--GL->adjList[k].in)){//如果入度减1后为0
- stack[++top] = k;//该结点入栈
- }
- }
- }
- if(count<GL->numVertexes){//如果输出结点数小于总数说明有环
- return false;
- }
- else{
- return true;
- }
- }