瑞格7043--利用邻接表实现无向图的广度优先遍历
作者:互联网
#include <stdio.h>
#include <malloc.h>
#include <string.h>
using namespace std;
#define MAXVEX 20 //假设的最大顶点数
int visited[100]={0};
typedef char VertexType[3] ;/*数组类型*/
typedef struct vertex /*顶点类型*/
{ int adjvex; /*顶点编号*/
int data; /*顶点的信息*/
} VType;
typedef struct graph
{ int n,e; /*n为实际顶点数,e为实际边数*/
VType vexs[MAXVEX]; /*顶点集合*/
int edges[MAXVEX][MAXVEX]; /*边的集合*/
} AdjMatix; /*图的邻接矩阵类型*/
typedef struct edgenode
{ int adjvex; /*邻接点序号*/
int value; /*边的权值*/
struct edgenode *next; /*下一条边的顶点*/
} ArcNode; /*每个顶点建立的单链表中结点的类型*/
typedef struct vexnode
{ int data; /*结点信息*/
ArcNode *firstarc; /*指向第一条边结点*/
} VHeadNode; /*单链表的头结点类型*/
typedef struct
{ int n,e; /*n为实际顶点数,e为实际边数*/
VHeadNode adjlist[MAXVEX]; /*单链表头结点数组*/
} AdjList;
void MatToList(AdjMatix g,AdjList *&G)
{
int i,j,x,y;
ArcNode *p,*q;
G=(AdjList *)malloc(sizeof(AdjList));
for (i=0;i<g.n;i++)
{
G->adjlist[i].firstarc=NULL;
G->adjlist[i].data=g.vexs[i].data;
}
for(i=0;i<g.e;i++)
{
scanf("%d%d",&x,&y);
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=y;
p->next=G->adjlist[x-1].firstarc;
G->adjlist[x-1].firstarc=p;
q=(ArcNode *)malloc(sizeof(ArcNode));
q->adjvex=x;
q->next=G->adjlist[y-1].firstarc;
G->adjlist[y-1].firstarc=q;
}
G->n=g.n;G->e=g.e;
}
void BFS(AdjList *G,int vi) /*对邻接表g从顶点vi开始遍历*/
{
int i,v;
int Qu[MAXVEX],front=0,rear=0; /*循环队列*/
ArcNode *p;
printf("v%d ",vi+1); /*访问初始顶点*/
visited[vi]=1; /*置已访问标识*/
rear=(rear+1)%MAXVEX; /*循环移动队尾指针*/
Qu[rear]=vi; /*初始顶点进队*/
while (front!=rear) /*队列不为空时循环*/
{
front=(front+1) % MAXVEX;
v=Qu[front]; /*顶点v出队*/
p=G->adjlist[v].firstarc; /*找v的第一个邻接点*/
while (p!=NULL) /*找v的所有邻接点*/
{
if (visited[p->adjvex-1]==0)/*未访问过则访问之*/
{
visited[p->adjvex-1]=1; /*置已访问标识*/
printf("v%d ",p->adjvex);/*访问该点并使之入队列*/
rear=(rear+1) % MAXVEX; /*循环移动队尾指针*/
Qu[rear]=p->adjvex-1; /*顶点p->adjvex进队*/
}
p=p->next; /*找v的下一个邻接点*/
}
}
printf("\n");
}
int main()
{
int i,j,x,y;
AdjMatix g;
AdjList *G;
scanf("%d%d",&g.n,&g.e);
for (i=0;i<g.n;i++)
scanf("%d",&g.vexs[i].data);
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
g.edges[i][j]=0;
MatToList(g,G);
BFS(G,0);
return 0;
}
标签:瑞格,--,MAXVEX,int,adjvex,7043,adjlist,顶点,rear 来源: https://blog.csdn.net/weixin_53094331/article/details/121427423