图的广度优先遍历与二叉树的层序遍历思想类似,原理见代码:
void BFS(int v)
{
node_ptr w;
queue_ptr front,rear;
front = rear = NULL;
Visit(v);
visited[v] = TRUE;
addq(&front,&rear,v);
while(front)
{
v = deleteq(&front);
printf("->%d<-\n",v);
for(w=graph[v];w;w=w->link)
if(!(visited[w->vertex]))
{
Visit(w->vertex);
addq(&front,&rear,w->vertex);
visited[w->vertex] = TRUE;
}
}
}
测试程序:
#include <stdio.h>
#include <malloc.h>
#define MAX_VERTEX_NUM 50
#define FALSE 0
#define TRUE 1
typedef struct node* node_ptr;
typedef struct node
{
int vertex;
node *link;
}node;
node_ptr graph[MAX_VERTEX_NUM];
short int visited[MAX_VERTEX_NUM];
typedef struct queue *queue_ptr;
typedef struct queue
{
int vertex;
queue_ptr link;
}queue;
void addq(queue_ptr *Qhead,queue_ptr*Qrear,int v)
{
queue_ptr pt = (queue_ptr)malloc(sizeof(queue));
pt->vertex = v;
pt->link = NULL;
if(*Qhead == NULL)
{
*Qhead = *Qrear = pt;
}
else
{
(*Qrear)->link = pt;
(*Qrear) = pt;
}
}
int deleteq(queue_ptr *Qhead)
{
if(*Qhead)
{
int v = (*Qhead)->vertex;
queue_ptr pt = (*Qhead)->link;
free(*Qhead);
*Qhead = pt;
return v;
}
return -1;
}
void ResetVisited(short int visited[],int node_num)
{
for (int i=0;i<node_num;i++)
visited[i] = FALSE;
}
void BuildGraph(node_ptr *graph,int node_num)
{
// InitGraph(graph,node_num);
int v;
for(int i=0;i<node_num;i++)
{
while(1)
{
scanf("%d",&v);
if(v == -1)
{
break;
}
else
{
/*insert to head*/
node_ptr ptr = (node_ptr)malloc(sizeof(node)) ;
ptr->vertex = v - 1;
ptr->link = graph[i];
graph[i] = ptr;
}
}
}
}
void GraphShow(node_ptr *graph,int node_num)
{
for(int i=0;i<node_num;i++)
{
node_ptr tmp = graph[i];
printf("%d",i+1);
while(tmp)
{
printf("->%d",tmp->vertex+1);
tmp = tmp->link;
}
printf("->#\n");
}
}
void ClearGraph(node_ptr *graph,int node_num)
{
for(int i=0;i<node_num;i++)
{
node_ptr tmp = graph[i];
while(tmp)
{
graph[i] = tmp->link;
free(tmp);
tmp = graph[i];
}
// graph[i] = NULL;
}
}
void Visit(int v)
{
printf("Visiting Vertex : %d\n",v+1);
}
void DFS(int v)
{
node_ptr p;
visited[v] = TRUE;
Visit(v);
for(p=graph[v];p;p=p->link)
if(!(visited[p->vertex]))
DFS(p->vertex);
}
void BFS(int v)
{
node_ptr w;
queue_ptr front,rear;
front = rear = NULL;
Visit(v);
visited[v] = TRUE;
addq(&front,&rear,v);
while(front)
{
v = deleteq(&front);
//printf("->%d<-\n",v);
for(w=graph[v];w;w=w->link)
if(!(visited[w->vertex]))
{
Visit(w->vertex);
addq(&front,&rear,w->vertex);
visited[w->vertex] = TRUE;
}
}
}
int main()
{
ResetVisited(visited,5);
ClearGraph(graph,5);
BuildGraph(graph,5);
GraphShow(graph,5);
printf("DFS:\n");
DFS(3);
ResetVisited(visited,5);
printf("BFS:\n");
BFS(3);
ClearGraph(graph,5);
}
测试输入:
2 3 -1
4 1 -1
1 4 -1
2 3 5 -1
4 -1
测试输出:
1->3->2->#
2->1->4->#
3->4->1->#
4->5->3->2->#
5->4->#
DFS:
Visiting Vertex : 4
Visiting Vertex : 5
Visiting Vertex : 3
Visiting Vertex : 1
Visiting Vertex : 2
BFS:
Visiting Vertex : 4
Visiting Vertex : 5
Visiting Vertex : 3
Visiting Vertex : 2
Visiting Vertex : 1
REF:
1,数据结构(C语言版) Ellis Horowitz