码迷,mamicode.com
首页 > 其他好文 > 详细

无向图的邻接表创建

时间:2016-04-15 21:32:01      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

大话数据结构第一版第二次印刷中P231-P232中的无向图的邻接表创建,有一点小问题。修改了http://blog.csdn.net/jnu_simba/article/details/8866844的代码,Qt Creater测试可以运行。

 

#include<iostream>

#include<stdlib.h>

using namespace std;

#define MAXVEX 5 /* 最大顶点数,应由用户定义 */

typedef char VertexType[3]; /* 顶点类型应由用户定义,这里是V0~V3,所以应设置一个char类型的数组 */

 

typedef struct EdgeNode/* 边表结点 */

{

  int adjvex;/* 邻接点域,存储该顶点对应的下标 */

  struct EdgeNode *next; /* 链域,指向下一个邻接点 */

} EdgeNode;

 

typedef struct VextexNode/* 顶点表结点 */

{

  VertexType data;/* 顶点域,存储顶点信息 */

  EdgeNode *firstedge;/* 边表头指针 */

} VextexNode, AdjList[MAXVEX];

 

typedef struct

{

  AdjList adjList;

/*AdjList是VertexNode类的数组别名。

AdjList adjList;实例化一个数组,数组每个元素是VertexNode结构体。

AdjList adjList;等价于VertexNode adjList[MAXVEX];*/

  int numNodes, numEdges; /* 图中当前顶点数和边数 */

} GraphAdjList;

 

void CreateALGraph(GraphAdjList *Gp)

{

  int i, j, k;

  EdgeNode *pe;

  cout << "input numNodes and numEdges:" <<endl;

  cin >> Gp->numNodes >> Gp->numEdges;

 

  for (i = 0 ; i < Gp->numNodes; i++)

  {

    cout << "input VertexType data:" <<endl;

    cin >> Gp->adjList[i].data;

    Gp->adjList[i].firstedge = NULL;/* 将边表置为空表 */

  }

 

  for (k = 0; k < Gp->numEdges; k++)/* 建立边表 */

  {

    cout << "input vi and vj:" <<endl;

    cin >> i >> j;

 

    pe = (EdgeNode *)malloc(sizeof(EdgeNode));

    pe->adjvex = j;/* 邻接序号为j */

    pe->next = Gp->adjList[i].firstedge;/* 将pe的指针指向当前顶点上指向的结点 */

    Gp->adjList[i].firstedge = pe;/* 将当前顶点的指针指向pe */

 

    pe = (EdgeNode *)malloc(sizeof(EdgeNode));

    pe->adjvex = i;

    pe->next = Gp->adjList[j].firstedge;

    Gp->adjList[j].firstedge = pe;/*同上,对无序图其实可以不需要*/

  }

}

 

int main(void)

{

  GraphAdjList GL;

  CreateALGraph(&GL);

  return 0;

}

//input numNodes and numEdges:

//4 5

//input VertexType data:(分4次输入)

//V0 V1 V2 V3

//input vi and vj:(分5次输入)

//0 1

//0 2

//0 3

//1 2

//2 3

 

书中无向图如下:

技术分享

问题如下:

1、如果data信息是V0,V1,V2,V3,需要typedef char VertexType[3];

2、根据图7-4-6,V0的firstedge指向V1,V1的firstedge指向V0,V2的firstedge指向V0,V3的firstedge指向V1。但是这个代码,最终创建结果是,V0的firstedge指向V3,V1的firstedge指向V2,V2的firstedge指向V3,V3的firstedge指向V2。正好与图颠倒了,虽然代码同样能创建出一个无向图。

注意:

对于邻接表结构,一定要注意的是边表节点,并不是真正的节点,是为了寻找设计的结构。通过顶点节点的firstedge找到与它相连的第一个顶点节点,再通过它找到与该顶点相连的第二个节点,于此类推。类似于二叉树中的孩子节点表示法。

无向图的邻接表创建

标签:

原文地址:http://www.cnblogs.com/hslzju/p/5396883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!