图的遍历(典型的DFS)

在这里插入图片描述
任务:DFS遍历这个无向图
思路:类似二叉树的前序遍历。
不多解释,理解了思路以后代码不难写,自己分别用两种方法实现了一下:

法1:邻接矩阵实现

#include<iostream>
using namespace std;
#define MAXVEX 10
typedef struct {
	char vexs[MAXVEX];//顶点表
	int arc[MAXVEX][MAXVEX];//邻接矩阵
	int numVEXS;//顶点个数
}MGraph;
void Traverse(MGraph& G, bool* visited);
void DFS(MGraph& G, bool* visited, int i);

int main() {
	//initial
	MGraph G;
	G.numVEXS = 9;
	for (int i = 0; i < G.numVEXS; i++)
		for (int j = 0; j < G.numVEXS; j++)
			G.arc[i][j] = 0;
	G.arc[0][1] = G.arc[1][0] = 1; G.arc[0][5] = G.arc[5][0] = 1;
	G.arc[1][6] = G.arc[6][1] = 1; G.arc[1][2] = G.arc[2][1] = 1; G.arc[1][8] = G.arc[8][1] = 1;
	G.arc[2][3] = G.arc[3][2] = 1; G.arc[2][8] = G.arc[8][2] = 1;
	G.arc[3][8] = G.arc[8][3] = 1; G.arc[3][6] = G.arc[6][3] = 1; G.arc[3][7] = G.arc[7][3] = 1; G.arc[3][4] = G.arc[4][3] = 1;
	G.arc[4][5] = G.arc[5][4] = 1; G.arc[4][7] = G.arc[7][4] = 1;
	G.arc[5][6] = G.arc[6][5] = 1;
	G.arc[6][7] = G.arc[7][6] = 1;
	G.vexs[0] = 'A'; G.vexs[1] = 'B'; G.vexs[2] = 'C'; G.vexs[3] = 'D'; G.vexs[4] = 'E'; G.vexs[5] = 'F'; G.vexs[6] = 'G'; G.vexs[7] = 'H'; G.vexs[8] = 'I';



	bool visited[MAXVEX];
	memset(visited, false, MAXVEX);
	//start
	Traverse(G, visited);

	system("pause");
	return 0;
}

void Traverse(MGraph& G, bool* visited) {
	for (int i = 0; i < G.numVEXS; i++) {
		if (!visited[i])
			DFS(G, visited, i);
	}
}
void DFS(MGraph& G, bool* visited, int i) {
	visited[i] = true;
	cout << G.vexs[i] << endl;
	for (int j = 0; j < G.numVEXS; j++) {
		if (G.arc[i][j] == 1 && !visited[j])//找当前顶点的邻接且没有遍历过的顶点
			DFS(G, visited, j);
	}
}

法2:邻接表实现
按下图定义3个结构体:
顶点结点的结构体、边结点的结构体、邻接表的结构体
邻接表的结构体里的主要成员就是顶点结点的结构体数组VertexTable
在这里插入图片描述

#include<iostream>
using namespace std;
#define MAXVEX 15
struct EdgeNode {//边结点的结构体
	int adjvex;
	EdgeNode* next;
	EdgeNode(int value = -1) :adjvex(value), next(NULL) {}
};

typedef struct {//顶点结点的结构体
	char data;
	EdgeNode*firstedge;
}VertexNode, VertexTable[MAXVEX];

typedef struct {
	VertexTable vertexTable;//顶点结点组成的结构体数组
	int numVEXS;//顶点个数

}GraphAdjList;
void Traverse(GraphAdjList&G, bool*visited);
void DFS(GraphAdjList&G, bool*visited, int i);
int main() {
	GraphAdjList G;
	G.numVEXS = 9;
	for (int i = 0; i < 9; i++) {
		G.vertexTable[i].firstedge = NULL;
		G.vertexTable[i].data = 'A' + i;
	}
	EdgeNode*A_B = new EdgeNode(1); EdgeNode*A_F = new EdgeNode(5);
	EdgeNode*B_A = new EdgeNode(0); EdgeNode*B_C = new EdgeNode(2); EdgeNode*B_G = new EdgeNode(6); EdgeNode*B_I = new EdgeNode(8);
	EdgeNode*C_B = new EdgeNode(1); EdgeNode*C_D = new EdgeNode(3); EdgeNode*C_I = new EdgeNode(8);
	EdgeNode*D_C = new EdgeNode(2); EdgeNode*D_E = new EdgeNode(4); EdgeNode*D_G = new EdgeNode(6); EdgeNode*D_H = new EdgeNode(7); EdgeNode*D_I = new EdgeNode(8);
	EdgeNode*E_D = new EdgeNode(3); EdgeNode*E_F = new EdgeNode(5); EdgeNode*E_H = new EdgeNode(7);
	EdgeNode*F_A = new EdgeNode(0); EdgeNode*F_E = new EdgeNode(4); EdgeNode*F_G = new EdgeNode(6);
	EdgeNode*G_B = new EdgeNode(1); EdgeNode*G_D = new EdgeNode(3); EdgeNode*G_F = new EdgeNode(5); EdgeNode*G_H = new EdgeNode(7);
	EdgeNode*H_D = new EdgeNode(3); EdgeNode*H_E = new EdgeNode(4); EdgeNode*H_G = new EdgeNode(6);
	EdgeNode*I_B = new EdgeNode(1); EdgeNode*I_C = new EdgeNode(2); EdgeNode*I_D = new EdgeNode(3);
	G.vertexTable[0].firstedge = A_B; A_B->next = A_F;
	G.vertexTable[1].firstedge = B_A; B_A->next = B_C; B_C->next = B_G; B_G->next = B_I;
	G.vertexTable[2].firstedge = C_B; C_B->next = C_D; C_D->next = C_I;
	G.vertexTable[3].firstedge = D_C; D_C->next = D_E; D_E->next = D_G; D_G->next = D_H; D_H->next = D_I;
	G.vertexTable[4].firstedge = E_D; E_D->next = E_F; E_F->next = E_H;
	G.vertexTable[5].firstedge = F_A; F_A->next = F_E; F_E->next = F_G;
	G.vertexTable[6].firstedge = G_B; G_B->next = G_D; G_D->next = G_F; G_F->next = G_H;
	G.vertexTable[7].firstedge = H_D; H_D->next = H_E; H_E->next = H_G;
	G.vertexTable[8].firstedge = I_B; I_B->next = I_C; I_C->next = I_D;

	bool visited[MAXVEX];
	memset(visited, false, MAXVEX);
	//start
	Traverse(G, visited);

	system("pause");
	return 0;
}
void Traverse(GraphAdjList&G, bool*visited) {
	for (int i = 0; i < G.numVEXS; i++)
	{
		if (!visited[i])
			DFS(G, visited, i);
	}
}
void DFS(GraphAdjList&G, bool*visited, int i) {
	cout << G.vertexTable[i].data << endl;
	visited[i] = true;

	EdgeNode*temp = (G.vertexTable[i]).firstedge;
	while (temp != NULL)
	{
		if (!visited[temp->adjvex])
			DFS(G, visited, temp->adjvex);
		temp = temp->next;
	}

}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值