c语言数据结构-图的操作

这篇具有很好参考价值的文章主要介绍了c语言数据结构-图的操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)图子系统c语言代码,数据结构与算法,数据结构,c语言,图论 

目录

图的概念(http://t.csdn.cn/CH4Bv) 

图的顺序存储结构 

数组(邻接矩阵)表示法

定义 

无向图

有向图 

网的邻接矩阵表示法

图的链式存储结构 

邻接表表示法 

定义: 

无向图; 

有向图: 

小结: 


图的概念(http://t.csdn.cn/CH4Bv) 

图的顺序存储结构 

数组(邻接矩阵)表示法

定义 

                                   图子系统c语言代码,数据结构与算法,数据结构,c语言,图论 

建立一个顶点表和一个邻接矩阵(表示各个顶点之间关系)。
设图A=(V,E)有n个顶点,则图的邻接矩阵是一个二维数组A.Edge[n][n],

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

/** 图的类型枚举 */
typedef enum {
    DG,     //有向图   0
    UDG,    //无向图   1
    DN,     //有向网   2
    UDN     //无向网   3
}GraphKind;

/** 图的邻接矩阵存储表示 */
typedef struct {
    char* verTexs[100];                     //顶点数组
    int arcs[100][100];                     //邻接矩阵(权数组)
    int verTexCount;                        //图的顶点数
    int arcCount;                           //图的边/弧数
    GraphKind kind;                         //图的类型
}MatrixGraph;

无向图

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

 特点:
1 、无向图的邻接矩阵是 对称
2 、顶点i的度=第i行(列)中1的个数

完全图的领接矩阵中,对角元素为0,其余1

/** 使用邻接矩阵表示法创建无向图 */
int CreateUDG(MatrixGraph* G) 
{
    G->kind = UDG;      //设置当前创建图的类型为无向图
    printf("请输入无向图的顶点数:");
    scanf("%d", &G->verTexCount);
    printf("请输入边的数量:");
    scanf("%d", &G->arcCount);
    printf("依次输入顶点信息\n");
    for (int i = 0; i < G->verTexCount; i++)
    {
        G->verTexs[i] = (char *)malloc(sizeof(char) * 10);
        printf("顶点%d:", i + 1);
        scanf("%s", G->verTexs[i]);
    }
    //初始化邻接矩阵,所有边的权值设置为0
    for (int i = 0; i < G->verTexCount; i++)
    {
        for (int j = 0; j < G->verTexCount; j++)
        {
            G->arcs[i][j] = 0;
        }
    }
    printf("请输入顶点和邻接顶点信息,构建邻接矩阵\n");
    for (int i = 0; i < G->arcCount; i++)
    {
        char * vex1 = (char *)malloc(sizeof(char) * 10);
        char * vex2 = (char *)malloc(sizeof(char) * 10);
        printf("顶点:");
        scanf("%s", vex1);
        printf("邻接点:");
        scanf("%s", vex2);
        //分别获得两个顶点在顶点数组中的坐标
        int x = LocateVex(G, vex1);
        int y = LocateVex(G, vex2);
        if (x == -1 || y == -1) 
        {
            return 0;
        }
        G->arcs[x][y] = 1;
        G->arcs[y][x] = G->arcs[x][y];      //无向图的邻接矩阵是对称的

        free(vex1);
        free(vex2);
    }
    return 1;
}

有向图 

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论 图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

特点:
1 、 有向图的邻接矩阵 可能是不对称
2 、 顶点的 出度=第i行元素之和
        顶点的 入度=第i 列元素之和
        顶点的= 第i 行元素之和+ 第i列元素之和

/** 使用邻接矩阵表示法创建有向图 */
int CreateDG(MatrixGraph* G) {
    G->kind = DG;      //设置当前创建图的类型为有向图
    printf("请输入有向图的顶点数:");
    scanf("%d", &G->verTexCount);
    printf("请输入边的数量:");
    scanf("%d", &G->arcCount);
    printf("依次输入顶点信息\n");
    for (int i = 0; i < G->verTexCount; i++) {
        G->verTexs[i] = (char *)malloc(sizeof(char) * 10);
        printf("顶点%d:", i + 1);
        scanf("%s", G->verTexs[i]);
    }
    //初始化邻接矩阵,所有边的权值设置为0
    for (int i = 0; i < G->verTexCount; i++) {
        for (int j = 0; j < G->verTexCount; j++) {
            G->arcs[i][j] = 0;
        }
    }
    printf("请输入顶点和邻接顶点信息,构建邻接矩阵\n");
    for (int i = 0; i < G->arcCount; i++) {
        char * vex1 = (char *)malloc(sizeof(char) * 10);
        char * vex2 = (char *)malloc(sizeof(char) * 10);
        printf("顶点:");
        scanf("%s", vex1);
        printf("邻接点:");
        scanf("%s", vex2);
        //分别获得两个顶点在顶点数组中的坐标
        int x = LocateVex(G, vex1);
        int y = LocateVex(G, vex2);
        if (x == -1 || y == -1) {
            return 0;
        }
        G->arcs[x][y] = 1;
        //G->arcs[y][x] = G->arcs[x][y];      //有向图的邻接矩阵有可能不对称

        free(vex1);
        free(vex2);
    }
    return 1;
}

网的邻接矩阵表示法

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

图的链式存储结构 

邻接表表示法 

定义: 

指数组与链表相结合的储存方法

对每个顶点V𝑗 建立一个单链表,把与V 𝑗 有关联的边的信息链接起来,每个结点设为3个域 

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

1 、每个单链表有一个 头结点 (设为 2个域)),存V𝒋 信息
2 、每个单链表的头结点另外用顺序存储结构存储

/** 图的类型枚举 */
typedef enum
{
    DG,     //有向图   0
    UDG,    //无向图   1
    DN,     //有向网   2
    UDN     //无向网   3
}GraphKind;

/** 边/弧的结点 */
typedef struct node {
    int adjVex;                     //该边指向这条边邻接点的下标
    struct node* nextEdge;         //指向下一条边结点的指针
    struct node* nextArc;          //指向下一个弧结点的指针
    int weight;                 //权重
}EdgeNode, ArcNode;

/** 顶点结点 */
typedef struct vexNode {
    char* vex;                 //顶点值
    EdgeNode* firstEdge;           //指向第一条边的指针
    ArcNode* firstArc;             //指向第一条弧的指针
}VNode, AdjList[100];

/** 邻接表实现的图结构 */
typedef struct adjGraph {
    AdjList vexes;                  //顶点数组
    int vexCount;                   //顶点数量
    int edgeCount;                  //图的边数
    int arcCount;                   //图的弧数
    GraphKind kind;                 //图的类型
}AdjListGraph;

无向图; 

   图子系统c语言代码,数据结构与算法,数据结构,c语言,图论图子系统c语言代码,数据结构与算法,数据结构,c语言,图论

 注意:邻接表不唯一,因为各个边结点的链入顺序是任意的

TD(V𝒋 ) = 单链表中链接的结点个数 

/** 返回顶点vex在顶点数组中的下标,没有找到返回-1 */
int LocateVex_AdjList(AdjListGraph* G, char* vex) {
    int index = -1;
    for (int i = 0; i < G->vexCount; i++) {
        if (strcmp(vex, G->vexes[i].vex) == 0) {
            index = i;
            break;
        }
    }
    return index;
}

/** 采用邻接表表示法创建无向图 */
int CreateUDG_AdjList(AdjListGraph* G) {
    G->kind = UDG;
    printf("请输入顶点数量:");
    scanf("%d", &G->vexCount);
    printf("请输入边的数量:");
    scanf("%d", &G->edgeCount);
    printf("请依次输入顶点信息\n");
    for (int i = 0; i < G->vexCount; i++) {
        G->vexes[i].vex = (char*)malloc(sizeof(char) * 10);
        printf("顶点%d:", i + 1);
        scanf("%s", G->vexes[i].vex);
        //初始化邻接表,把边置空
        G->vexes[i].firstEdge = NULL;
    }
    printf("请输入顶点和邻接点信息,构建邻接表\n");
    for (int i = 0; i < G->edgeCount; i++) {
        char* vex1 = (char*)malloc(sizeof(char) * 10);
        char* vex2 = (char*)malloc(sizeof(char) * 10);
        printf("顶点:");
        scanf("%s", vex1);
        printf("邻接点:");
        scanf("%s", vex2);
        int x = LocateVex_AdjList(G, vex1);
        int y = LocateVex_AdjList(G, vex2);
        if (x == -1 || y == -1) {
            free(vex1);
            free(vex2);
            return 0;
        }
        EdgeNode* edgeNode = (EdgeNode*)malloc(sizeof(EdgeNode));
        edgeNode->adjVex = x;
        edgeNode->nextEdge = G->vexes[y].firstEdge;
        edgeNode->weight = 0;
        G->vexes[y].firstEdge = edgeNode;
        edgeNode = (EdgeNode*)malloc(sizeof(EdgeNode));
        edgeNode->adjVex = y;
        edgeNode->nextEdge = G->vexes[x].firstEdge;
        edgeNode->weight = 0;
        G->vexes[x].firstEdge = edgeNode;

        free(vex1);
        free(vex2);
    }
    return 1;
}

有向图: 

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论 

 TD(V𝒋 ) = OD(V𝒋 ) + ID(V𝒋 )

小结: 

图子系统c语言代码,数据结构与算法,数据结构,c语言,图论 文章来源地址https://www.toymoban.com/news/detail-774829.html

到了这里,关于c语言数据结构-图的操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构—图的存储结构

    回顾:数据的逻辑结构 集合——数据元素间除 “同属于一个集合” 外,无其他关系。 线性结构——一个对一个,如线性表、栈、队列 树形结构——一个对多个,如树 图形结构——多个对多个,如图 6.1图的定义和术语 无向图 :每条边都是 无 方向的; 有向图 :每条边都是

    2024年02月14日
    浏览(37)
  • 16-数据结构-图的存储结构

    简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向图。无向图为对称矩阵,因为没有方向可言,出度入

    2024年02月09日
    浏览(38)
  • 数据结构——图的基本定义以及图的存储结构,邻接矩阵,邻接表

    目录 图的定义和术语 图的存储结构 顺序存储结构—邻接矩阵 链式存储结构 邻接表 邻接多重表 十字链表 图的遍历 图的连通性问题 有向无环图及其应用 最短路径 图的定义:图是一种非线性的复杂的数据结构,图中的数据元素的关系是多对多的关系 ,在图中我们常常把数

    2024年02月04日
    浏览(58)
  • 数据结构--5.0.1图的存储结构

    目录 一、邻接矩阵(无向图)  二、邻接矩阵(有向图) 三、邻接矩阵(网) 四、邻接表(无向图) 五、邻接表(有向图)   ——图的存储结构相比较线性表与树来说就复杂很多 ——对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放。         树结构

    2024年02月10日
    浏览(46)
  • 【数据结构(28)】6.4 图的存储结构

    由于图的结构比较复杂,任意连个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即 图没有顺序存储结构 ,但是可以借助二维数组来表示元素之间的关系,即 邻接矩阵表示法 。 另一方面,由于图的任意两个顶点减都可能存在

    2024年02月03日
    浏览(43)
  • 数据结构 | 图的遍历

    使用邻接矩阵法存储图的信息,其中 一维矩阵 Vexs[] 存储节点信息 二维矩阵 Edges[][] 存储边的信息 一维矩阵 visited[] 记录当前节点是否被访问过,用于后面的遍历 本文所使用的图的结构如下: 对应的 Vexs[] 为:A,B,C,D,E,F(对应的数组下标从0到5) 对应的 Edges[][] 如下: 图的

    2024年02月04日
    浏览(41)
  • 24考研数据结构-图的存储结构邻接矩阵

    【1】顶点的结点结构 ——————— | data | firstarc | ——————— data数据域:储存顶点vi firstarc链域:指向链表中第一个结点 【2】弧的结点结构 —————————— | adjvex | info | nextarc | —————————— adjvex邻接点域:与顶点vi邻接的点在图中的位置 info数据域

    2024年02月14日
    浏览(57)
  • 数据结构:图的基本概念

    图是一种非线性的数据结构,表示多对多的关系。 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 在图中需要注意的是: 线性表和树可以看做特殊的图。 线性表中我们把数据

    2023年04月12日
    浏览(45)
  • 【数据结构】图的定义、存储

    对王道数据结构选择题做错和不清楚的题的简单纠错 一个有n个顶点和n条边的无向图一定是 有环的 一个无向图有n个顶点和n-1条边,可以使它连通单没有环,若再加一条边,则会形成环 若图中顶点数为n,则它的生成树有n-1条边,去掉一条边变成非连通图;加上一条边变成一

    2024年02月08日
    浏览(55)
  • 【数据结构】——图的相关习题

    1、具有n个顶点的有向完全图有()条弧边。 A、n(n-1)/2 B、n(n-1) C、n(n+1)/2 D、n(n+1) 解析: (B) 若一个有向图中,若每个顶点都有互相相反的两条弧连接,则称为有向完全图,在一个含有n个顶点的有向完全图中,共有 n(n-1) 条弧。 例如,含有4个顶点的有向完全图

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包