BFS算法(详细C)

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

#include<stdio.h>
#include<stdlib.h>
#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;i<T->Nv;i++)
		for(j=0;j<T->Nv;j++)
			T->G[i][j]=0;
	for(i=0;i<T->Ne;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;i<g->Nv;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;i<gragh->Nv;i++)
		visited[i]=0;
	bfs(gragh,0,Q);
	return 0;
}


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


  • 14
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没想好叫什么名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值