无向图的邻接表创建

大话数据结构第一版第二次印刷中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找到与它相连的第一个顶点节点,再通过它找到与该顶点相连的第二个节点,于此类推。类似于二叉树中的孩子节点表示法。

时间: 2024-08-01 11:08:56

无向图的邻接表创建的相关文章

邻接表创建无向图,广度优先搜索遍历输出

1 #include<stdio.h> 2 #include<string.h> 3 #include <iostream> 4 #include<algorithm> 5 using namespace std; 6 #define MVNum 100 7 int vis[MVNum]; 8 typedef struct ArcNode 9 { 10 int adjvex; 11 int info; 12 struct ArcNode *nextarc;

无向图的邻接表

import java.io.IOException;import java.util.Scanner; //无向图的邻接表的创建public class ListUDG { //邻接表中表对应的链表的顶点    private class ENode{        int ivex; //该边所指向的顶点的位置        ENode nextENode; //指向下一条弧的指针    }    //邻接表中表的顶点    private class VNode{        char

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &

图 - 存储结构之邻接表

对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法. 邻接表的处理方法是这样的. 1.图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 2.图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,

图的存储结构之邻接表

邻接矩阵的缺点:边数相对顶点较少的图,极大地浪费了存储空间. 把数组与链表相结合的存储方法称为邻接表.(Adjacency List) 邻接表的处理办法: 顶点用一个一维数组存储(较容易读取顶点信息),每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 每个顶点的所有邻接点构成一个线性表(用单链表存储).无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表. 图1  无向图的邻接表结构 data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结

邻接表无向图(一)之 C语言详解

本章介绍邻接表无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现.实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法

邻接表无向图(二)之 C++详解

本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"

邻接表无向图(三)之 Java详解

前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),

无向图的表示:邻接矩阵和邻接表

这里将一个无向图用邻接表和邻接矩阵表示. 输入:顶底个数n,图中的各个边(用两个顶点表示). 输出:这个无线图的邻接矩阵和邻接表,其中邻接表中的链接按元素大小升序排列. 先给出一个例子说明.假设有无向图如下,则其邻接矩阵和邻接表如提示框中所示(其实就是下面程序的输出). 下面是程序的代码: #include <stdio.h> #include <stdlib.h> //图的表示,输入节点个数和边,构造图的邻接矩阵和邻接表 //邻接表中的链表节点 struct vNode{ int