首页 > 其他 > 详细

图的存储结构

时间:2019-09-03 14:03:43      阅读:56      评论:0      收藏:0      [点我收藏+]
  • 网的邻接矩阵

    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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!