void Top_Sort(VexNode g[], int n,VexNode *temp) //用有入度域的aov网进行拓扑排序,输出并存到数组temp中 { int i, j, k, top, m = 0; EdgeNode* p; top = -1; //链栈初始化,-1为栈尾 for(i = 0; i < n; i ++) //将入度为0的顶点链接成链栈 if (g[i].InDegree == 0) { g[i].InDegree = top; top = i; } printf("aov拓扑排序结果为:"); while (top != -1) //当链栈非空时 { j = top; //将栈顶顶点记为j top = g[top].InDegree; //栈顶指针指向弹出栈后下一个入度为0的顶点 printf("%s ", g[j].Date);//输出顶点信息 temp[m] = g[j]; //将顶点信息有序保存到数组 m++; //记录已输出的顶点个数 p = g[j].FirstEdge; while (p != NULL) //删除顶点j的所有出边 { k = p->AdjVex; g[k].InDegree--; //将顶点j的邻接边节点k入度减1 if (g[k].InDegree == 0) //若顶点k入度为零则入链栈 { g[k].InDegree = top; top = k; } p = p->Next; //查找下一个邻接边节点 } } if (m < n) printf("AOV 网有回路!!!!!"); }代码实现思路
时间: 2024-02-14 19:05:52 浏览: 54
tuopu.rar_aov 检测环_aov网 判断有环_aov网检测环_topology 判断环
这段代码实现了有入度域的AOV网的拓扑排序,并将排序结果输出和保存到数组temp中。具体实现思路如下:
1. 将所有入度为0的顶点加入到链栈中。
2. 当链栈非空时,弹出栈顶顶点j,输出该顶点的信息,并将该顶点信息保存到数组temp中。
3. 遍历顶点j的所有出边,将其邻接顶点k的入度减1。如果邻接顶点k的入度为0,则将其加入到链栈中。
4. 重复第2、3步,直到链栈为空。
5. 如果输出的顶点个数m小于图中的顶点个数n,则说明图中存在环,输出"AOV网有回路!!!!!"的提示信息。
拓扑排序的核心思想是将有向无环图(DAG)中的顶点按照一定的顺序进行排列,使得对于每一条有向边(u, v),其起点u都排在终点v的前面。对于有入度域的AOV网,入度为0的顶点是没有前驱顶点的,可以最先加入到拓扑序列中;而每次删除一个顶点时,需要将该顶点的所有出边的邻接顶点的入度减1,如果邻接顶点的入度变为0,则该顶点可以加入到拓扑序列中。
阅读全文