数据结构-邻接表广度优先搜索(C语言版)

对于一个有向图无向图,我们下面介绍第二种遍历方式。

广度优先搜索,即优先对同一层的顶点进行遍历。

如下图所示:

该例子,我们有六个顶点, 十条边。

对于广度优先搜索,我们先搜索a,再搜索abcd,最后搜索ef。

而对于广度优先搜索,我们需要一个队列来辅助我们进行广度优先搜索(先进先出)。

同时我们还需要一个visit数组来判断某个顶点是否已经被搜索过了。

cpp 复制代码
#include<stdio.h>

#define MAX_NUM 100
typedef struct ArcNode{				//边 
	int adjvex;
	struct ArcNode *next;
	int weight;
}ArcNode;		

typedef struct{						//头结点 
	char vertex;
	ArcNode *firstarc;
}VNode;

typedef VNode Adjlist[MAX_NUM];			//邻接表 

typedef struct{			//建立邻接表 
	Adjlist adjlist;
	int vexnum,arcnum;
}ALGraph;

void DFSTraverse(ALGraph *G)		//深度优先搜索 
{
	int v;
	int visit[G->vexnum];
	for(v=0;v<G->vexnum;v++){
		visit[v] = 0;
	}
	for(v=0;v<G->vexnum;v++){
		if(visit[v]==0)
			DFS(G,v,visit);
	}
}

void DFS(ALGraph *G,int v,int *visit)		//深度优先搜索后继结点判断 
{
	int w;
	ArcNode *p;
	printf("访问顶点:%c\n",G->adjlist[v].vertex);
	visit[v] = 1;
	p = G->adjlist[v].firstarc;
	while(p){
		w = p->adjvex;
		if(visit[w]==0)
			DFS(G,w,visit);
		p = p->next;
	}
}

void BFSTraverse(ALGraph *G)		//广度优先搜索后继节点判断 
{
	int v,w,u;
	int Q[G->vexnum+1],r,f;
	int visit[G->vexnum];
	for(v=0;v<G->vexnum;v++)
		visit[v] = 0;
	f = 0,r = 0;
	for(v=0;v<G->vexnum;v++){
		if(visit[v]==0){
			visit[v] = 1;
			printf("第%d个结点是->%c\n",v,G->adjlist[v].vertex);
			Q[r] = v;
			r = (r+1)%(G->vexnum+1);
			while(f!=r){
				u = Q[f];
				f = (f+1)%(G->vexnum+1);
				ArcNode *p = G->adjlist[u].firstarc;
				while(p){
					if(visit[p->adjvex]==0){
						visit[p->adjvex] = 1;
						printf("第%d个结点是->%c\n",p->adjvex,G->adjlist[p->adjvex].vertex);
						Q[r] = p->adjvex;
						r = (r+1)%(G->vexnum+1);
					}
					p = p->next;
				}
			}
		}
	}
}

int main()
{
	return 0;
}

运行结果如下:

相关推荐
呜喵王阿尔萨斯42 分钟前
编程中的英语
c语言·c++
only-lucky2 小时前
C语言socket编程-补充
服务器·c语言·php
JeffersonZU3 小时前
Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)
linux·c语言·unix·gnu
许愿与你永世安宁4 小时前
力扣343 整数拆分
数据结构·算法·leetcode
ruanjiananquan994 小时前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
持梦远方5 小时前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
Heartoxx5 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
杰克尼6 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
码农不惑12 小时前
2025.06.27-14.44 C语言开发:Onvif(二)
c语言·开发语言
凌肖战14 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode