邻接表 的 DFS 与 BFS


一、建立队列
#define TRUE 1
#define FALSE 0
#define bool int
bool visited[MAX];
typedef struct QNode {
	char data[MAX];
	int front, rear;
}Queue;
void Initialize(Queue *q)
	{
		q->front = q->front = 0;
	}
int is_empty(Queue q)
	{
		return q.front == q.rear ;
	}
int is_full(Queue q)
	{
		return q.front == (q.rear+1)%MAX;
	}
void Enqueue(int x, Queue *q)
	{
		if(!is_full(*q)){
			q->data[q->rear] = x;
			q->rear = (q->rear+1)%MAX;
		}	
	}
void Dequeue(Queue *q)
	{
		if(!is_empty(*q)){
			q->front = (q->front+1)%MAX;
		}	
	}
int q_front(Queue q)
	{
		if(!is_empty(q)){
			return q.data[q.front];
		}
	}	


二、 DFS(深度优先搜索
void DFS(LGraph g, int i)
{
	visited[i] = TRUE;
	printf("%c ", g.vex[i].data);
	ENode* p;
	p = g.vex[i].first_edge;
	while (p != NULL) {
		if (!visited[p->ivex])
			DFS(g, p->ivex);
		p = p->next_edge;
	}
}
void DFSTrv(LGraph g)
{
	int i;
	for (i = 0; i < g.vexnum; i++) {
		visited[i] = FALSE;
	}
	for (i = 0; i < g.vexnum; i++) {
		if (!visited[i]) {
			DFS(g, i);
		}
	}
}
三、BFS(广度优先搜索)
void BFS(LGraph g, int k)
	{
		Queue q;
		int i;
		ENode* p;
		Initialize(&q);
		visited[k] = TRUE;
		printf("%c", g.vex[k].data);
		Enqueue(k, &q);
		while(!is_empty(q)){
			i = q_front(q);
			Dequeue(&q);
			p = g.vex[i].first_edge;
			while(p != NULL){
				if(!visited[p->ivex]){
					Enqueue(p->ivex, &q);
					printf("%c",g.vex[p->ivex].data);
					visited[p->ivex] = TRUE;
				}
				p = p->next_edge;
			}
		} 
	}
	
void BFSTrv(LGraph g)
{
	int i;
	for (i = 0; i < g.vexnum; i++) {
		visited[i] = FALSE;
	}
	//BFS(g, 0); 如果图连通则从任意顶点都可以 访问所有的顶点
	//下面是不连通时候的 搜索 
	for (i = 0; i < g.vexnum; i++) {
		if (!visited[i])
			BFS(g, i);
	}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值