C++创建一个图数据结构,BFS DFS遍历图

C++创建图结构,深度广度遍历图

首先邻接矩阵表示,MGrapgh是指向图结点的指针

struct GNode{
	int Nv;
	int Ne;
	vector<vector<int>> arr;
};

struct ENode{
	int v1,v2;
	int weight=1;
};

class graphSolution {
public:
	//访问记录
	vector<bool> visited;
	
	//插入边
	void insertEdge(GNode* G, ENode* E) {
		G->arr[E->v1][E->v2] = E->weight;
		G->arr[E->v2][E->v1] = E->weight;
	}
	//创建无边图
	GNode* creatGraph(int Nv) {
		int v,w;	//顶点
		GNode* MGraph = new GNode;

		MGraph->Nv = Nv;
		MGraph->Ne = 0;
		MGraph->arr.assign(Nv,vector<int>(Nv));

		for(v=0;v<Nv;v++) {
			for(w=0;w<Nv;w++) {
				MGraph->arr[v][w]=0;
			}
		}
		return MGraph;
	}
	//建立完整图
	//由键盘输入数据
	GNode* buildGraph() {
		GNode* MGraph = new GNode;
		ENode* Edge = new ENode;

		int Nv,i;
		cout<<"input --Nv: ";
		cin>>Nv;

		MGraph = creatGraph(Nv);
		cout<<"input Ne: ";
		cin>>MGraph->Ne;

		if(MGraph->Ne != 0) {
			for(i=0;i<MGraph->Ne;i++) {
				cout<<"input two dd: ";
				cin>>Edge->v1>>Edge->v2;
				insertEdge(MGraph,Edge);
			}
		}
		return MGraph;
	}
	//DFS搜索图
	void DFSGraph(GNode* MGraph,int i) {
		int j;
		cout<<i<<"--";
		visited[i] = true;

		for(j=0;j<MGraph->Nv;j++){
			if(MGraph->arr[i][j]==1 && !visited[j]) {DFSGraph(MGraph,j);}
		}
	}
	//BFS搜索图
	void BFSGraph(GNode* MGraph) {
		queue<int> q;
		q.push(0);	//从顶点0开始遍历
		int tmp;
		
		while(!q.empty()) {
			tmp = q.front();q.pop();
			cout<<tmp<<"--";
			visited[tmp]=true;
			
			for(int i=0;i<MGraph->Nv;i++) {
				if(MGraph->arr[tmp][i]==1 && !visited[i]) {q.push(i);}
			}
		}
	}
};

int main() {
	GNode* MGraph;
	graphSolution s;
	MGraph = s.buildGraph();

	//遍历之前要初始化一下visited
	s.visited.assign(MGraph->Nv, false);
	s.DFSGraph(MGraph, 0);	//从顶点0开始遍历

	s.visited.assign(MGraph->Nv, false);
	s.BFSGraph(MGraph);		

	return 0;
}

邻接表表示图结构,LGraph是指向图结点的指针

/*邻接表来表示图
 *G[N]为指针数组,数组元素每一指针对应矩阵每行一个链表,只存非0元素
 */

//列表结点
struct LinkNode {		
	int v;				//顶点下标
	int weight=1;		//边权重
	LinkNode* next;
};

//图结点
struct GNode {			//图结点
	int Nv,Ne;
	vector<LinkNode*> arr;
};


class graphSolution {
public:
	vector<bool> visited;

	//建立图(建立无边图 + 填入数据 )
	GNode* buildGraph() {		 
		GNode* LGraph;
		LinkNode *p1, *p2;
		LGraph = new GNode;
		
		int Nv,Ne;
		cout<<"input Nv: ";
		cin>>Nv;
		cout<<"input Ne: ";
		cin>>Ne;
		
		LGraph->Nv = Nv;
		LGraph->Ne = Ne;
		LGraph->arr.assign(Nv,NULL);
		
		for(int i=0;i<Ne;i++) {
			p1 = new LinkNode;
			p2 = new LinkNode;
			
			cout<<"input two dd: ";
			cin>>p1->v;
			cin>>p2->v;
			
			//创建无向图
			p2->next = LGraph->arr[p1->v];
			LGraph->arr[p1->v] = p2;
			p1->next = LGraph->arr[p2->v];
			LGraph->arr[p2->v] = p1;
		}
		return LGraph;
	}
	
	//展示邻接表的内容
	void showLGraph(GNode* LGraph) {
		LinkNode* P;
		for(int i=0;i<LGraph->Nv;i++) {
			p = LGraph->arr[i];
			cout<<i<<"--";
			while(p!=NULL) {
				cout<<p->v<<"--";
				p = p->next;
			}
			cout<<endl;
		}
	}
	
