图的定义
ADT Graph{
数据对象 v:相同特性数据元素的集合,称为顶点集
数据关系 R:
R = { VR }
VR = {<v,w>|v,w∈V且P(v,w),<v,w>标识v到w的弧}
基本操作:
CreatGraph(&G,V,VR) //创建图
DestoryGraph(&G) //销毁图
等等……
}
-
图的分类
- 有向图、无向图
- 完全图:边的数目为最大值
- 稠密图(边数 > nlogn)、稀疏图(边数 < nlogn)
- 连通图:图中任意两点是连通的
- 强连通图:有向图中任意两点是连通的
-
权值:图的边上有一个与他相关的数
-
顶点的度:与顶点V相关联的边的数目
- 入度:以 V 为头的边的数目
- 出度:以 V 为尾的变得数目
- 握手定理:所有顶点的度数之和为 边数 的两倍
图的存储结构
-
数组表示法(邻接矩阵存储)
- 使用两个数组分别存储顶点的信息和数据元素之间的关系的信息
#define NUM 20
typedef struct ArcCell{
VRType adj; // VRType 表示顶点关系类型,对无权图,0或1
InfoType *info; //该边相关信息指针
}AdjMatrix[NUM][NUM]
typedef struct{
VertexType vexs[NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum; //顶点数和边数
}
-
邻接表
- 链式存储结构,
- 每个结点三个域组成
- 邻接点域 adjvex:该弧指向的顶点位置
- 链域 nextarc:指向下一条弧的结点
- 数据域 info:该户相关信息的指针,如权值
- 表头结点
- 数据域 data:顶点信息
- 链域 firstarc:指向链表中的第一个结点
- 每个顶点建立一个单链表
#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[MAXMAX_VERTEX_NUM];
typrdef struct{
AdjList vertices; //顶点数组
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;
-
十字链表
- 十字链表是有向图的另一种的存储结构
- 结点结构
- 弧结点
- 尾域 tailvex:指示弧尾在图中的位置
- 头域 headvex:指示弧头在图中的位置
- 链域 hlink:指向弧头相同的下一条弧
- 链域 tlink:指向弧尾相同的下一条弧
- info域 info:指向该弧的相关信息
- 顶点结点
- 数据域 data:存储顶点相关信息
- 链域 firstin:指向以该顶点弧头的第一个弧结点
- 链域 firstout:指向以该顶点弧尾的第一个弧结点
#define MAX_VERTEX_NUM 20
typedef struct ArcBox{
int tailbex,headvex; //该弧的尾和头顶点的位置
struct ArcNode *hlink,*tlink; //分别尾弧头相同和弧尾相同的链域
InfoType *info; //该弧相关信息的指针
}ArcBox;
typedef struct VexNode{
VertexType data; //顶点信息
ArcNode *firstin,*firstout; //指向第一条入弧和出弧
}VexNode;
typrdef struct{
VexNode xlist[MAX_VERTEX_NUM] //表头向量
int vexnum,arcnum; //图的当前顶点数和弧数
}OLGraph;
-
邻接多重表
- 邻接多重表是无向图的另一种链式存储结构
- 每一条边用一个结点表示:
- 标志域 mark:标记是否被遍历
- 该边的两个顶点在如中位置 ivex,jvex
- ilink、jlink :指向下一条依赖该顶点的边
- info:指向和边相关的各种信息
- 每个顶点也使用一个结点表示:
- data:存储与该结点相关的信息
- firstedge:指向第一条依附该顶点的边
#define MAX_VERTEX_NUM 20
typedef enum{unvisited,visited} VisitIf;
typedef struct EBox{
VisitIf mark; //访问标记
int ivex,jvex; //该边依附的两个顶点位置
struct EBox *ilink,*jlink; //分别指向下一依附这两个顶点的边
InfoType *info; //该边的信息指针
}EBox;
typedef struct VexBox{
VertexType data; //顶点信息
ArcNode *firstedge; //指向第一条边
}VexBox;
typrdef struct{
VexBox adjmulistlist[MAX_VERTEX_NUM] //表头向量
int vexnum,edgenum; //图的当前顶点数和弧数
}AMLGraph;