【数据结构基础C++】图论02-添加迭代器

这篇博客介绍了如何为稠密图和稀疏图实现迭代器类,并提供了相应的测试用例。通过创建和操作随机生成的无向图,展示了迭代器在遍历图的邻接节点时的功能。代码中定义了两个adjIterator类,分别适用于稠密图和稀疏图,实现了begin(), next()和end()方法来支持迭代。测试用例包括打印稠密图和稀疏图的邻接节点列表。
摘要由CSDN通过智能技术生成

在上一次的头文件中再添加一个类-迭代器,可用作后面测试用例

在这里插入图片描述

稠密图迭代器代码

class adjIterator {
	private:
		DenseGraph& G;
		int index;
		int v;

	public:
		//构造函数
		adjIterator(DenseGraph& g, int v):G(g) {
			assert(v >= 0 && v < G.n);
			this->v = v;
			this->index = -1;
		}
		//析构函数
		~adjIterator(){}
		int begin() {
			index = -1;
			return next();
		}
		int next() {
			for (index += 1; index < G.V(); index++) {
				if (G.g[v][index])
					return index;
			}
			return -1;
		}
		bool end() {
			return index >= G.V();
		}
	};

稀疏图迭代器代码

class adjIterator {
	private:
		SparseGraph& G;
		int v;
		int index;

	public:
		adjIterator(SparseGraph& g, int v) :G(g) {
			assert(v >= 0);
			this->v = v;
			this->index = 0;
		}
		~adjIterator(){}
		int begin() {
			index = 0;
			if (G.g[v].size())
				return G.g[v][index];
			return -1;
		}
		int next() {
			index++;
			if (index < G.g[v].size())
				return G.g[v][index];
			return -1;
		}
		bool end() {
			return index >= G.g[v].size();
		}
	};

测试用例,构建图

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include "DenseGraph.h"
#include "SparseGraph.h"
using namespace std;

int main() {
	//测试用例,20个顶点,70条边,无向图
	int n = 20;
	int m = 70; 
	bool directed = false;
	//随机种子
	srand(time(NULL));

	DenseGraph DG(n, directed);
	for (int i = 0; i < m; ++i) {
		int v = rand() % n;
		int w = rand() % n;
		DG.addEdge(v, w);
	}
	//打印图
	for (int i = 0; i < n; ++i) {
		cout << i << ":";
		DenseGraph::adjIterator adj(DG, i);
		for (int it = adj.begin(); !adj.end(); it = adj.next())
			cout << it << " ";
		cout << endl;
	}

	//稀疏图,邻接表,
	SparseGraph SG(n, m);
	for (int i = 0; i < m; ++i) {
		int v = rand() % n;
		int w = rand() % n;
		SG.addEdge(v,w);
	}
	//打印图
	cout << "============分隔符================" << endl;
	for (int i = 0; i < n; ++i) {
		cout << i << ":";
		SparseGraph::adjIterator adj(SG, i);
		for (int it = adj.begin(); !adj.end(); it = adj.next()) {
			cout << it << " ";
		}
		cout << endl;
	}

	system("pause");
	return 0;

}

测试

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值