图的存储结构

时间:2019-09-03
本文章向大家介绍图的存储结构,主要包括图的存储结构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  • 网的邻接矩阵

    const int MAXN = 100;
    const int LIM = 0x3f3f3f3f;//无穷大
    struct MGraph
    {
      int vexs[MAXN];//顶点表
      int arc[MAXN][MAXN];//邻接矩阵
      int numEdges, numVertexes;//边,顶点的数量
    };
    
    void CreatMGraph(MGraph *G)
    {
      int i, j, k, w;
      cout << "请输入顶点和边的数量:";
      cin >> G->numVertexes >> G->numEdges;
      for (i = 0; i < G->numVertexes; i++)//建立顶点表
          cin >> G->vexs[i];
      for (i = 0; i < G->numVertexes; i++)//邻接矩阵的初始化
          for (j = 0; j < G->numVertexes; j++)
              G->arc[i][j] = LIM;
      for (k = 0; k < G->numEdges; k++)
      {
          cout << "请输入(vi-vj)的标识和权:";
          cin >> i >> j >> w;
          G->arc[i][j] = w;
          G->arc[j][i] = G->arc[i][j];
      }
    }
  • 无向图的邻接表

    const int MAXN = 10000;
    
    struct EdgeNode           //边表节点
    {
      int adjvex;//邻接点域(有向图中弧头下标)
      int Weight;//权值
      EdgeNode *next;//指向下一个边表
    };
    struct VertexNode     //顶点表节点
    {
      char data;//顶点域
      EdgeNode *firstedge;//边表头指针
    };
    
    struct GraphAdjList//图
    {
      VertexNode adjList[MAXN];//顶点表数组
      int numVertexea, numEdges;//图中顶点数和边数
    };
    
    void CreatALGraph(GraphAdjList *G)
    {
      int i, j, k;
      EdgeNode *e;
      cout << "请输入顶点数和边数" << endl;
      cin >> G->numVertexea >> G->numEdges;
      for (i = 0; i < G->numVertexea; i++)
      {
          cin >> G->adjList[i].data;//输入顶点信息
          G->adjList[i].firstedge = NULL;//边表制空
      }
      for (k = 0; k < G->numEdges; k++)//头插法
      {
          cout << "输入边(vi,vj)上的顶点序号:" << endl;
          cin >> i >> j;
          EdgeNode *e = new EdgeNode;
          e->adjvex = j;
          e->next = G->adjList[i].firstedge;
          G->adjList[i].firstedge = e;
          e = new EdgeNode;
          e->adjvex = i;
          e->next = G->adjList[j].firstedge;
          G->adjList[j].firstedge = e;
      }
    }
  • 有向图的十字链表

    struct EdgeNode//边表
    {
      int headVex, tailVex;//弧的起点和终点在顶点表中的下标
      EdgeNode *hLink, *tLink;//指向终点,起点相同的下一条边
    };
    
    struct VexNode//顶点节点
    {
      int data;//顶点数据
      EdgeNode *firstin;//指向第一个入度边表
      EdgeNode *firstout;//指向第一个出度边表
    };
    
    struct Graph
    {
      VexNode List[100];//定点表的建立
      int vexnum, edgenum;//顶点和边的数量
    };
    
    void creat(Graph *G)
    {
      cout << "请输入顶点和边的数量:";
      cin >> G->vexnum >> G->edgenum;
      for (int i = 0; i < G->vexnum; i++)
      {
          cout << "输入顶点:";
          cin >> G->List[i].data;
          G->List[i].firstin = G->List[i].firstout = NULL;//指针初始化
      }
      for (int i = 0; i < G->edgenum; i++)
      {
          int x,y;
          cout << "读入(vi-vj):";
          cin >> x >> y;//头尾的下标,若x,y不是对应的下标则需要自己写一个查找函数找到下标
          EdgeNode *p = new EdgeNode;
          p->tailVex = x;//头插法
          p->headVex = y;
          p->hLink = G->List[y].firstin;
          p->tLink = G->List[x].firstout;
          G->List[i].firstin = p;
          G->List[i].firstout = p;
      }
    }
  • 无向图的邻接多重表

    struct EdgeNode//顶点表节点
    {
      int ivex, jvex;//两个顶点的下标
      EdgeNode *iLink, *jLink;//指向依附于ivex和jvex的下一条边
    };
    
    struct VexNode//边表
    {
      int data;
      EdgeNode *firstedge;//指向改顶点的第一个边节点
    };
    
    struct Graph//总图
    {
      VexNode list[100];//顶点表
      int vexnum, edgenum;
    };
    
    void creat(Graph *G)
    {
      cout << "请输入顶点和边数:";
      cin >> G->vexnum >> G->edgenum;
      for (int i = 0; i < G->vexnum; i++)//顶点表初始化
      {
          cin >> G->list[i].data;
          G->list[i].firstedge = NULL;
      }
      for (int i = 0; i < G->edgenum; i++)
      {
          int a, b;
          EdgeNode *p = new EdgeNode;
          cout << "请输入(vi-vj)的i,j下标";
          cin >> a >> b;
          p->ivex = a;
          p->jvex = b;
          p->iLink = G->list[a].firstedge;
          p->jLink = G->list[b].firstedge;
          G->list[a].firstedge = p;
          G->list[b].firstedge = p;
      }
    }

原文地址:https://www.cnblogs.com/JMWan233/p/11452228.html