以下内容来自陈越姥姥《数据结构(第2版)》,笔记仅供自己参考。
图的抽象数据类型
- 类型名称:图(Graph)
- 数据对象集:一非空的顶点集合Vertex和一个边集合Edge,以及任一访问顶点的函数Visit()。
- 操作集:
Graph CreateGraph(int VertexNum)
:构造一个有VertexNum个顶点但是没有边的图;void InsertEdge(Graph G,Edge E)
:插入边E;void DeleteEdge(Graph G,Edge E)
:删除边E;bool IsEmpty(Graph G)
:如果图G为空,返回true;否则,返回false;void DFS(Graph G,Vertex V,(*Visit)(Vertex))
:在图G中,从顶点V出发,进行深度优先遍历;void BFS(Graph G,Vertex V,(*Visit)(Vertex))
:在图G中,从顶点V出发,进行广度优先遍历;
图的存储结构
邻接矩阵
所谓邻接矩阵(Adjacency Matrix)的存储结构,就是用矩阵表示图中各顶点之间的邻接关系和权值。
用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连,只需考察邻接矩阵对应的元素。确定一个顶点的所有邻接点,只需考察邻接矩阵对应的一行或一列。但是,要确定图中有多少条边,必须对整个邻接矩阵进行检测,时间复杂度O(N2)。
对于稠密图而言,邻接矩阵存储是一种高效的办法。
邻接矩阵法的结构和类型声明:
#define MaxVertexNum 100//最大顶点数为100
#define INFINITY 65535//65535是2字节无符号型整数的最大值
typedef int Vertex;//用顶点下标表示顶点
typedef int WeightType;//边的权值为整型
typedef char DataType;//顶点存储的数据类型设为字符型
//图结点的定义
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv;//顶点数
int Ne;//边数
WeightType G[MaxVertexNum][MaxVertexNum];//邻接矩阵
DataType Data[MaxVertexNum];//存顶点的数据
};
typedef PtrToGNode MGraph;//以邻接矩阵存储的图类型
邻接矩阵表示–无向网图的初始化程序
//边的定义
typedef struct ENode *PtrToENode;
struct ENode {
Vertex V1,V2;//有向边<V1,V2>
WeightType Weight;//权重
};
typedef PtrToENode Edge;
//初始化1个有VertexNum个顶点但是没有边的图
MGraph CreateGraph (int VertexNum)
{
Vertex V,W;
MGraph Graph;
Graph=(MGraph)malloc(sizeof(struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
//初始化邻接矩阵
for(V=0;V<Graph->Nv;V++)
for(W=0;W<Graph->Nv;W++)
Graph->G[V][W]=INFINITY;
return Graph;
}
//插入边<V1,V2>
void InsertEdge(MGraph Graph,Edge E)
{