数据结构-邻接表广度优先搜索(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;
}

运行结果如下:

相关推荐
white-persist1 天前
差异功能定位解析:C语言与C++(区别在哪里?)
java·c语言·开发语言·网络·c++·安全·信息可视化
ShineWinsu1 天前
对于数据结构:链式二叉树的超详细保姆级解析—中
数据结构·c++·算法·面试·二叉树·校招·递归
合方圆~小文1 天前
高性能20倍变焦球机转动功能监控设备
数据结构·数据库·数码相机·模块测试
这周也會开心1 天前
Map的遍历方式
数据结构·算法
liu****1 天前
20.传输层协议TCP
服务器·网络·数据结构·c++·网络协议·tcp/ip·udp
dangdang___go1 天前
自定义类型:结构体
c语言·结构体·结构体的声明·结构体的自引用
前端小L1 天前
图论专题(二):“关系”的焦点——一眼找出「星型图的中心节点」
数据结构·算法·深度优先·图论·宽度优先
叫我龙翔1 天前
【数据结构】从零开始认识B树 --- 高效外查找的数据结构
数据结构·c++·b树
点云SLAM1 天前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
码界奇点1 天前
Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
linux·c语言·网络·c++·ux·risc-v