瑞格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;
}

上一篇:kafka auto.offset.reset参数解析


下一篇:vue课程拓展---vue的ie兼容,ios兼容