图的存储一般用邻接矩阵或邻接表来存储
邻接矩阵
图的存储要考虑两方面的内容,①顶点的信息,②各个顶点之间的边的信息。顶点信息,我们用0 – n-1来表示各个顶点。边的信息用二维数组来表示。其中这个存储边信息的二维数组就是邻接矩阵。代码如下(C++代码):
#define MaxVertexNum 100//设置顶点最大为100个 #define maxn 1000000; int MGraph[MaxVertexNum];//邻接矩阵,用来存储图 int n;//存储有多少个顶点 int m;//有几条边
下列是创建图的代码:
void CreateMGraph( int MGraph[] ){ cin>> n >> m;//输入图的顶点数和边数 for(int i = 0;i <G->e;i++){ for(int j = 0;j < G->e;j++){ G->edges[i][j] = maxn;//初始化为无穷大,表示此路不通; } } int a,b,c; for(int i = 0;i < G->e;i++){ cin>>a>>b>>c;//表示从a到b的距离是c MGraph[a][b] = c; MGraph[b][a] = c;//有这句话创建的是无向图,两边都可以走,若是有向图,则这句话可不写 } }
邻接表
邻接表的存储是一种顺序存储和链式存储相结合的存储方式,首先用一个数组来存储顶点信息,称为邻接表的表头节点他有两类元素,代码创建如下
typedef struct node{ int vdata; struct node *next; }VertexNode; VertexNode Map[MaxVertexNum];//这就是那个邻接表的顶点信息数组
第二个就是表结点,表节点有三类元素,分别是自身data,自己是哪号结点,还有后一个节点的地址,代码如下
typedef struct vnode{ int data;//表示路径长短 int Nnode;//表示当前结点是哪个顶点 struct vnode *next; }EdgeNode;//这两个的定义其实是一样的,只不过含义不一样
下面来创建邻接表
void CreateALGraph(){ EdgeNode *s; cin>>n>>m;//输入图的顶点数和边数 int a,b,c; for(int i = 0;i < n;i++){ cin>>a;//输入每个顶点 Map[i]->vdata = a; Map[i]->next = NULL; } for(int i = 0;i < m;i++){ cin>>a>>b>>c; s = (EdgeNode *)malloc(sizeof(EdgeNode)); s->Nnode = b; s->data = c; s->next = Map[a]->next; Map[a]->next = s; } }
下一章来说图的遍历