博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图的存储结构
阅读量:4331 次
发布时间:2019-06-06

本文共 3225 字,大约阅读时间需要 10 分钟。

  • 网的邻接矩阵

    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

你可能感兴趣的文章
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
生产订单“生产线别”带入生产入库单
查看>>
crontab导致磁盘空间满问题的解决
查看>>
java基础 第十一章(多态、抽象类、接口、包装类、String)
查看>>
Hadoop 服务器配置的副本数量 管不了客户端
查看>>
欧建新之死
查看>>
自定义滚动条
查看>>
APP开发手记01(app与web的困惑)
查看>>
笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
查看>>
mysql 日期时间运算函数(转)
查看>>
初识前端作业1
查看>>
ffmpeg格式转换命令
查看>>
万方数据知识平台 TFHpple +Xpath解析
查看>>
Hive实现oracle的Minus函数
查看>>