一、基础知识
二、代码要求
三、代码实现
#include<stdio.h>
#include<stdlib.h>
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct
{
VertexType vexs[MaxVertexNum];//顶点表
EdgeType edges[MaxVertexNum][MaxVertexNum];//边表,邻接矩阵
int n,e;//顶点数和边数
}MGraph;//以邻接矩阵存储图类型
int visited[MaxVertexNum];
void CreateMGraph(MGraph *G)//建立图的邻接矩阵
{
int i, j, k;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
scanf("%d,%d",&(G->n),&(G->e));//输入顶点数和边数 /*这G->n不加括号括起来有无影响?*/
printf("请输入顶点信息(输入格式为:<回车>顶点号):\n");
for(i=0; i<G->n; i++)
{
scanf("\n%c",&(G->vexs[i]));
}
for(i=0; i<G->n; i++)
{
for(j=0; j<G->n; j++)
{
G->edges[i][j]=0;//初始化邻接矩阵
}
}
printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
for(k=0; k<G->e; k++)
{
scanf("%d,%d",&i,&j);
G->edges[i][j]=1;//若此处加入G->deges[j][i]=1,则为无向图的邻接矩阵存储建立
G->edges[j][i]=1;
}
}
//char Queue[MaxVertexNum]
void BFSM(MGraph *G,int k)//广度搜索
{
int i,j;
int Queue[MaxVertexNum]; //队列实现
int front=-1,rear=-1;
// CirQueue *Q;
// InitQueue(Q);
printf("visit vertex:V%c\n",G->vexs[k]);
visited[k]=1;
// EnQueue(Q,k);
Queue[++rear]=k;//尾进头出
while(front!=rear/*QueueEmpty(Q)*/)
{
front++;//表示不是空队
//i=DeQueue(Q);
i=Queue[front--];//队里出队
rear--; //!!!一开始没写这句发生错误,再了解一下队列的机制!!!
for(j=0; j<G->n; j++)//依次搜索vj的邻接点
{
if(G->edges[i][j]==1&&visited[j]!=1)//若vj未访问
{
printf("visit vertex:V%c\n",G->vexs[j]);//访问结点vj
visited[j]=1;
// EnQueue(Q,j);//访问的结点vj入队
Queue[++rear]=j;
}
}
}
}
void BFSTraverseAL(MGraph *G)//广度优先遍历
{
int i;
for(i=0; i<G->n; i++)
visited[i]=0;
for(i=0; i<G->n; i++)
if(!visited[i])
BFSM(G,i);
}
int main()
{
MGraph x;
CreateMGraph(&x);
BFSTraverseAL(&x);
return 0;
}
四、代码反思总结
由于队列概念不清导致front和rear指示不对陷入死循环