数据结构与算法基础(王卓)(23):用邻接表表示图

顶点结点:

//顶点的结点结构
typedef struct VNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];
//例如:VNode v[MVNum] 相当于 AdjList v

我觉得也可以改成这样写(存疑):

//顶点的结点结构
struct VNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
};
typedef VNode AdjList[MVNum];
//例如:VNode v[MVNum] 相当于 AdjList v

主要的问题/歧义出在 AdjList 之上,虽然不知道我上面的写法对不对,但是可以肯定的是,对于 AdjList,我们可以这么理解:数据结构与算法基础(王卓)(23):用邻接表表示图_第1张图片

数据结构与算法基础(王卓)(23):用邻接表表示图_第2张图片

为了方便理解 AdjList ,我们看:

VNode v[MVNum] 相当于 AdjList v     

就像看:我们定义一个
int a [ 5 ] 等价于一个什么 Alist a;

实际上:
AdjList 就表示:【数组类型为VNode类型的一维数组】的一个类型

但是如何在代码里实现它这样的一个效果是一个难题,Anyway,反正就是这么一回事

TMD而且我后面看了一下,也可以不去用这个 AdjList 的程序,只要把后面的图的程序改成:

//图的定义
struct ALGraph
{
    //定义一个数组,保存图的顶点
    VNode vexs[MAXSIZE];
    //定义两个变量,保存当前图的顶点个数以及边的条数
    int vexnum, arcnum;
};

就行,这玩意并不重要,我是真nm无语...


 弧/边的结点:

//弧/边的结点结构
typedef int OtherInfo;
struct ArcNode
{
    int adjvex;  //该边所指向的(相邻)顶点的位置
    struct ArcNode* nextarc;  //指向下一条边的指针
    OtherInfo info;  //和边相关的信息
};

图的结构定义:

//图的结构定义
struct ALG
{
    AdjList vertices;  //顶点表
    int vexnum, arcnum;  //顶点数和边数
};

汇总->

前置条件:

#include
using namespace std;

typedef int Status;

#define MVNum 100  //最大顶点数
//MAX Vertex Number
typedef char VertexType;  //设顶点类型:字符型

//顶点的结点结构
typedef struct VNode
{
    VertexType data;  //顶点信息
    ArcNode* firstarc;  //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];
//例如:VNode v[MVNum] 相当于 AdjList v

//弧/边的结点结构
typedef int OtherInfo;
struct ArcNode
{
    int adjvex;  //该边所指向的(相邻)顶点的位置
    struct ArcNode* nextarc;  //指向下一条边的指针
    OtherInfo info;  //和边相关的信息
};

//图的结构定义
struct ALG
{
    AdjList vertices;  //顶点表
    int vexnum, arcnum;  //顶点数和边数
};

十字链表:(用于有向图)

数据结构与算法基础(王卓)(23):用邻接表表示图_第3张图片

数据结构与算法基础(王卓)(23):用邻接表表示图_第4张图片

数据结构与算法基础(王卓)(23):用邻接表表示图_第5张图片

 邻接多重表:(用于无向图)

你可能感兴趣的:(算法)