设图G = (V, E)
是具有n个顶点的图,顶点顺序依次为{v1,v2,v3.......}
设a[N][N]
为 n 阶方阵
G 的邻接矩阵具有此种性质:
a[i][j]=1
,则存在边(vi, vj)
或者弧
(即两点之间存在边或弧)a[i][j]=0
,则不存在边(vi, vj)
或者弧
(即两点之间不存在边或弧)特点
n(n-1)/2。
存图结构
示例
存储结构
#define INFINITY INT_MAX // 最大值∞
#define MAX_VERTEX_NUM 20 // 最大顶点个数
typedef enum {DG, DN, UDG, UDN} GraphKind; //图的类型{有向图,有向网,无向图,无向网}
typedef struct ArcCell
{ EType adj; // EType是顶点关系类型,对无权图用1或0表示相邻否; // 对带权图,则为权值类型InfoType *info;// 该弧相关信息的指针
} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct
{ VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量(一维矩阵)AdjMatrix arcs; // 邻接矩阵(二维矩阵) int vexnum, arcnum; // 图的当前顶点数和弧(边)数GraphKind kind; // 图的种类标志
} MGraph;
存图结构
将所有顶点存入一个表中,作为头结点的表
将与每个头结点有邻接关系的点作为表结点链到头结点之后
邻接表的特点
i-1
的结点个数示例
存储结构
#define MAX_VERTEX_NUM 20//表结点的结构(链表结构)
typedef struct ArcNode
{ int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 //InfoType *info; // 该弧相关信息的指针
} ArcNode;//头结点数组
typedef struct VNode
{ VertexType data; // 顶点信息ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MAX_VERTEX_NUM]; //组合成的图的结构
typedef struct
{ AdjList vertices; int vexnum, arcnum; // 图的当前顶点数和弧数 int kind; // 图的种类标志
} ALGraph;
存图结构
存储结构
#define MAX_VERTEX_NUM 20typedef struct ArcBox
{ int tailvex, headvex; // 该弧的尾和头顶点的位置 struct ArcBox *hlink, *tlink; // 分别指向下一个弧头相同和弧尾相同的弧的指针域 InfoType *info; // 该弧相关信息的指针
} ArcBox;typedef struct VexNode
{ VertexType data; ArcBox *firstin, *firstout; // 分别指向该顶点第一条入弧和出弧
} VexNode; typedef struct
{ VexNode xlist[MAX_VERTEX_NUM]; // 表头向量 int vexnum, arcnum; // 有向图的当前顶点数和弧数
} OLGraph;