• 图的存储结构之邻接表


    邻接表由一个一维数组(顶点表)和一个单链表(边表)组成。

    顶点表由数据域和指针域组成,数据域存储顶点信息,指针域指向第一个邻接点。

    边表由adjvex和next两个域组成,若需要权值信息可增加weight域,adjvex存储某顶点的邻接点在顶点表中的下表,next则存储指向边表中下一个结点的指针。

    基本如下图所示:

    代码(来源于《大话数据结构》):

    AdjLinkGraph.h

    #pragma once
    
    #define MAXVEX 20
    
    typedef char VertexType;  //顶点类型应由用户定义
    typedef int EdgeType;     //边上的权值类型应由用户定义
    
    typedef struct EdgeNode  //边表结点
    {
        int adjvex;          //邻接点域,存储该顶点对应的下标
        EdgeType weight;     //用于存储权值,对于非网图可以不需要
        struct EdgeNode *next; //链域,指向下一个邻接点
    }EdgeNode;
    
    typedef struct VertexNode //顶点表结点
    {
        VertexType data;    //顶点域
        EdgeNode *firstedge; //边表头指针
    }VertextNode, AdjList[MAXVEX];
    
    typedef struct
    {
        AdjList adjList;
        int numVertexes, numEdges; //图中当前顶点数和边数
    }GraphAdjList;
    
    
    void CreateALGraph(GraphAdjList *G);

    AdjLinkGraph.cpp

    #include "stdafx.h"
    #include "adjLinkGraph.h"
    #include <cstdlib>
    
    void CreateALGraph(GraphAdjList *G)
    {
        int i, j, k;
        EdgeNode *e;
        printf("输入顶点数和边数:
    ");
        scanf_s("%d,%d", &G->numVertexes, &G->numEdges);
    
        for (i = 0; i < G->numVertexes; i++)
        {
            printf("输入顶点数据:
    ");
            scanf_s("%d", &G->adjList[i].data);
            G->adjList[i].firstedge = NULL;
        }
    
        for (k = 0; k < G->numEdges; k++)
        {
            printf("输入边(vi,vj)上的顶点序号:
    ");
            scanf_s("%d,%d", &i, &j);
    
            e = (EdgeNode *)malloc(sizeof(EdgeNode));
            e->adjvex = j;
            e->next = G->adjList[i].firstedge;
            G->adjList[i].firstedge = e; //不断更新firstedge,用e->next链接更新过的firstedge
    
            e = (EdgeNode *)malloc(sizeof(EdgeNode));
            e->adjvex = i;
            e->next = G->adjList[i].firstedge;
            G->adjList[j].firstedge = e;
        }
    }

    调用:

    // AdjecentTable.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "adjLinkGraph.h"
    
    int main()
    {
        GraphAdjList G;
        CreateALGraph(&G);
        printf("邻接表创建成功!");
        return 0;
    }

     源码

  • 相关阅读:
    浅谈Android内存管理
    adb 常用命令
    ElasticSearch+Logstash+Filebeat+Kibana集群日志管理分析平台搭建
    分布式版本控制系统GIT的使用
    KVM虚拟化原理与基础应用示例
    Nginx反代Mogilefs分布式储存示例
    Redis持久化存储与复制功能简述
    Redis服务搭建与基础功能示例
    常用的NoSQL数据库类型简述
    XtraBackup的备份原理与应用示例
  • 原文地址:https://www.cnblogs.com/144823836yj/p/8984541.html
Copyright © 2020-2023  润新知