邻接表构成的无向图的深度优先, 广度优先遍历代码实现

要使用的无向图如下图所示

代码如下

#include<iostream>
#include <queue>
using namespace std;
#define maxSize 10
//定义邻接表的边
typedef struct ArcNode {
	char adjvex;
	struct ArcNode* next;
}ArcNode;
//定义邻接表的顶点
typedef struct Vertex {
	int vertex;
	ArcNode* firstedge;
};
//定义图
typedef struct ALGraph {
	Vertex vertices[maxSize];//邻接表的顶点数组
	int vexnum, arcnum;//图的最大顶点数和最大边数
}ALGraph;

int visited[maxSize];//visited代表已经访问的数组
void set_visited(ALGraph* G) {//将visited数组的前vexnum个数据置为0
	for (int i = 0; i < G->vexnum; i++) {
		visited[i] = 0;
	}
}
void Creat_AdjList(ALGraph* G, int n, int e, int arr[])  //创建图, 别忘记用引用
{
	n = 5; e = 7;
	G->vexnum = n;
	G->arcnum = e;//将图的最大顶点数置为n, 最大边数置为e

	//初始化顶点表
	for (int i = 0; i < G->vexnum; i++)//i<5
	{
		G->vertices[i].vertex = arr[i];//给顶点数组中的每个顶点赋值, 分别是0,1,2,3,4
		G->vertices[i].firstedge = NULL;  //给每一个顶点的边表指针赋值为NULL, 因为还没有添加节点,所以边表是空的
	}

	//创建无向图  因为是无向图,有a->b的边,就会有b->a的边,所以创建了*s 和 *p指针
	for (int i = 0; i < G->arcnum; i++)
	{
		int a, b;
		cin >> a >> b;   		// 表示 a和b有一条边 

		ArcNode* s = new ArcNode;
		s->adjvex = b;                    //边表的顶点值为 b
		s->next = G->vertices[a].firstedge;        //用头插法将顶点链接在边表,
		G->vertices[a].firstedge = s;

		ArcNode* p = new ArcNode;
		p->adjvex = a;
		p->next = G->vertices[b].firstedge;
		G->vertices[b].firstedge = p;
	}
}
void show_Graph(ALGraph G)
{

	for (int i = 0; i < G.vexnum; i++)
	{

		ArcNode* p = G.vertices[i].firstedge;
		while (p != NULL)
		{

			cout << "(" << i << "," << p->adjvex << ")";
			p = p->next;
		}
		cout << endl;
	}
}
//深度优先遍历代码实现
void DFSTraverse(ALGraph G, int v)//int v代表选取任意一个顶点作为起始顶点
{
	cout << G.vertices[v].vertex << " ";
	visited[v] = 1;//访问顶点并将该顶点的访问数组置为1

	ArcNode* p = G.vertices[v].firstedge;
	while (p != NULL)
	{
		int j = p->adjvex;
		if (visited[j] == 0)
		{
			DFSTraverse(G, j);
		}
		p = p->next;
	}
}
//广度优先遍历代码实现
void BFSTraverse(ALGraph G, int v, queue<int> Q)
{
	cout << G.vertices[v].vertex << " ";//输出v位置的顶点数据
	visited[G.vertices[v].vertex] = 1;//将已访问数组中的vertex位置的数据置为1
	Q.push(G.vertices[v].vertex);//将顶点的数据入队

	while (!Q.empty())//当队列不为空时持续循环
	{
		int val = Q.front();//将队首元素的值赋值给val
		Q.pop();//出队, 用C语言实现的话相当于队首指针向后移动一位

		ArcNode* p = G.vertices[val].firstedge;
		while (p != NULL)
		{
			int j = p->adjvex;
			if (!visited[j])
			{
				cout << G.vertices[j].vertex << " ";
				visited[j] = 1;
				Q.push(j);

			}
			p = p->next;
		}
	}
}
int main() {
	int arr[5] = { 0,1,2,3,4 };
	ALGraph* G = (ALGraph*)malloc(sizeof(ALGraph));
	Creat_AdjList(G, 3, 4, arr);
}

主要分为四部分, 1.邻接表的定义 2.图的建立 3.深度优先遍历 4.广度优先遍历

建议先掌握邻接表的定义, 否则其它部分比较难看懂

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值