1、图的邻接矩阵存储结构
邻接矩阵存储非带权图
#define MaxVertexNum 100
typedef char vertexType; // 顶点的数据类型
typedef int edgeType; // 带权图边上权值的数据类型
typedef struct {
vertexType vex[MaxVertexNum]; // 顶点
edgeType edge[MaxVertexNum][MaxVertexNum]; // 边的权
int vernum,arcnum; // 图的顶点数和边数
}MGraph;
邻接矩阵存储带权图
#define MaxVertexNum 100
#defint INFINITY // 最大的int 值
typedef char vertexType; // 顶点的数据类型
typedef int edgeType; // 带权图边上权值的数据类型
typedef struct {
vertexType vex[MaxVertexNum]; // 顶点
edgeType edge[MaxVertexNum][MaxVertexNum]; // 边的权
int vernum,arcnum; // 图的顶点数和边数
}MGraph;
2、图的邻接表存储结构
// 邻接表存储
typedef ArcNode{
int adjver; // 边/弧指向哪个节点
struct ArcNode *next; // 指向下一条弧的指针
// InfoType info; // 边权值
}ArcNode;
typedef struct VNode{
VertexType data; // 顶点信息
ArcNode *first; // 第一条边 / 弧
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vernum,arcnum;
}ALGraph;
3、图的深度优先遍历
/*
FirstNeighbor(G,x) : 求图G中顶点 x 的第一个邻接点,若有则返回顶点号
,若没有则返回 -1
NextNeighbor(G,x,y): 假设图 G中顶点 y 是顶点 x 的一个邻接点,
返回除 y 之外顶点 x 的下一个邻接点的顶点号,若 y 是 x 的最后
一个邻接点,则返回 -1
*/
// 深度优先遍历
bool visited[MAX_VERTEX_NUM]; // 标记访问数组
void DFSTraverse(Graph G) {
for(v = 0; v < G.vexnum; v ++) {
visited[v] = FALSE; // 初始化已访问标记数据
}
for(v = 0; v < G.vexnum; v ++) { // 从顶点 0 开始遍历
// 有可能是无向图,所以需要遍历每一个顶点
if(!visited(v)) {
DFS(G,v);
}
}
return ;
}
void DFS(Graph G,int v) { // 从顶点 v 出发,深度优先遍历图 G
visit(v); // 访问顶点 v
visited[v] = TRUE; // 标记已访问过该顶点
for(w = FirstNeighbor(G,v);w >= 0; w = NextNeighor(G,v,w)) {
if(!visited(w)) {
DFS(G,w);
}
}
return ;
}
4、图的广度优先遍历
// 广度优先遍历
bool visited[MAX_VERTEX_NUM]; // 标记访问数组
void BFSTtraverse(Graph G) {
for(int i = 0; i < G.vexnum; i ++) {
visited[i] = FALSE; // 访问数组初始化
}
InitQueue(Q);
for(int i = 0; i < G.vexnum; i ++) {
if(!visited[i]) { // 对每个连通分量调用一次 BFS
BFS(G,i); // 对没有访问过的顶点进行BFS遍历
}
}
return ;
}
void BFS(Graph G,int v) { // 从顶点 v 出发,进行广度优先遍历
visit(v);
visited[v] = TRUE; // 标记顶点 v 已经访问过
EnQueue(Q,v); // 将顶点 v 进行入队
while(!isEmpty(Q)) {
v = DeQueue(Q,v); // 顶点 v 出队
// 检测 v 所有的邻接点
for(w = FirstNeighbor(G,v); w >= 0; w = NextNeighbor(G,v,w)) {
if(!visited(w)) {
visit(w);
visited[w] = TRUE;
EnQueue(Q,w);
}
}
}
return ;
}