	//DFS遍历邻接表图
	void DFSLGraph(GNode* LGraph, int i) {
		LinkNode* p;
		p = LGraph->arr[i];
		
		while(p!=NULL) {
			if(visited[p->v]==false) {
				cout<<p->v<<"--";
				visited[p->v]=true;
				DFSLGraph(LGraph,p->v);
			}
			p = p->next;
		}
	}
	
	//BFS遍历邻接表图
	void BFSLGraph(GNode* LGraph) {
		queue<LinkNode*> q;
		LinkNode *p,*p2;
		
		p=LGraph->arr[0];		//先输出0顶点
		cout<<0<<"--";
		visited[0]=true;
		
		while(p!=NULL) {		//填充队列
			q.push(p);
			p=p->next;
		}
		
		while(!q.empty()) {
			p=q.front();q.pop();
			cout<<p->v<<"--";
			visited[p->v]=true;
			p2=LGraph->arr[p->v];
			while(p2!=NULL) {
				if(visited[p2->v]==false) {q.push(p2);}
				p2=p2->next;
			}
		}
	}
};

int main() {
//	cout<<"start28"<<endl;
	GNode* LGraph;
	graphSolution s;

	LGraph = s.buildGraph();
	s.showLGraph(LGraph);

	s.visited.assign(LGraph->Nv, false);
	s.DFSLGraph(LGraph, 0);

	cout<<endl;
	s.visited.assign(LGraph->Nv, false);
	s.BFSLGraph(LGraph);


	cout<<endl<<"success";

	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++数据结构遍历有两种方法:深度优先遍历和广度优先遍历。 深度优先遍历DFS)是一种用于遍历或搜索树或的算法。在这种搜索方法中,从根结点开始,尽可能深地搜索每个分支,直到找到目标值或达到叶子结点。然后回溯到前一个结点,继续搜索下一个分支。具体实现可以使用递归或栈来实现。 以下是使用邻接矩阵和邻接表两种数据结构实现深度优先遍历C++代码: 邻接矩阵实现深度优先遍历: ```c++ const int Max_Num = 100; bool visited[Max_Num];//全局变量 void Adj_matrix::DFS(int x)//深度优先遍历递归 { cout << vexs[x] << endl; visited[x] = true; for (int i = 0; i < vexnum; i++)//遍历邻接矩阵中X的行 { if (arcs[x][i] == 1 && !visited[x])//邻接矩阵中的值为1,且节点未被访问 { DFS(i);//递归 } } } void Adj_matrix::DFSTraverse()//深度优先遍历 { for (int i = 0; i < vexnum; i++) visited[i] = false;//把数组初始化 int s; cin >> s;//输入起始点 DFS(s);//执行递归算法 } ``` 邻接表实现深度优先遍历: ```c++ const int Max_Num = 100; bool visited[Max_Num];//全局变量 void ADList::DFS(int x)//深度优先遍历的递归调用 { cout << adlist[x].data;//输出节点信息 visited[x] = true;//把节点设置为已访问 table_node* p = adlist[x].firstarc;//用一个指针指向该顶点的弧链表 while (p != NULL)//如果该节点的弧链表不为空 { if (!visited[p->adjvex])//该弧顶点如果未访问的话 DFS(p->adjvex);//遍历该顶点 p = p->nextarc;//指向下一个链表节点 } } void ADList::DFSTraverse()//深度优先遍历 { for (int i = 0; i < vexnum; i++) visited[i] = false; int s; cin >> s;//输入起始点 DFS(s);//执行递归算法 } ``` 广度优先遍历BFS)是一种用于遍历或搜索树或的算法。在这种搜索方法中,从根结点开始,按照层次顺序逐层搜索每个分支,直到找到目标值或遍历完整个。具体实现可以使用队列来实现。 以下是使用邻接表数据结构实现广度优先遍历C++代码: ```c++ const int Max_Num = 100; bool visited[Max_Num];//全局变量 void ADList::BFSTraverse()//广度优先遍历 { for (int i = 0; i < vexnum; i++) visited[i] = false; int s; cin >> s;//输入起始点 queue<int> q; q.push(s);//把起始点入队 visited[s] = true;//把起始点设置为已访问 while (!q.empty())//队列不为空 { int x = q.front();//取出队首元素 q.pop();//弹出队首元素 cout << adlist[x].data;//输出节点信息 table_node* p = adlist[x].firstarc;//用一个指针指向该顶点的弧链表 while (p != NULL)//如果该节点的弧链表不为空 { if (!visited[p->adjvex])//该弧顶点如果未访问的话 { q.push(p->adjvex);//把该顶点入队 visited[p->adjvex] = true;//把该顶点设置为已访问 } p = p->nextarc;//指向下一个链表节点 } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值