(1)DFS
图采用邻接表的结构,头文件algraph.h如下:
#define MAX_VERTEX_NUM 20
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef
int
InfoType;
typedef char
VertexType;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
typedef enum ...{DG, DN, UDG, UDN}
GraphKind;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
typedef struct ArcNode...
{
int adjvex;
struct ArcNode *next;
InfoType info;
}
ArcNode;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
typedef struct VNode...
{
VertexType data;
ArcNode *firstarc;
}
VNode, AdjList[MAX_VERTEX_NUM];
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
typedef struct ...
{
AdjList vertex;
int vexnum, arcnum;
GraphKind kind;
}
algraph;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
bool flag[MAX_VERTEX_NUM];
DFS的递归算法如下:
#include
"
algraph.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#include
"
stdio.h
"
#include
"
stdlib.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
createDN(algraph
&
g)
...
{}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
createUDN(algraph
&
g)
...
{}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
createUDG(algraph
&
g)
...
{}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
get the vertice name's index
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
locate(algraph g,
char
name)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i < g.vexnum; i++)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(name == g.vertex[i].data)...{
return i;
}
}
return -1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
createDG(algraph
&
g)
...
{
printf("input the number of vertex and arcs: ");
scanf("%d %d", &g.vexnum, &g.arcnum);
fflush(stdin);
int i = 0, j = 0, k = 0;
printf("input the name of vertex: ");
//init the vertex names
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(i = 0; i < g.vexnum; i++)...{
scanf("%c", &g.vertex[i].data);
fflush(stdin);
g.vertex[i].firstarc = NULL;
}
//construct the graph's adjacent link list
char v1, v2;
int w;
ArcNode *p;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
printf("input the %d arcs v1 v2 and weight: ", g.arcnum);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(k = 0; k < g.arcnum; k++)...{
scanf("%c %c %d", &v1, &v2, &w);
fflush(stdin);
i = locate(g, v1);
j = locate(g, v2);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//new a link node
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->info = w;
p->next = NULL;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//insert the new node to the head of list
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!g.vertex[i].firstarc)...{
g.vertex[i].firstarc = p;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else...{
p->next = g.vertex[i].firstarc;
g.vertex[i].firstarc = p;
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
print the graph
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
printGraph(algraph g)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i < g.vexnum; i++)...{
printf("the edges of vretice %c: ", g.vertex[i].data);
ArcNode *p = g.vertex[i].firstarc;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while(p)...{
printf("%c(%d) ", g.vertex[p->adjvex].data, p->info);
p = p->next;
}
printf(" ");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
createGragh(algraph
&
g)
...
{
printf("please input the type of graph: ");
scanf("%d", &g.kind);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
switch(g.kind)...{
case DG:
createDG(g);
printGraph(g);
break;
case DN:
createDN(g);
break;
case UDG:
createUDG(g);
break;
case UDN:
createUDN(g);
break;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
visit(algraph g,
int
v)
...
{
printf("%c", g.vertex[v].data);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
dfs the graph
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
dfs(algraph g,
int
i,
void
(
*
f)(algraph,
int
))
...
{
flag[i] = 1;
f(g, i);
ArcNode *p = g.vertex[i].firstarc;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while(p)...{
int adj = p->adjvex;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!flag[adj])...{
dfs(g, adj, f);
}
p = p->next;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
dfsTraval(algraph g,
void
(
*
f)(algraph,
int
))
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(int i = 0; i < g.vexnum; i++)...{
flag[i] = 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for(i = 0; i < g.vexnum; i++)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!flag[i])...{
dfs(g, i, f);
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
void
main()
...
{
algraph g;
createGragh(g);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void (* f)(algraph, int);
f = visit;
dfsTraval(g, f);
}
(2)BFS
使用队列对图节点进行遍历。
程序略。
关于图的遍历算法的复杂度:
1. 图的DFS:使用的是邻接表的结构时,算法的复杂度是O(n + e);使用的是邻接矩阵的结构时,算法的复杂度是O(n2)。
2. 遍历图的过程实质是通过边或者弧找邻接点的过程,所以BDS和DFS的算法的复杂度相同,二者的区别在于对顶点的访问顺序不同。