图的深度优先遍历、广度优先遍历

邻接矩阵的深度优先遍历:

typedef int Boolean;		//bool型变量,表示已经访问过,表示未访问过
Boolean visited[MAXVEX];	//访问标志的数组
//邻接矩阵的深度优先递归算法
void DFS(MGraph G, int i)
{
	int j;
	visited[i] = 1;
	printf("%c ", G->vexs[i]);
	for (j = 0; j < G->numVertexes; j++)
		if (G->arc[i][j] == 1 && visited[j])
			DFS(G, j);		//对被访问的邻接顶点做递归调用
}
//邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G)
{
	int i;
	for (i = 0; i < G->numVertexes; i++)
		visited[i] = 0;		//所有顶点都是未访问过状态
	for (i = 0; i < G->numVertexes; i++)
		if (!visited[i])	//对未访问过的顶点调用DFS,若是连通图,只会执行一次
			DFS(G, i);
}

邻接矩阵的广度优先遍历

//邻接矩阵的广度遍历算法
void BFSTraverse(MGraph G)
{
	int i, j;
	Queue Q;
	for (i = 0; i < G.numVertexes; i++)
		visited[i] = 0;
	InitQueue(&Q);							//初始化辅助用的队列
	for(i = 0; i < G.numVertexes; i++)		//对每一个顶点做循环
		if (!visited[i])					//若是未访问过就处理
		{
			visited[i] = 1;					//设置当前顶点为访问过
			printf("%c ", G->vexs[i]);
			EnQueue(&Q, i);					//将此顶点入队列
			while (!QueueEmpty(Q))			//若当前顶点不为空
			{
				DeQueue(&Q, &i);			//将队中元素出列,赋值给i
				for (j = 0; j < G.numVertexes; j++)
				{
					//判断其他顶点。若与当前顶点有边且未被访问过
					if (G.arc[i][j] == 1 && !visited[j])
					{
						visited[j] = 1;
						printf("%c ", G->vexs[j]);
						EnQueue(&Q, j);		//将找到的此顶点入队列
					}
				}
			}
		}
}

邻接表的深度优先遍历

typedef int Boolean;		//bool型变量,表示已经访问过,表示未访问过
Boolean visited[MAXVEX];	//访问标志的数组
//邻接矩阵的深度优先递归算法
void DFS(GraphAdjList GL, int i)
{
	EdgeNode* p;
	visited[i] = 1;
	printf("%c ", GL->adjList[i].data);
	p = adjList[i].firstedge;
	while (p)
	{
		if (!visit[p->adjvex])
			DFS(GL, p->adjvex);
		p = p->next;
	}
}
//邻接矩阵的深度遍历操作
void DFSTraverse(GraphAdjList GL)
{
	int i;
	for (i = 0; i < GL->numVertexes; i++)
		visited[i] = 0;		//所有顶点都是未访问过状态
	for (i = 0; i < GL->numVertexes; i++)
		if (!visited[i])	//对未访问过的顶点调用DFS,若是连通图,只会执行一次
			DFS(GL, i);
}

邻接表的广度优先遍历

//邻接表的广度遍历算法
void BFSTraverse(GraphAdjList GL)
{
	int i, j;
	EdgeNode* p;
	Queue Q;
	for (i = 0; i < GL.numVertexes; i++)
		visited[i] = 0;
	InitQueue(&Q);							//初始化辅助用的队列
	for (i = 0; i < GL.numVertexes; i++)	//对每一个顶点做循环
		if (!visited[i])					//若是未访问过就处理
		{
			visited[i] = 1;					//设置当前顶点为访问过
			printf("%c ", GL->adjList[i].data);
			EnQueue(&Q, i);					//将此顶点入队列
			while (!QueueEmpty(Q))			//若当前顶点不为空
			{
				DeQueue(&Q, &i);			//将队中元素出列,赋值给i
				p = GL_adjList[i].firstedge;//找到当前顶点边表链表头指针
				while (p)
				{
					if (!visited[p->adjvex])
					{
						visited[p->adjvex] = 1;
						printf("%c ", GL->adjList[p->adjvex].data);
						EnQueue(&Q, p->adjvex);
					}
					p = p->next;			//指针指向下一个邻接点
				}
			}
		}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值