基于邻接表的拓扑排序 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不存在环");
    }
}
相关推荐
此生决int7 分钟前
算法从入门到精通——前缀和
c++·算法·蓝桥杯
大大杰哥24 分钟前
leetcode hot100(4)矩阵
算法·leetcode·矩阵
小白|28 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
nebula-AI28 分钟前
人工智能导论:模型与算法(未来发展与趋势)
人工智能·神经网络·算法·机器学习·量子计算·automl·类脑计算
炽烈小老头30 分钟前
【每天学习一点算法 2026/05/21】课程表
学习·算法
luoganttcc33 分钟前
大模型是否即将到达算法极限
算法
叶小鸡1 小时前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划
LuminousCPP1 小时前
数据结构 - 线性表第三篇:基于顺序表实现 C 语言通讯录(基础功能篇)
c语言·数据结构·经验分享·笔记·算法
_日拱一卒1 小时前
LeetCode:114二叉树展开为链表
java·开发语言·算法
无小道1 小时前
Redis——哈希类型相关指令
redis·算法·哈希算法