要注意 visit[] 数组更新的位置,放在if内,如果放在出队时才更新,后面for会把关键字重复入队,所以更新 visit[] 的时机为入队前。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define maxSize 30
typedef char Elemtype;
typedef struct MGraph{
Elemtype vex[maxSize];
int arg[maxSize][maxSize];
int num_vex,num_arg;
}MGraph,*MyGraph;
void createMGraph(MGraph *mgraph){
if(!mgraph) return;
Elemtype v;
int i=0,j,p,q;
mgraph->num_arg=0;
mgraph->num_vex=0;
while(scanf("%c",&v)){
if(v!='#'){
mgraph->vex[i++]=v;
mgraph->num_vex++;
}else{
break;
}
}
for(i=0;i<mgraph->num_vex;i++){
for(j=0;j<mgraph->num_vex;j++){
mgraph->arg[i][j]=0;
}
}
while(1){
scanf("%d,%d",&p,&q);
getchar();
if(p!=-1 && q!=-1){
mgraph->arg[p][q]=1;
mgraph->arg[q][p]=1;
mgraph->num_arg++;
}else{
break;
}
}
}
void printMGraph(MGraph *mgraph){
int i,j;
printf("graph:\n");
for(i=0;i<mgraph->num_vex;i++){
for(j=0;j<mgraph->num_vex;j++){
printf("%d ",mgraph->arg[i][j]);
}
printf("\n");
}
//printf("%d,%d\n",mgraph->num_vex,mgraph->num_arg);
}
void DFS(MGraph *mgraph,int vex_start,int visit[]){
int i;
visit[vex_start]=1;
printf("%c",mgraph->vex[vex_start]);
for(i=0;i<mgraph->num_vex;i++){
if(mgraph->arg[vex_start][i]==1 && visit[i]==0){
DFS(mgraph,i,visit);
}
}
}
void BFS(MGraph *mgraph,int vex_start){
int Queue[mgraph->num_vex],front=0,rear=0,temp;
int visit[mgraph->num_vex],i=0;
while(i<mgraph->num_vex){
visit[i]=0;
Queue[i++]=0;
}
visit[vex_start]=1;
rear=(rear+1)%mgraph->num_vex;
Queue[rear]=vex_start;
while(front!=rear){
front=(front+1)%mgraph->num_vex;
temp=Queue[front];
Queue[front]=0;
printf("%c",mgraph->vex[temp]);
for(i=0;i<mgraph->num_vex;i++){
if(visit[i]==0 && mgraph->arg[temp][i]==1){
visit[i]=1;//***
rear=(rear+1)%mgraph->num_vex;
Queue[rear]=i;
}
}
// //打印队列
// int j=0;
// while(j<mgraph->num_vex){
// printf("%d",Queue[j++]);
// }
// printf("\n");
}
}
int main(){
MGraph *mgraph = (MGraph*)malloc(sizeof(MGraph));
createMGraph(mgraph);
printMGraph(mgraph);
//DFS
printf("dfs:");
int vex_start;
scanf("%d",&vex_start);
int visit[mgraph->num_vex];
int i=0;
while(i<mgraph->num_vex)
visit[i++]=0;
DFS(mgraph,vex_start,visit);
printf("\n");
//BFS
printf("bfs:");
BFS(mgraph,vex_start);
return 0;
}