数据结构总结11——图2——图的广度优先遍历 by DexterYan

一、基础知识

二、代码要求

三、代码实现

#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指示不对陷入死循环

猜你喜欢

转载自blog.csdn.net/qq_41259302/article/details/90523162