图的两种存储

一·邻接矩阵:

1.含义:
- 图的邻接矩阵表示2点是否连通
- 网(带权图)的邻接矩阵表示2点间的权值

2.特点:

  • 无向图有对称性,可以只存储右上三角或者左下三角的矩阵元素
  • 无向图的di(行/列)非0元素是di个顶点的
  • 有向图的di行非0元素是di个顶点的出度行出
  • 有向图的di列非0元素是di个顶点的入度列入

3.创建代码:

邻接矩阵的定义与创建:

#include<iostream>
  using namespace std;
  #define MAXSIZE 100
  #define INF 50000
  typedef int ElemType;
  typedef struct{
      ElemType vexs[MAXSIZE];	//定点表
      int arcs[MAXSIZE][MAXSIZE];	//矩阵
      int arcnum;	//边数
      int vexnum;	//点数
  }Graph;
  
  void CreateGraph(Graph &G){
      int i,j,k,w;
      cin>>G.vexnum>>G.arcnum;
      //vexs list:
      for(i=0;i<G.vexnum;i++)
          cin>>G.vexs[i];

      //Init:
      for(i=0;i<G.vexnum;i++)
          for(j=0;j<G.vexnum;j++){
              G.arcs[i][j]=INF;
          } 
          
      //Create:
      for(k=0;k<G.arcnum;k++){
        cin>>i>>j;//图
        cin>>i>>j>>w;//网
        G.arcs[i][j]=1;G.arcs[j][i]=1;//无向图
        G.arcs[i][j]=w;G.arcs[j][i]=w;//无向网
        G.arcs[i][j]=1;//有向图
        G.arcs[i][j]=w;//有向网
      }
  }

二·邻接表:

1.结构:
头结点(顺序),表结点(链式)

2.特点:

  • 的邻接表不唯一,单链表顺序可能不同,邻接表取决于创建算法与输入顺序。
  • 无向图所需边的存储空间是有向图的2倍,邻接表相比邻接矩阵省空间。
  • 假设顶点为vi。对于无向图,顶点单链表的表结点数目就是该顶点的;对于有向图,表节点数目是vi的出度,adjvex/tarvex值为i的是vi的入度

3.创建代码:

#include<iostream>
  using namespace std;
  #define MAXSIZE 100
  //边结点
  typedef struct ArcNode{
      int adjvex;
      int w;//非网可以省略
      struct ArcNode * next;
  }ArcNode;
  //头结点/邻接表
  typedef struct VexNode{
      int data;
      ArcNode * firstarc;
  }VexNode,AdjList[MAXSIZE];
  //图结构
  typedef struct{
      AdjList L;
      int arcnum;
      int vexnum;
  }Graph;
  
  void CreateGraph(Graph &G){
      int i,j,k;
      ArcNode * e;
      cin>>G.vexnum>>G.arcnum;

      //1)顺序表部分:
      for(i=1;i<=G.vexnum;i++){
          cin>>G.L[i].data;
          G.L[i].firstarc=NULL;
      }
      
      //2)链表部分:
      for(k=0;k<G.arcnum;k++){
          cin>>i>>j;
          e = new ArcNode();
          e->adjvex = j;
          e->next = G.L[i].firstarc;//头插法
          G.L[i].firstarc = e;      //头插法
          //无向图还需要加下面的:
          e = new ArcNode();
          e->adjvex = i;
          e->next = G.L[j].firstarc;//头插法
          G.L[j].firstarc = e;      //头插法
    }
  }
  

posted @ 2019-11-24 11:15  LASER_06  阅读(24)  评论(0)    收藏  举报