图的邻接表广度优先搜索

#include <bits/stdc++.h>
#define VSIZE 100
using namespace std;
typedef int VType;

typedef struct ENode{ //边链表结点 
	int v;//定义下标
	struct ENode *next;//下一个顶点的指针 
}ENode;
typedef struct VNode{  //顶点的结点 
	VType data;        //顶点中数据 
	ENode *first;		//第个边链表的指针 
}VNode;
typedef struct AdjMGraph{
	VNode vexs[VSIZE];  //顶点数据 
	int VNum;       //顶点个数 
	int ENum;       //边的个数 
}AdjMGraph;
void createGraph(AdjMGraph *g)
{
	printf("输入顶点个数\n");
	scanf("%d",&g->VNum);
	printf("输入边的个数\n");
	scanf("%d",&g->ENum);
	printf("输入顶点中的数据\n");
	for(int i = 0;i < g->VNum;i++){
		scanf("%d",&g->vexs[i]);
		g->vexs[i].first =NULL;
	}
	printf("输入哪个顶点之间有边\n");
	for(int i = 0;i < g->ENum;i++){
		int n,m;;
		scanf("%d %d",&n,&m);
		ENode *p = (ENode *)malloc(sizeof(ENode));
		p->v = m-1;
		p->next = g->vexs[n-1].first;
		g->vexs[n-1].first = p;
		
		p->v = n-1;
		p->next = g->vexs[m-1].first;
		g->vexs[m-1].first = p;
	}
}
void BFStraverse(AdjMGraph g)
{
	int visited[VSIZE];           
	queue<int> a;//定义一个队  
	memset(visited,0,sizeof(visited));  //0表示没有被访问过,1表示被访问过 
	for(int i = 0;i < g.VNum;i++){ //每一个顶点都要判断一下 
		if(visited[i] == 0){      //表示没有被访问过 
			visited[i] = 1;//表示这个顶点已经被访问了 
			a.push(i);      //以这个没有被访问的点 继续批 
			printf("%d\n",g.vexs[i].data);
			while(!a.empty()){
				int k = a.front();   //获取当前队头 
				ENode *p = g.vexs[k].first;
				a.pop();  //去掉队头 
				while(p){
					if(visited[p->v] == 0){   //没有被访问过 
						visited[p->v] = 1;
						printf("%d\n",g.vexs[p->v].data);
						a.push(p->v);   //表示没有访问,进入队列 
					}
					p = p->next;
				}
			}
		}
	}
}
int main()
{
	AdjMGraph g;       //定义邻接表图 
	createGraph(&g); //创建邻接表图 
	BFStraverse(g);  //图的广度的优先搜索 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/88960491