快速实现
如果只是为了快速的实现图这样一种关系,采用邻接矩阵直接实现会非常方便。
#include <stdio.h>
#define MAXVEX //顶点数目
int main()
{
//定义二维数组表示的图
int Graph[MAXVEX][MAXVEX];
int vex1,vex2,weight;
//初始化图
for(int i = 0;i < MAXVEX;i++)
for (int j = 0; i < MAXVEX; j++)
Graph[i][j] = 0;
//依次读入两顶点和权重信息
while(scanf("%d %d %d",&vex1,&vex2,&weight))
Graph[vex1][vex2] = weight;
return 0;
}
至此,便完成了图的快速创建。
优点:应用顺序存储的结构使得这样的图具有了随机访问的优点,可以快速判断任意顶点间是否存在关系或知道对应关系间的权值,时间复杂度O(1)。
缺点:然而这样的顺序存储的结构是有限的,如果说要扩增顶点,原数组将无法满足需要,此时需要另开辟一个大的二维数组,并将原数组中存储的权值拷贝到新数组,这样的操作时间复杂度O(n2)。另外,固定地开辟空间,可能造成未使用空间浪费。
抽象表示
实际应用中,如果需要图这样的关系结构,在方便使用的情况下可直接类似地建图。如果是要定义图这样一种抽象数据结构并封装的话,则需要如下考虑。可以分两步,一是初始化建立顶点,二是将边信息写入。
#include <stdlib.h>
#define MAXVEX //最大顶点数
//定义图类型
typedef struct {
int Numofvex;
int Numofedge;
WeightType G[MAXVEX][MAXVEX];
}GNode,* MGraph;
//定义存放边信息的Edge类型便于插入边操作
typedef struct _Edge
{
Vertex v1,v2;
WeightType weight;
}* Edge;
//创建图并初始化,建立顶点
MGraph CreateGraph(int vexnum)
{
//创建图变量,并为此类型开辟一块空间
MGraph Graph;
Graph = (MGraph) malloc (sizeof(GNode));
Graph->Numofvex = vexnum;
Graph->Numofedge = 0;
//初始化图,i,j表示顶点编号,此处从1开始
for (int i = 0; i < Graph->Numofvex; ++i)
for (int j = 0; j < Graph->Numofvex; ++j)
Graph->G[i][j] = 0;
return Graph;
}
//完善边信息
void InserEdge(MGraph Graph, Edge E)
{
//插入边信息
Graph->G[E->v1][E->v2] = E->weight;
}
总结
以上是基本的使用邻接矩阵表示图的方法,对于第二种封装的形式还可以完善补充其他的操作。
优点:随机访问,查询方便快速;
缺点:增删麻烦,空间可能浪费;