邻接矩阵
#include<stdio.h>
#define MaxVertexNum 100 //顶点数目的最大值
typedef struct{
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum]; //邻接矩阵,边表 。也可以用bool型或枚举型变量表示边
int vexnum, arcnum; //图当前顶点数和边数(弧数)
}MGraph;
存储带权图(网)
#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY 最大的int值 // 宏定义常量“无穷”。
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //边的权
int vexnum, arcnum; //图的当前顶点数和弧数。
}MGraph;
邻接表
#include<stdio.h>
#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY 最大的int值 // 宏定义常量“无穷”。
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
//顶点
typedef struct VNode{
VertexType data; //顶点信息
ArcNode *first; //第一条边/弧
}VNode,AdjList[MaxVertexNum];
//用邻接表存储的图
typedef strcut{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//边/弧
typedef struct ArcNode{
int adjvex; //边/弧指向哪个结点
struct ArcNode *next; //指向下一条弧的指针
//InfoType info; //边权值
};
图的遍历
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void BFSTraverse(Graph G) //对图G进行广度优先遍历
{
for(i=0;i<G.vexnum;++i)
visited[i] = FALSE; //访问标记数组初始化
InitQueue(Q); //初始化辅助队列
for(i=0;i<G.vexnum;++i) //从0号顶点开始遍历
if(!visited[i]) //对每个连通分量调用一次BFS
BFS(G,i); //vi未访问过,从vi开始BFS
}
//广度优先遍历
void BFS(Graph G, int v)
{
visit(v); //访问初始顶点v
visited[v] = TRUE; //对v做已访问标记
Enqueue(Q,v); //顶点v入队列
while(!isEmpty(Q)){
DeQueue(Q,v);
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
//检测v所有邻接点
if(!visited[w]){ //w为v的尚未访问的邻接顶点
visit(w); //访问顶点
visited[w] = TRUE; //对w做已访问标记
EnQueue(Q,w);//顶底w入队列
}//if
} //while
}
深度优先遍历
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFSTraverse(Graph G) //对图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);
}
//深度优先遍历
void DFS(Graph G, int v)
{
visit(v); //访问初始顶点v
visited[v] = TRUE; //对v做已访问标记
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(!visited[w]){ //w为v的尚未访问的邻接顶点
DFS(G,w)
}//if
}