我是靠谱客的博主 独特牛排,最近开发中收集的这篇文章主要介绍数据结构(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语言版)严蔚敏---图的操作的相关代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部