c++实现邻接矩阵(不带权值)的存储

该代码实现了一个C++结构体mgraph1,用于存储和操作无权图的邻接矩阵。它支持构造图、查找节点索引、判断边是否存在、插入和删除边以及按顺序遍历边。示例展示了如何使用该结构体创建并打印两个图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;
#define MAXSIZE 5 
#define Infinity 100
#include<vector>
#include<utility>


/*
	邻接矩阵的空间复杂度为O(n) ;
	适合存贮稠密图,如果边很少的话会造成很大的空间浪费

*/

//不带权值,只用0和1表示是否存在连接的边
struct mgraph1 {
	char value[MAXSIZE];			//存储当前的节点
	bool edge[MAXSIZE][MAXSIZE];	//存储节点的边
	int var_num,side_num;			//当前的顶点数和当前边的数量

	//无参构造
	mgraph1() {
		fill(value, value + MAXSIZE, ' ');
		memset(edge,false,sizeof(edge));
		var_num = 0;
		side_num = 0;
	}

	//有参构造,由value和矩阵下标构造
	mgraph1(const string &values,const vector<pair<int,int>> &edgs) {
		fill(value,value+MAXSIZE,' ');

		var_num = values.size();
		if (values.size()<=MAXSIZE) {
			for (int i = 0; i < values.size();i++) {
				value[i] = values[i];
			}
		}

		memset(edge,false,sizeof(edge));
		for (auto &e: edgs) {
			edge[e.first][e.second] = true;
			edge[e.second][e.first] = true;
			side_num++;
		}
	}

	//有参构造,由value和端点的值构造
	mgraph1(const string &values,const vector<pair<char,char>> &edgs) {
		fill(value,value+MAXSIZE,' ');
		var_num = values.size();
		if (values.size() <= MAXSIZE) {
			for (int i = 0; i < values.size();i++) {
				value[i] = values[i];
			}
		}
		memset(edge,false,sizeof(edge));
		for (auto& e : edgs) {
			for (int i=0; i < values.size(); i++) {
				if (e.first == values[i]) {
					for (int j = 0; j < values.size(); j++) {
						if (e.second == values[j]) {
							edge[i][j] = true;
							edge[j][i] = true;
							break;
						}
					}
					break;
				}
			}
		}
		side_num = edgs.size();
	}

	/*
		找节点对应的下标
	*/
	int findindex(const char value) {
		for (int i = 0; i < this->var_num;i++) {
			if (this->value[i] == value) {
				return i;
			}
			else {
				return -1;
			}
		}
	}

	/*
		判断图是否存在连线AB
	*/
	bool adjacent(const string &node) {
		if (node.size() == 2) {
			int i = this->findindex(node[0]);
			int j = this->findindex(node[1]);
			if (i == -1 || j == -1) {
				return false;
			}
			else if (this->edge[i][j]==true) {
				return true;
			}
		}
		else {
			return false;
		}
	}

	/*
	在图中插入新的边
	*/
	bool insertEdge(const string &es) {
		if (es.size() == 2) {
			int i = this->findindex(es[0]);
			int j = this->findindex(es[1]);
			if (i == -1 || j == -1) {
				return false;
			}
			else{
				this->edge[i][j] = true;
				this->edge[i][j] = true;
				return true;
			}
		}
		else {
			return false;
		}
	}

	/*
	删除边AB
	*/
	bool delEdge(const string &es) {
		if (es.size() == 2) {
			int i = this->findindex(es[0]);
			int j = this->findindex(es[1]);
			if (this->edge[i][j]==false) {
				cout << "这条边不存在" << endl;
				return false;
			}
			else {
				this->edge[i][j] = false;
				return true;
			}
		}
		else {
			return false;
		}
	}

};



/*
	遍历邻接矩阵
	0 1 1 1 1 
	1 0 1 1 0
	1 1 0 0 0
	1 1 0 0 0 
	1 0 0 0 0
*/
void Byorder(mgraph1 &m1) {
	if (m1.var_num != 0) {
		for (int i = 0; i < m1.var_num;i++) {
			for (int j = 0; j < m1.var_num; j++) {
				if (m1.edge[i][j]) {
					cout << m1.value[i] << "---" << m1.value[j] << endl;
				}
			}
		}
	}
}



int main() {
	//不带权值
	mgraph1 m1 ;

	vector<pair<int, int>> edges{
		{ 0,1 }, { 0,2 }, { 0,3 }, { 0,4 },
		{ 1,0 }, { 1,2 }, { 1,3 },
		{ 2,0 }, { 2,1 },
		{ 3,0 }, { 3,1 },
		{ 4,0 }
	};
	mgraph1 m2("ABCDE",edges);
	Byorder(m2);
	cout << endl;
	
	vector<pair<char, char>> e2{
		{'A', 'B'}, { 'A', 'C' }, { 'A', 'D' }, { 'A', 'E' },
		{ 'B', 'C' }, { 'B', 'D' }
	};


	mgraph1 m3("ABCDE",e2);
	Byorder(m3);
	//
	//
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值