图的存储结构
一、图的邻接矩阵表示
1. 图的邻接矩阵存储类型
1)基本思想:
-一维数组vexs[ ]:存储图中顶点信息;
-二维数组arcs[ ][ ]:存储图中各顶点间关系(1,有关系;0,没关系);
-整型变量vexNum:存储顶点数;
-整形变量arcNum:存储边(弧)数。
2)图的邻接矩阵定义:
#include <stdio.h>
#define MAXSIZE 20 //图中顶点的最大数目
#define INFINITY 9999 //表示无穷大
typedef struct {
VertexType vexs[MAXSIZE]; //存储顶点信息(VertexType为顶点的数据类型)
int arcs[MAXSIZE][MAXSIZE]; //存储顶点的关系
int arcNum, vexNum; //存储顶点数、弧数
}MGraph; //定义图的类型
2. 图的邻接矩阵生成算法
图的邻接矩阵生成算法主要步骤:
(1)输入图的顶点个数和边的个数;
(2)输入顶点信息存储在一维数组vexs[ ]中;
(3)初始化邻接矩阵(对角线为0,其余为 ∞ );
(4)依次输入每条边存储在arcs中。
void creatGraph(MGraph &G) {
int i, j, from, to;
for(i=0; i<MAXSIZE; i++) { //初始化邻接矩阵
for(j=0; j<MAXSIZE; j++) {
if(i == j) {
G.arcs[i][j] = 0;
continue;
}
G.arcs[i][j] = INFINITY;
}
}
printf("Please input verNum & arcNum\n"); //输入图的顶点个数和边的个数
scanf("%d%d", &G.vexNum, &G.arcNum);
printf("Please input vertices' name\n"); //输入顶点信息
getchar();
for(i=0; i<G.vexNum; i++) {
scanf("%c", &G.vexs[i]);
}
printf("Please input edge\n");
for(i=0; i<G.arcNum; i++) {
scanf("%d%d", &from, &to); //生成带权图:scanf("%d%d%d", &from, &to, &weight);
G.arcs[from][to] = 1; //生成带权图:G.arcs[from][to] = weight;
//生成无向图:G.arcs[to][from] = 1;
}
}
测试函数:
int main() {
MGraph graph;
creatGraph(graph);
int visited[graph.vexNum];
int i;
for(i=0; i<graph.vexNum; i++) {
visited[i] = 0;
}
DFS(graph, 0, visited);
}
二、图的邻接表表示
1. 图的邻接表存储类型
1)基本思想:
-对图中每一个顶点建立一个与该顶点有邻接关系的顶点的单链表;
-用一个一维结构体数组存储顶点和各顶点单链表的头指针;
-用整型变量存储顶点数和边数。
下图为示例
2)图的邻接矩阵定义:
#include <stdio.h>
#define MAXSIZE 20 //图的最大顶点数
//(1)邻接表的边结点类型
typedef struct arcnode {
int adjvex; //弧所指向的顶点的位置
struct arcnode *next; //指向下一条弧的指针
[WeightType info;] //用于存放边上信息,视实际情况而定
}ArcNode;
//(2)邻接表的表头结点类型
typedef struct {
VertexType vertex; //结点信息
ArcNode *firstArc;
}VertexNode;
//(3)图的邻接表类型
typedef struct {
VertexNode adjList[MAXSIZE];
int arcNum, verNum;
}ALGraph;
2. 图的邻接表生成算法
图的邻接表生成算法主要步骤:
(1)输入图的顶点个数和边的个数;
(2)输入顶点信息;
(3)依次输入每条边信息,并插入到边表中。
void buildALGraph(ALGraph &G) {
int i, j;
ArcNode *p;
printf("Please input verNum & arcNum\n");
scanf("%d%d", &G.verNum, &G.arcNum);
//input vertex data
printf("Please input vertices' name\n");
getchar();
for(int i=0; i<G.arcNum; i++) {
scanf("%c", &G.adjList[i].vertex);
G.adjList[i].firstArc = NULL;
}
//creat arc
printf("Please input edges\n");
for(int k=0; k<G.arcNum; k++) {
scanf("%d%d",&i, &j);
p = new ArcNode;
p->adjvex = j;
p->next = G.adjList[i].firstArc;
G.adjList[i].firstArc = p;
p = new ArcNode;
p->adjvex = i;
p->next = G.adjList[j].firstArc;
G.adjList[j].firstArc = p;
}
}
测试函数:
int main() {
ALGraph graph;
buildALGraph(graph);
}