基于邻接表的拓扑排序 A0V网

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不存在环");
    }
}
相关推荐
重生之我要进大厂7 分钟前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
KBDYD101042 分钟前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
Crossoads1 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
自身就是太阳1 小时前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯
孙小二写代码2 小时前
[leetcode刷题]面试经典150题之1合并两个有序数组(简单)
算法·leetcode·面试
little redcap2 小时前
第十九次CCF计算机软件能力认证-1246(过64%的代码-个人题解)
算法
David猪大卫2 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ2 小时前
数据结构(Day14)
linux·c语言·数据结构·算法
夏天天天天天天天#2 小时前
求Huffman树及其matlab程序详解
算法·matlab·图论
Infedium2 小时前
优数:助力更高效的边缘计算
算法·业界资讯