概念:从图的某一顶点出发访问图中的其余顶点,且使每个顶点只被访问一次
1、深度优先遍历(DFS)
typedef int Boolean;//布尔类型,值是TRUE或FALSE
Boolean visited[MAX];
//邻接矩阵的DFS递归算法
void DFS(MGraph, int i)
{
int j;
visited[i] = TRUE;//该顶点标记为已被访问
printf("%c", G.vexs[i]);
for (j = 0; j < G.numVertexes; j++)
if (G.arc[i][j] == 1 && !visited[j])
//有这个顶点,且顶点未被访问
DFS(G, j);//对这个顶点递归
}
//邻接矩阵的DFS操作
void DFSTraverse(MGraph G)
{
int i;
for (i = 0; i < G.numVertexes; i++)
visited[i] = FALSE;//所以顶点初始化为未访问
for (i = 0; i < G.numVertexes; i++)
if (!visited[i])
DFS(G, i);
}
typedef int Boolean;//布尔类型,值是TRUE或FALSE
Boolean visited[MAX];
//邻接表的DFS递归算法
void DFS(GraphAdjList GL, int i)
{
EdgeNode* p;
visited[i] = TRUE;
printf("%c",GL->adjList[i].data);
p = GL->adjList[i].firstedge;
while (p)
{
if (!visited[p->adjvex])
DFS(GL, p->adjvex);
p = p->next;//下一个结点
}
}
//邻接表的DFS操作
void DFSTraverse(GraphAdjList)
{
int i;
for (i = 0; i < GL->numVertexes; i++)
visited[i] = FALSE;
for (i = 0; i < GL->numVertexes; i++)
if (!visited[i])
DFS(GL, i);
}
2、广度优先遍历(BFS)
//邻接矩阵的BFS算法
void BFSTraverse(MGraph.G)
{
int i, j;
Queue Q;
for (i = 0; i < G.numVertexes; i++)
visited[i] = FALSE;
InitQueue(&Q);//初始化一个队列
for (i = 0; i < G.numVertexes; i++)
{
if (!visited[i])
{
visited[i] = TRUE;
printf("c", G.vexs[i]);
EnQueue(&Q, i);//将该顶点入队
while (!QueueEmpty(Q))//如果当前队列不为空
{
DeQueue(&Q, &i);//出队,把值赋给i
for (j = 0; j < G.numVertexes; j++)
{
if(G.arc[i][j] == 1 && !visited[j])
{
//与当前顶点(i)相连且未被访问的顶点
visited[j] = TRUE;
printf("%c", G.vexs[j]);
EnQueue(&Q, j);//入队
}
}
}
}
}
}
//邻接表的BFS算法
void BFSTraverse(GraphAdjList GL)
{
int i;
EdgeNode* p;
Queue Q;
for (i = 0; i < GL->numVertexes; i++)
visited[i] = FALSE;
InitQueue(&Q);
for (i = 0; i < GL->numVertexes; i++)
{
if (!visited[i])
{
visited[i] = TRUE;
printf("c", GL->adjList[i].data);
EnQueue(&Q, i);
while (!QueueEmpty(Q))
{
DeQueue(&Q, &i);
p = GL->adjList[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
{
//未被访问的顶点
visited[p->adjvex] = TRUE;
printf("%c", GL->adjList[p->adjvex].data);
EnQueue(&Q, p->adjvex);//入队
}
p = p->next;
}
}
}
}
}