基于C语言图的广度优先遍历BFS

前言

最近在复习数据结构,为了更好的学习,想着在CSDN上分享自己的学习内容,以便更好地掌握知识。

一.图的代码

#include<stdio.h>
#include<stdlib.h>
#define Mvnum 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int VerTexType;
typedef int Status;
typedef int ArcType;
typedef struct ArcNode{
	int adjvex;
	struct ArcNode* nextarc;
	int info;
}ArcNode;
typedef struct VNode{
	VerTexType data;
	ArcNode *firstarc;
}VNode,AdjList[Mvnum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
}ALGraph;
int Locate(int v,AdjList l,int vexnum){
	int i;
	for(i=0;i<vexnum;i++){
		if(v==l[i].data){
			return i;
		}
	}
	return false;
}
Status CreateUDG(ALGraph *g){
	printf("请输入总顶点数和总边数:\n");
	scanf("%d %d",&(*g).vexnum,&(*g).arcnum);
	int i;
	for(i=0;i<(*g).vexnum;i++){
		printf("请输入第%d个顶点的序号:\n",i+1);
		scanf("%d",&(*g).vertices[i].data);
		(*g).vertices[i].firstarc=NULL;
	}
	for(i=0;i<(*g).arcnum;i++){
		int v1,v2;
		printf("请输入第%d条边的两个顶点:\n",i+1);
		scanf("%d %d",&v1,&v2);
		int i=Locate(v1,(*g).vertices,(*g).vexnum);
		int j=Locate(v2,(*g).vertices,(*g).vexnum);
		ArcNode *p1;
		p1=(ArcNode*)malloc(sizeof(ArcNode));
		p1->adjvex=j;
		p1->nextarc=(*g).vertices[i].firstarc;
		(*g).vertices[i].firstarc=p1; 
		ArcNode *p2;
		p2=(ArcNode*)malloc(sizeof(ArcNode));
		p2->adjvex=i;
		p2->nextarc=(*g).vertices[j].firstarc;
		(*g).vertices[j].firstarc=p2;
	}
	return ok;
}
void Show(ALGraph g){
	int i;
	printf("图的表节点:\n");
	for(i=0;i<g.arcnum;i++){
		printf("%d ",g.vertices[i].data);
	}
	printf("\n图的边节点:\n");
	for(i=0;i<g.vexnum;i++){
		ArcNode *p=g.vertices[i].firstarc;
		while(p){
			printf("%d ",p->adjvex);
			p=p->nextarc;
		}
		printf("\n");
	}
}
int main()
{
	ALGraph g;
	CreateUDG(&g);
	Show(g);
	return 0;
}

图采用邻接表的存储结构

二.队列代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int ElemType;
typedef int Status;
typedef struct{
	ElemType *base;
	int front;
	int rear;
}SqQueue;
Status Init_SqQueue(SqQueue *q,int len){
	q->base=(ElemType*)malloc(sizeof(ElemType)*len);
	if(!q->base){
		exit(overflow);
	}
	q->front=q->rear=0;
	return ok;
}
int Length_SqQueue(SqQueue s){
	return (s.rear-s.front+MAXSIZE)%MAXSIZE;
}
Status IsEmpty_SqQueue(SqQueue s){
	if(s.front==s.rear){
		return ok;
	}
	return error;
}
Status IsFull_SqQueue(SqQueue s){
	if((s.rear+1)%MAXSIZE==s.front){
		return ok;
	}
	return error;
}
Status Destroy(SqQueue *q){
	if(IsEmpty_SqQueue(*q)){
		return error;
	}
	free(q->base);
	q->front=0;
	q->rear=0;
	return ok;
}
Status EnSqQueue(SqQueue *s,ElemType e){
	if(IsFull_SqQueue(*s)){
		return error;
	}
	s->base[s->rear]=e;
	s->rear=(s->rear+1)%MAXSIZE;
	return ok;
}
int DeQueue_SqQueue(SqQueue *s){
	if(IsEmpty_SqQueue(*s)){
		return error;
	}
	int x=s->base[s->front];
	s->front=(s->front+1)%MAXSIZE;
	return x;
}
int GetTop_SqQueue(SqQueue s){
	if(IsEmpty_SqQueue(s)){
		return error;
	}
	return s.base[s.front];
}
Status Clear_SqQueue(SqQueue *s){
	s->front=s->rear=0;
	return ok;
}
int main()
{
	
	return 0;
}

 队列采用循环队列

