源码+注释 
# include  <stdio.h> # include  <malloc.h> # define  MAXSIZE  1000  # define  MAX_AMVNUMS  100  typedef  enum  { FALSE, TRUE
}  Boolean; typedef  struct  {  int  * base;  int  front;  int  rear;  
}  SqQueue; typedef  struct  {  char  verxs[ MAX_AMVNUMS] ;  int  arcs[ MAX_AMVNUMS] [ MAX_AMVNUMS] ;  int  numVertexes,  numEdges;  
}  AMGraph; Boolean visited[ MAX_AMVNUMS] ;  void  CreateAMGraph ( AMGraph * G) ;  
void  PrintAMatrix ( AMGraph G) ;  
void  DFSTraverse ( AMGraph G,  int  v) ;  
void  DFS_AM ( AMGraph G,  int  v) ;  
void  BFSTraverse ( AMGraph G,  int  v) ;  
void  BFS_AM ( AMGraph G,  int  v) ;  
Boolean InitQueue ( SqQueue * queue) ;  
Boolean EnQueue ( SqQueue * queue,  int  elem) ;  
Boolean DeQueue ( SqQueue * queue,  int  * elem) ;  
Boolean IsFull ( SqQueue * queue) ;  
Boolean IsEmpty ( SqQueue * queue) ;  
int  main ( )  { AMGraph * G; G =  ( AMGraph * )  malloc ( sizeof ( AMGraph) ) ;  CreateAMGraph ( G) ;  PrintAMatrix ( * G) ;  DFSTraverse ( * G,  1 ) ;  printf ( "\n" ) ; BFSTraverse ( * G,  3 ) ;  getchar ( ) ; 
} 
void  CreateAMGraph ( AMGraph * G)  { printf ( "输入无向图的顶点数和边数,用空格分开:" ) ; scanf ( "%d %d" ,  & ( G-> numVertexes) ,  & ( G-> numEdges) ) ; getchar ( ) ; for  ( int  i =  0 ;  i <  G-> numVertexes;  i++ )  { 
G-> verxs[ i]  =  i; } for  ( int  i =  0 ;  i <  G-> numVertexes;  i++ )  { for  ( int  j =  0 ;  j <  G-> numVertexes;  j++ )  { G-> arcs[ i] [ j]  =  0 ; } } 
int  arrSub1[ ]  =  { 0 ,  0 ,  1 ,  1 ,  2 ,  2 ,  3 ,  4 ,  5 } ; int  arrSub2[ ]  =  { 1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  7 ,  6 } ; for  ( int  i =  0 ;  i <  G-> numEdges;  i++ )  { 
G-> arcs[ arrSub1[ i] ] [ arrSub2[ i] ]  =  G-> arcs[ arrSub2[ i] ] [ arrSub1[ i] ]  =  1 ;  } 
} 
void  PrintAMatrix ( AMGraph G)  { for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  { for  ( int  j =  0 ;  j <  G. numVertexes;  j++ )  { printf ( "%d " ,  G. arcs[ i] [ j] ) ; } printf ( "\n" ) ; } 
} 
void  DFSTraverse ( AMGraph G,  int  v)  { for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  { visited[ i]  =  FALSE;  } for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  {  if  ( ! visited[ i] )  { DFS_AM ( G,  v) ;  } } 
} 
void  DFS_AM ( AMGraph G,  int  v)  { printf ( "V%d " ,  v) ; visited[ v]  =  TRUE;  for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  {  if  ( ( G. arcs[ v] [ i]  !=  0 )  &&  ( ! visited[ i] ) )  { DFS_AM ( G,  i) ;  } } 
} 
void  BFSTraverse ( AMGraph G,  int  v)  { for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  { visited[ i]  =  FALSE;  } for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  {  if  ( ! visited[ i] )  { BFS_AM ( G,  v) ;  } } 
} 
void  BFS_AM ( AMGraph G,  int  v)  { printf ( "V%d " ,  v) ; visited[ v]  =  TRUE;  SqQueue queue; InitQueue ( & queue) ;  EnQueue ( & queue,  v) ;  int  u; while  ( ! IsEmpty ( & queue) )  { DeQueue ( & queue,  & u) ;  for  ( int  i =  0 ;  i <  G. numVertexes;  i++ )  {  if  ( ( G. arcs[ u] [ i]  !=  0 )  &&  ( ! visited[ i] ) )  { printf ( "V%d " ,  i) ; visited[ i]  =  TRUE;  EnQueue ( & queue,  i) ;   } } } 
} 
Boolean InitQueue ( SqQueue * queue)  { queue-> base =  ( int  * )  malloc ( sizeof ( int )  *  MAXSIZE) ;  if  ( ! ( queue-> base) )  { return  FALSE;  } queue-> front =  queue-> rear =  0 ;  return  TRUE; 
} 
Boolean EnQueue ( SqQueue * queue,  int  elem)  { if  ( IsFull ( queue) )  { return  FALSE; } queue-> base[ queue-> rear]  =  elem;  queue-> rear =  ( queue-> rear +  1 )  %  MAXSIZE;  return  TRUE; 
} 
Boolean DeQueue ( SqQueue * queue,  int  * elem)  { if  ( IsEmpty ( queue) )  { return  FALSE; } * elem =  queue-> base[ queue-> front] ;  queue-> front =  ( queue-> front +  1 )  %  MAXSIZE;  return  TRUE; 
} 
Boolean IsFull ( SqQueue * queue)  { return  ( queue-> rear +  1 )  %  MAXSIZE ==  queue-> front;  
} 
Boolean IsEmpty ( SqQueue * queue)  { return  queue-> front ==  queue-> rear; 
} 
运行结果