图操作集的代码实现
- 图的抽象数据类型描述详见:图
用邻接矩阵表示图
-
图的描述
typedef struct GNode{ int NV;//顶点数 int NE;//边数 WeightType G[MaxVertexNum][MaxVertexNum];//类型为WeightType、大小为MaxVertexNum X MaxVertexNum的二维数组构成邻接矩阵保存边的信息 //DataType Data[MaxVertexNum];//类型为DataType、大小为MaxVertexNum的一维数组用来存储顶点的信息,视情况选取。 }GNode,*MGraph;
-
MGraph CreateGraph(int VertexNum):构造并返回一个空图
//输入一个顶点数,建立一个VertexNum个顶点、0条边的空图 MGraph CreateGraph(int VertexNum) { int row = 0, col = 0;//行和列计数的临时变量 MGraph G = NULL; //判断输入的顶点数是否大于邻接表空间 if (VertexNum > MaxVertexNum) { printf("图顶点数溢出,创建图失败"); return NULL; } //申请图空间,并将VertexNum赋给图节点中的顶点数,并将图节点中边数置0 G = (MGraph)malloc(sizeof(GNode)); G->NV = VertexNum; G->NE = 0; //将邻接表中所有元素置0 for (row = 0; row < G->NV; row++) { for (col = 0; col < G->NV; col++) { G->G[row][col] = 0; } } //将图返回 return G; }
-
void DestroyGraph(MGraph G G G):释放图 G G G占用的存储空间
//释放图空间 void DestroyGraph(MGraph G) { //将指针G指向的空间释放 free(G); }
-
Graph InsertVertex( Graph G G G):返回一个在 G G G中增加了新顶点 v v v的图
//插入顶点 MGraph InsertVertex(MGraph G) { int row = 0, col = 0; //判断图存储空间是否已经满了 if (IsFull(G)) { printf("图已满\n"); return G; } //图存储空间未满,将顶点数加1,邻接矩阵扩充,扩充的空间填充0 G->NV++; for (row = 0; row < G->NV; row++) { if (row != G->NV - 1) { G->G[row][G->NV - 1] = 0; } else { for (col = 0; col < G->NV; col++) { G->G[row][col] = 0; } } } return G; }
-
Graph InsertEdge( Graph G G G, Edge E ):返回一个在 G G G中增加了新边 ( v 1 , v 2 ) (v_1,v_2) (v1,v2)的图
//边的节点表示 typedef struct ENode { Vertex v1;//边的起点 Vertex v2;//边的终点 WeightType Weight;//边的权重 }ENode,*Edge; //插入边 MGraph InsertEdge(MGraph G, Edge E) { //边数加1 G->NE++; //邻接矩阵对应位置改成插入边的权值 G->G[E->v1][E->v2] = E->Weight; //如果是无权图,还要在对称位置再改成插入边的权值 G->G[E->v2][E->v1] = E->Weight; return G; }
-
Boolean IsEmpty(MGraph G G G):判断图是否是空图
//判空 Boolean IsEmpty(MGraph G) { return (G->NV == 0); }
-
Boolean IsFull(MGraph G G G):判断图的存储空间是否已满
//判满 Boolean IsFull(MGraph G) { return (G->NV == MaxVertexNum); }
用邻接表表示图
-
图的描述
//顶点的邻接点的信息节点 typedef struct AdjVNode { Vertex AdjV;//邻接点的下标 WeightType Weight;//顶点与该邻接点构成的边的权值 struct AdjVNode *Next;//指向下一邻接节点的指针 }AdjVNode,*AdjVNodePtr; //邻接表中每个顶点的信息节点 typedef struct VNode { AdjVNodePtr FirstEdge;//保存边的信息,指向邻接点的指针 //DataType Data;//保存顶点的信息,视情况选取 }AdjList[MaxVertexNum]; //图节点 typedef struct GNode { int NV;//顶点数 int NE;//边数 AdjList G;//邻接表 }GNode,*LGraph;
-
Graph CreateGraph(int VertexNum):构造并返回一个空图
//构造并返回一个空图 LGraph CreateGraph(int VertexNum) { int row = 0; LGraph G = NULL; //判断存储空间是否足够 if (VertexNum > MaxVertexNum) { printf("空间不足\n"); return NULL; } //为图分配空间 G = (LGraph)malloc(sizeof(GNode)); G->NV = VertexNum; G->NE = 0; //因为没有边,所以所有顶点指向邻接点的指针都为NULL for (row = 0; row < VertexNum; row++) { G->G[row].FirstEdge = NULL; } return G; }
-
void DestroyGraph(Graph G G G):释放图 G G G占用的存储空间
//释放图空间 void DestroyGraph(LGraph G) { int row = 0, col = 0; AdjVNodePtr Temp = NULL,CurrentPtr; //释放空间 for (row = 0; row < G->NV; row++) { //释放每个顶点的邻接点链表的空间 for (CurrentPtr = G->G[row].FirstEdge; CurrentPtr != NULL;) { Temp = CurrentPtr->Next; free(CurrentPtr); CurrentPtr = Temp; } } }
-
Graph InsertVertex( Graph G G G, Vertex v v v ):返回一个在 G G G中增加了新顶点 v v v的图
//插入顶点 void InsertVertex(LGraph G) { //判断存储空间是否已经满了 if (IsFull(G)) { printf("存储空间已满,插入失败\n"); return; } //存储空间未满,顶点数加1,邻接表扩充1 G->NV++; G->G[G->NV].FirstEdge = NULL; }
-
Graph InsertEdge( Graph G G G, Vertex v 1 v_1 v1, Vertex v 2 v_2 v2 ):返回一个在 G G G中增加了新边 ( v 1 , v 2 ) (v_1,v_2) (v1,v2)的图
//插入边 void InsertEdge(LGraph G, Edge E) { AdjVNodePtr NewNode = NULL; /****************************** 插入边<v1,v2> *******************************/ /*建立邻接点,并将边E的数据存入邻接点*/ NewNode = (AdjVNodePtr)mallloc(sizeof(AdjVNode)); NewNode->AdjV = E->v2; NewNode->Weight = E->Weight; /*将NewNode插入顶点v1的表头*/ NewNode->Next = G->G[E->v1].FirstEdge; G->G[E->v1].FirstEdge = NewNode; /************************** 如果是无向图,还要插入边<v2,v1> *************************/ /*建立邻接点,并将边E的数据存入邻接点*/ NewNode = (AdjVNodePtr)mallloc(sizeof(AdjVNode)); NewNode->AdjV = E->v1; NewNode->Weight = E->Weight; /*将NewNode插入顶点v1的表头*/ NewNode->Next = G->G[E->v2].FirstEdge; G->G[E->v2].FirstEdge = NewNode; }
-
Boolean IsEmpty(MGraph G G G):判断图是否是空图
//判空 Boolean IsEmpty(LGraph G) { return (G->NV == 0); }
-
Boolean IsFull(MGraph G G G):判断图的存储空间是否已满
//判满 Boolean IsFull(LGraph G) { return (G->NV == MaxVertexNum); }