图的广度优先遍历类似于树的按层次遍历过程。图的深度优先遍历类似于树中的先根遍历。树中不存在回路,但图中可能有回路,为避免走过重复的点,应该在每个结点设立一个访问标志,在遍历中,应为每个结点设立一个访问标志,每扫描到一个结点,要检查它的访问标志,若标志为“未访问”,则按正常方式对其进行处理(如访问或转到它的邻接点等);若标志为“已访问”,则扫描下一个结点。
#include<stdio.h>
#include<stdlib.h>
int* visited; //标记数组
typedef struct{
int Graph[5][5];
}Graph,*GraphPtr;
int myGraph[5][5]={
{0,1,0,1,0},
{1,0,1,0,1},
{0,1,0,1,1},
{1,0,1,0,0},
{0,1,1,0,0}
};
GraphPtr initialize(){
int i,j;
GraphPtr resultPtr=(GraphPtr)malloc(sizeof(Graph));
for(i=0;i<5;i++){
for(j=0;j<5;j++){
resultPtr->Graph[i][j]=myGraph[i][j];
}
}
return resultPtr;
}
void Deep(GraphPtr paraGraph,int paraNode){
int i;
printf("%d\t",paraNode);
visited[paraNode]=1;
for(i=0;i<5;i++){
if(!visited[i]){
if(paraGraph->Graph[paraNode][i]){
Deep(paraGraph,i);
}
}
}
}
void DeepTranverse(GraphPtr paraGraph,int paraStart){
int i;
visited=(int*)malloc(sizeof(int));
for(i=0;i<5;i++){