c
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的序号
struct ArcNode *nextarc; // 指向下一条边的指针
int weight; // 边的权值
} ArcNode; // 弧边的节点结构
typedef struct {
int data; // 顶点信息
int inDegree; // 顶点的入度
ArcNode *firstarc; // 指向第一条依附该点的边的指针
} AdjList[5]; // 定点的节点结构
typedef struct {
AdjList adjList; //
int vexnum, arcnum; // 图当前的顶点数和边数
} Graph;//图的结构定义
/**
* 拓扑排序 A0V网
* AOV(有向图):用顶点表示活动,用弧边表示优先关系;图中没有环
* 算法步骤:
* 1.栈初始化,累加器count初始化
* 2.扫描顶点表,将没有入度的顶点加入栈中
* 3.当栈非空时,循环
* 3.1.退出栈顶元素,累加器+1
* 3.2.将退出的栈顶元素的各个邻接点的入度-1
* 3.3.将退出后的度为0的顶点,加入栈中
* 可以用于判断图中有没有环
* 即 count ?= g->vexnum
* @param g
*/
void TopoSort(Graph *g){
// 栈初始化,累加器count初始化
int count = 0;
Stack *stack = NULL;
stack = initStack(stack);
//扫描顶点表,将没有入度的顶点加入栈中
for (int i = 0; i < g->vexnum; ++i) {
if(g->adjList[i].inDegree == 0){
enStack(stack, g->adjList[i].data);
}
}
ArcNode *arc = NULL;
printf("拓扑排序:");
//当栈非空时,循环
while (!isEmptyStack(stack)){
// 退出栈顶元素,累加器+1
int vex = deStack(stack);
count++;
printf("%2d", g->adjList[vex].data);
//将退出的栈顶元素的各个邻接点的入度-1
arc = g->adjList[vex].firstarc;
while (arc){
g->adjList[arc->adjvex].inDegree -= 1;
//将退出后的度为0的顶点,加入栈中
if(g->adjList[arc->adjvex].inDegree == 0){
enStack(stack, g->adjList[arc->adjvex].data);
}
arc = arc->nextarc;
}
}
if(count < g->vexnum){
printf("\n图中存在环");
}else{
printf("\n不存在环");
}
}