BFS算法(详细C)

最近学了图的广度和深度优先遍历,但是广度比深度要麻烦一些,用到了队列,我就完全的按自己的思路写了一段很长的代码,看了一些大神写的,但其实可以比较简单,其实图也有多种表示方式,所以各个代码会有不同,下面给出我的程序。

#include
#include
#define maxn 100
#define maxsize 100
typedef struct qnode * Queue;
typedef struct node * Gragh;
int visited[maxn];
struct qnode
{
	int data[maxsize];
	int front;
	int rear;
};
struct node
{
	int Nv;
	int Ne;
	int G[maxn][maxn];
};

Queue Createqueue()
{
	Queue Q=(Queue)malloc(sizeof(struct qnode));
	Q->front=Q->rear=0;
	return Q;
}

void Insertqueue(Queue Q,int x)
{
	if((Q->rear+1)%maxsize==Q->front)
	printf("Full!");
	else
	{
		Q->data[Q->rear]=x;
		Q->rear=(Q->rear+1)%maxsize;
	}
}

int Deletequeue(Queue Q)
{
	int temp;
	if(Q->front==Q->rear)
		return 0;
	else
	{
		temp=Q->data[Q->front];
		Q->front=(Q->front+1)%maxsize;
	}
	return temp;
}

Gragh Creategragh()
{
	int i,j,v,e,k,m;
	Gragh T=(Gragh)malloc(sizeof(struct node));
	printf("请输入顶点:");
	scanf("%d",&v); //顶点
	printf("请输入边:");
	scanf("%d",&e);  //边
	T->Nv=v;
	T->Ne=e;
	for(i=0;iNv;i++)
		for(j=0;jNv;j++)
			T->G[i][j]=0;
	for(i=0;iNe;i++)
	{
		scanf("%d %d",&k,&m);  //无权重的边,且为无向图
		T->G[k][m]=1;
		T->G[m][k]=1;
	}
	return T;
}

void bfs(Gragh g,int x,Queue Q)
{
	int i,temp;
	visited[x]=1;
	Insertqueue(Q,x);
	while(Q->front!=Q->rear)
	{
		temp=Deletequeue(Q);
		printf("正在遍历%d个顶点\n",temp);
		for(i=0;iNv;i++)
		{
			if(g->G[i][temp]!=0&&visited[i]==0)
			{
				visited[i]=1;
				Insertqueue(Q,i);
			}
		}
	}
}

int main()
{
	int i;
	Queue Q=Createqueue();
	Gragh gragh=Creategragh();
	for(i=0;iNv;i++)
		visited[i]=0;
	bfs(gragh,0,Q);
	return 0;
}

BFS算法(详细C)_第1张图片

这是我自己画的一个图,然后输入进入,根据程序的结果,比较一下感受广度优先遍历的过程。(很抱歉上面的图中0到4还有个线段没画出。)下面的程序运行情况上面部分也没有显示完全。

BFS算法(详细C)_第2张图片

你可能感兴趣的:(算法与数据结构)