三.完整代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define Mvnum 100
typedef int ElemType;
typedef int Status;
typedef int VerTexType;
typedef int Status;
typedef int ArcType;
typedef struct ArcNode{
	int adjvex;
	struct ArcNode* nextarc;
	int info;
}ArcNode;
typedef struct VNode{
	VerTexType data;
	ArcNode *firstarc;
}VNode,AdjList[Mvnum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
}ALGraph;
typedef struct{
	ElemType *base;
	int front;
	int rear;
}SqQueue;
int Locate(int v,AdjList l,int vexnum){
	int i;
	for(i=0;i<vexnum;i++){
		if(v==l[i].data){
			return i;
		}
	}
	return false;
}
Status CreateUDG(ALGraph *g){
	printf("请输入总顶点数和总边数:\n");
	scanf("%d %d",&(*g).vexnum,&(*g).arcnum);
	int i;
	for(i=0;i<(*g).vexnum;i++){
		printf("请输入第%d个顶点的序号:\n",i+1);
		scanf("%d",&(*g).vertices[i].data);
		(*g).vertices[i].firstarc=NULL;
	}
	for(i=0;i<(*g).arcnum;i++){
		int v1,v2;
		printf("请输入第%d条边的两个顶点:\n",i+1);
		scanf("%d %d",&v1,&v2);
		int i=Locate(v1,(*g).vertices,(*g).vexnum);
		int j=Locate(v2,(*g).vertices,(*g).vexnum);
		ArcNode *p1;
		p1=(ArcNode*)malloc(sizeof(ArcNode));
		p1->adjvex=j;
		p1->nextarc=(*g).vertices[i].firstarc;
		(*g).vertices[i].firstarc=p1; 
		ArcNode *p2;
		p2=(ArcNode*)malloc(sizeof(ArcNode));
		p2->adjvex=i;
		p2->nextarc=(*g).vertices[j].firstarc;
		(*g).vertices[j].firstarc=p2;
	}
	return ok;
}
Status Init_SqQueue(SqQueue *q,int len){
	q->base=(ElemType*)malloc(sizeof(ElemType)*len);
	if(!q->base){
		exit(overflow);
	}
	q->front=q->rear=0;
	return ok;
}
int Length_SqQueue(SqQueue s){
	return (s.rear-s.front+MAXSIZE)%MAXSIZE;
}
Status IsEmpty_SqQueue(SqQueue s){
	if(s.front==s.rear){
		return ok;
	}
	return error;
}
Status IsFull_SqQueue(SqQueue s){
	if((s.rear+1)%MAXSIZE==s.front){
		return ok;
	}
	return error;
}
Status Destroy(SqQueue *q){
	if(IsEmpty_SqQueue(*q)){
		return error;
	}
	free(q->base);
	q->front=0;
	q->rear=0;
	return ok;
}
Status EnSqQueue(SqQueue *s,ElemType e){
	if(IsFull_SqQueue(*s)){
		return error;
	}
	s->base[s->rear]=e;
	s->rear=(s->rear+1)%MAXSIZE;
	return ok;
}
int DeQueue_SqQueue(SqQueue *s){
	if(IsEmpty_SqQueue(*s)){
		return error;
	}
	int x=s->base[s->front];
	s->front=(s->front+1)%MAXSIZE;
	return x;
}
int GetTop_SqQueue(SqQueue s){
	if(IsEmpty_SqQueue(s)){
		return error;
	}
	return s.base[s.front];
}
Status Clear_SqQueue(SqQueue *s){
	s->front=s->rear=0;
	return ok;
}
int FirstAdjVex(ALGraph g,int u){
	return g.vertices[u-1].firstarc->adjvex+1;
}
int NextAdjVex(ALGraph g,int u,int w){
	ArcNode *p;
	p=g.vertices[u-1].firstarc;
	while(p&&(p->adjvex+1)!=w){
		p=p->nextarc;
	}
	p=p->nextarc;
	if(p==NULL){
		return -1;
	}
	return p->adjvex+1;
}
void BFS(ALGraph g,int v){
	int visted[g.vexnum+1];
	int i;
	for(i=1;i<=g.vexnum;i++){
		visted[i]=0;
	}
	visted[v]=1;
	SqQueue q;
	Init_SqQueue(&q,g.vexnum);
	EnSqQueue(&q,v);
	while(!IsEmpty_SqQueue(q)){
		int u;
		u=DeQueue_SqQueue(&q);
		printf("%d ",u);
		int w;
		for(w=FirstAdjVex(g,u);w>=0;w=NextAdjVex(g,u,w)){
			if(!visted[w]){
				visted[w]=1;
				EnSqQueue(&q,w);
			}
		}
	}
}
void Show(ALGraph g){
	int i;
	for(i=0;i<g.vexnum;i++){
		printf("\n");
		ArcNode *p=g.vertices[i].firstarc;
		while(p){
			printf("%d ",p->adjvex);
			p=p->nextarc;
		}
	}
}
int main()
{
	ALGraph g;
	CreateUDG(&g);
	Show(g);
	printf("\n");
	BFS(g,1);
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值