图的广度优先遍历-C语言
具体代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define INF 0
typedef struct Queue{
int data[ MAXSIZE] ;
int front;
int rear;
int size;
} Queue;
void Init ( Queue * Q) {
Q-> front= 0 ;
Q-> rear= 0 ;
Q-> size= 0 ;
}
void Push ( Queue * Q, int e) {
for ( int i= Q-> rear; i<= Q-> front; i++ ) {
if ( Q-> data[ i] == e) {
return ;
}
}
Q-> data[ Q-> front++ ] = e;
Q-> size++ ;
}
int Pop ( Queue * Q) {
Q-> size-- ;
return Q-> data[ Q-> rear++ ] ;
}
typedef struct Graph{
int Vex[ MAXSIZE] ;
int Arc[ MAXSIZE] [ MAXSIZE] ;
int arcnum, vexnum;
} Graph;
void Create ( Graph * G) {
G-> vexnum= 6 ;
for ( int i= 1 ; i<= G-> vexnum; i++ ) {
for ( int j= 1 ; j<= G-> vexnum; j++ ) {
G-> Arc[ i] [ j] = INF;
}
}
for ( int i= 1 ; i<= G-> vexnum; i++ ) {
G-> Vex[ i] = i;
}
G-> Arc[ 1 ] [ 3 ] = 7 ;
G-> Arc[ 4 ] [ 6 ] = 7 ;
G-> Arc[ 3 ] [ 4 ] = 4 ;
G-> Arc[ 2 ] [ 3 ] = 2 ;
G-> Arc[ 2 ] [ 4 ] = 9 ;
G-> Arc[ 5 ] [ 6 ] = 6 ;
for ( int i= 1 ; i<= G-> vexnum; i++ ) {
for ( int j= 1 ; j<= i; j++ ) {
G-> Arc[ i] [ j] = G-> Arc[ j] [ i] ;
}
}
}
void BFSTraverse ( Graph G) {
bool visit[ G. vexnum+ 1 ] ;
Queue Q;
Init ( & Q) ;
for ( int i= 1 ; i<= G. vexnum; i++ ) {
visit[ i] = false;
}
int index= 1 , j, k;
Push ( & Q, 1 ) ;
for ( int i= 1 ; i<= G. vexnum; i++ ) {
for ( j= 1 ; j<= G. vexnum; j++ ) {
if ( G. Arc[ index] [ j] != INF&& ! visit[ j] ) {
Push ( & Q, j) ;
k= j;
}
}
int temp= Pop ( & Q) ;
printf ( "%d " , temp) ;
visit[ temp] = true;
index= Q. data[ Q. rear] ;
}
}
int main ( ) {
Graph G;
Create ( & G) ;
BFSTraverse ( G) ;
}