数据结构(C语言版)严蔚敏---图的操作的相关代码

Posted 坚持不懈的大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏---图的操作的相关代码相关的知识,希望对你有一定的参考价值。

1. 将邻接表转换成邻接矩阵

main.cpp

void Convert(ALGraph G,MGraph &M)
    M.vexnum = G.vexnum;
    M.arcnum = G.arcnum;
    for(int i=1;i<=G.vexnum;i++)
        for(int j=1;j<=G.vexnum;j++)
            M.Edge[i][j] = 0;

    for(int i=1;i<=G.vexnum;i++)
        ArcNode *p = G.vertices[i].first->next;
        M.Vex[i] = G.vertices[i].data;
        while(p)
            M.Edge[i][p->adjvex] = 1;
            p = p->next;
        
    

// 图的邻接表转换成邻接矩阵

运行结果:

所表示的图为:

实现邻接表的参考代码在这篇博客:数据结构(C语言版)严蔚敏(线性表、队列、栈、串、树、图等数据结构参考代码,持续更新中。。。)

2. 将邻接矩阵转换成邻接表

main.cpp

void Convert2(MGraph M,ALGraph &G)
    G.arcnum = M.arcnum;
    G.vexnum = M.vexnum;
    for(int i=1;i<=M.vexnum;i++)
        G.vertices[i].data = M.Vex[i];
        G.vertices[i].first = (ArcNode*)malloc(sizeof(ArcNode));
        ArcNode *p = G.vertices[i].first,*q;
        p->next = NULL;
        for(int j=1;j<=M.vexnum;j++)
            if(M.Edge[i][j]!=0)
                q = (ArcNode*)malloc(sizeof(ArcNode));
                q->adjvex = j;
                q->next = p->next;
                p->next = q;
            
        
    

// 图的邻接矩阵转换成邻接表

运行结果:

所表示的图和1一样。

3. 求图的拓扑排序序列

int indegree[MaxVertexNum];
void  getIndegree(ALGraph G)
    for(int i=1;i<=G.vexnum;i++)
        indegree[i] = 0;
    for(int i=1;i<=G.vexnum;i++)
        ArcNode *p = G.vertices[i].first->next;
        while(p)
            indegree[p->adjvex]++;
            p = p->next;
        
    

// 邻接表求图的各顶点的入度
bool TopologicalSort(ALGraph G)
    int Gs[MaxVertexNum];
    // 用栈,这里用数组代替
    int i=0;
    for(int v=1;v<=G.vexnum;v++)
        if(indegree[v] == 0)
            Gs[i++] = v;
    // 将入度为0的顶点入栈
    int count_1 = 0;
    // 计数,记录当前已经输出的顶点数
    while(i>0)
        int v1 = Gs[--i];
        printf("%d",v1);
        count_1++;
        for(ArcNode *p = G.vertices[v1].first->next;p;p=p->next)
            if((--indegree[p->adjvex])==0)
                Gs[i++] = p->adjvex;
        
    

    if(count_1<G.vexnum) // 有向图中有回路
        return false;
    else
        return true;

// 求拓扑排序序列

运行结果:

表示的有向图为:

有向无环图(DAG)
拓扑排序:

  1. 从AOV网中选择一个没有前驱的顶点并输出;
  2. 从网中删除该顶点和所有以它为起点的有向边;
  3. 重复1,2直到当前的AOV网为空或者当前网中不存在无前驱的顶点为止。

以上是关于数据结构(C语言版)严蔚敏---图的操作的相关代码的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏---二叉树遍历操作二叉树的相关代码

数据结构(C语言版)严蔚敏---二叉树遍历操作二叉树的相关代码

数据结构(C语言版)严蔚敏--->一些操作相关数据结构的题目

数据结构(C语言版)严蔚敏--->一些操作相关数据结构的题目

7-8-无向图的关节点-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

数据结构(C语言版)严蔚敏(树的相关概念笔记)