【C++】数据结构图的简单创建和遍历

图的表达方式非常的多,要找到一种自己熟练的表达方式非常重要,这里就介绍一下左神的推荐

在写图之前先简单了解一下在本文章中set集合,栈和队列的使用方法

Set集合

set<int> a;

a.begin()--返回迭代器(可以先理解为指针)指向的第一个元素

a.empty()--判断集合是否为空,如果为空返回true

a.find()--寻找到一个元素

a.end()--返回迭代器指向最后一个元素

a.count()--返回某个值在集合中出现的次数

a.insert(x)--插入元素x

Stack栈

stack<int> b;

b.empty()--如果栈为空返回true

b.size()--返回栈中的元素个数

b.pop()--删除栈顶的元素但不返回其值

b.top()--返回栈顶的元素但不返回其值

b.push()--在栈顶压入新的元素

Queue队列

queue<int> c;

c.size()--返回队列中的元素个数

c.pop()--删除队列首元素但不返回其值

c.front()--返回队列首元素的值但不删除该元素

c.push()--在队尾压入新元素

c.back()--返回队列尾元素的值,但不删除该元素

废话不多说,直接上码!

首先是头文件和类的建立

#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack> 
#include <string>
using namespace std;
class Edge ;
class Node                 //点的类 
{
public:
	int value;
	int in;
	int out;
	vector<Node*>nodes;
	vector<Edge*>edges;
	Node(int value)
	{this->value=value;
	in=0;
	out=0;
	}
};

class Edge            //边的类 
{public:
	int weight;
	Node* from;
	Node* to;
	Edge(int Weight,Node* From,Node* To)
	{weight=Weight;
	from=From;
	to=To;	
	}
};

class Graph        //图的类 
{public:
	map<int,Node*> nodes;
	set<Edge*> edges;
};

 这个函数很重要,相当于一个接口,可以将一个图通过你自己的方式放入自己建立的类中

Graph* setin(int matrix[][3],int n)    //matrix[][0]为起始点,matrix[][1]为终点,matrix[][2]为边长,n为边数 
{Graph* graph=new Graph;
for (int i=0;i<n;i++)
{	int from=matrix[i][0];
	int to=matrix[i][1];
	int weight=matrix[i][2];
	if (graph->nodes.find(from)==graph->nodes.end())
{		graph->nodes[from]=new Node(from);
}
	if (graph->nodes.find(to)==graph->nodes.end())
{		graph->nodes[to]=new Node(to);
}
Node* fromnode=graph->nodes[from];
Node* tonode=graph->nodes[to];
Edge* newedge=new Edge(weight,fromnode,tonode);
fromnode->nodes.push_back(tonode);
fromnode->out++;
fromnode->edges.push_back(newedge);
tonode->in++;
graph->edges.insert(newedge);

}
return graph;	
}

然后是BFS(宽度优先遍历)

void BFS(Node* node)  //图的宽度优先遍历  
{	if (node==NULL)
{		return;
}
set<Node*> nodeset;
queue<Node*> nodeque;
nodeset.insert(node);
nodeque.push(node);
while(!nodeque.empty())
{	Node* cur=nodeque.front();
	nodeque.pop();
	cout<<"此点的值为:"<<cur->value<<endl;
	Node* next;
	for(int i=0;i<cur->nodes.size();i++)
{		next=cur->nodes[i];
		if (nodeset.find(next)==nodeset.end())
{			nodeque.push(next);
			nodeset.insert(next);
}	
}	
}
}

DFS(深度优先遍历)

void DFS(Node* node)  //深度优先遍历 
{if (node==NULL)
	return;
stack<Node*> nodestack;
set<Node*> nodeset2;
nodeset2.insert(node);
nodestack.push(node);
cout<<"该点的值为:"<<node->value<<endl;
while (!nodestack.empty())
{
	Node* cur=nodestack.top();
	nodestack.pop();
	for (int i=0;i<cur->nodes.size();i++)
{		Node* next=cur->nodes[i];
		if (nodeset2.find(next)==nodeset2.end())
{
			nodestack.push(cur);
			nodestack.push(next);
			nodeset2.insert(next);
			cout<<"这个点的值为:"<<next->value<<endl;
			break;
			
}
}
}	
}

欢迎指导!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿世界安静点

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值