有向图的广度优先遍历(邻接矩阵)

#include<stdio.h>
#include<stdlib.h>
#define INFINTY 65535 //最大值
#define MAX  20  //最大顶点个数
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
typedef int status;
typedef int EdgeType;//边
typedef int QElemType;
typedef char VertexType;//顶点类
//typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网
typedef struct
{
	VertexType vexs[MAX];//顶点
	EdgeType  arcs[MAX][MAX];  //邻接矩阵
	int vexnum,arcnum; //图当前的顶点数和弧数
//	GraphKind kind;  //图的种类
}MGraph;
/*队列结构*/
typedef struct QNode
{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
	QueuePtr front,rear;  //队头队尾指针 
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
	Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
	if(!Q.front)
		exit(0);
	Q.front->next=NULL;
	return 1;	
} 
int EnQueue(LinkQueue &Q,int i)
{
	QueuePtr s;printf("   i=%d",i);
	s=(QueuePtr)malloc(sizeof(QNode));
	if(!s)
		exit(0);
	s->data=i;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;printf("   s->data=%d\n",s->data);
	return 1;	
}
//出队列
int DeQueue(LinkQueue *Q,int *i)
{
	QueuePtr p;
	if(Q->front==Q->rear)
		return 0;
	p=Q->front->next;   //相当于p储存第一个结点  
	*i=p->data;
	Q->front->next=p->next;
	if(p==Q->rear)   //若队头是队尾	,删除后将rear指向头结点		
		Q->rear=Q->front;
	free(p);
	return 1;			

 } 
status LocateVex(MGraph *G,VertexType e)
{
	int i;
	for(i=0;i<G->vexnum;++i)
	{
		if(e==G->vexs[i])
			return i;
	}
	return -1;
}
status CreatDG(MGraph *G)//有向图
{
	scanf("%d %d",&G->vexnum,&G->arcnum);getchar();
	int i,j,k;
	VertexType v1,v2;
	i=0;
	while(i<G->vexnum)
	{
		scanf("%c",&G->vexs[i]);
		i++;
	}
	getchar();
	for(i=0;i<G->vexnum;i++)//初始化   
		for(j=0;j<G->vexnum;j++)
			G->arcs[i][j]=INFINTY;
	for(k=0;k<G->arcnum;k++)
	{
		scanf("%c,%c",&v1,&v2);//输入一条边依附的顶点
		getchar();
		i=LocateVex(G,v1);//头
		j=LocateVex(G,v2);//尾
		G->arcs[i][j]=1;
	//	G->arcs[i][j]=G->arcs[j][i];
	}
	return OK;
}
/*
//输出邻接矩阵 
void Output(MGraph *G)   
{
	int i,j,count=0;
	for(i=0;i<G->vexnum;i++)
		printf("\t%c",G->vexs[i]);
	printf("\n");
	for(i=0;i<G->vexnum;i++)
	{
		printf("%4c",G->vexs[i]);
		for(j=0;j<G->vexnum;j++)
		{	
				printf("\t%d",G->arcs[i][j]);
				count++;
				if(count%G->vexnum==0)
				printf("\n");	
		} 
   }	 
} */
int visited[MAX];
void BFSTraverse(MGraph *G)
{
	int i,j;
	LinkQueue Q;
	for(i=0;i<G->vexnum;++i)
		visited[i]=FALSE;
	InitQueue(Q);
	for(i=0;i<G->vexnum;++i)
	{
		if(!visited[i])
		{
			visited[i]=TRUE;
			printf("%c ",G->vexs[i]);
			EnQueue(Q,i);
			while(Q.front->next!=NULL)
			{
     			DeQueue(&Q,&i);    //将队中元素出队列,赋值给i 
				for(j=0;j<G->vexnum;j++)
				{
					if(G->arcs[i][j]==1&&!visited[j])      //其他顶点与该顶点存在边   且未访问过 
					{
						visited[j]=TRUE;
						printf("%c",G->vexs[j]);
						EnQueue(Q,j);                 //入队列 
					}
				} 
			}
		}
	}
}
void main()
{
	MGraph *G=NULL;
	G=(MGraph *)malloc(sizeof(MGraph));
	CreatDG(G);
	Output(G);
	BFSTraverse(G);
}                                 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值