图的建立和遍历例题(邻接表,DFS、BFS)

该程序实现了有向图的构建、深度优先遍历(DFS)和广度优先遍历(BFS)。首先,通过输入的顶点和边创建邻接表,然后分别进行DFS和BFS遍历,输出遍历序列。DFS遍历从第一个未访问的节点开始,而BFS遍历使用队列进行节点的层次遍历。
摘要由CSDN通过智能技术生成

【问题描述】

1、输入有向图的顶点和弧的数据,建立该有向图的邻接表,要求在链表插入时候使用头插入法;
2、实现该有向图的深度优先遍历,并输出结果;
3、实现该有向图的广度优先遍历,并输出结果;

4、遍历序列从输入的第一个结点开始。

【输入形式】
在这里插入图片描述

 对于如上所示的有向图,设置输入形式如下:

 5        //结点个数

 A B C D E//输入多个结点值,每个值之间用一个空格隔开

 6        //有向弧个数

 A B    //第1条边的弧尾和弧头,中间用一个空格隔开

 A C    //第2条边的弧尾和弧头,中间用一个空格隔开

 A D    //第3条边的弧尾和弧头,中间用一个空格隔开

 D E    //第4条边的弧尾和弧头,中间用一个空格隔开

 E C    //第5条边的弧尾和弧头,中间用一个空格隔开

 C B    //第6条边的弧尾和弧头,中间用一个空格隔开

【输出形式】输出图的深度优先遍历序列和图的广度优先遍历序列,每个字符之间用一个空格隔开。
【样例输入】

5
A B C D E
6
A B
A C
A D
D E
E C
C B
【样例输出】

A D E C B
A D C B E

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<queue>
#define MAXVEX 100
using namespace std;
typedef struct EdgeNode *Edge;
struct EdgeNode{	//边结点
	int adjvex;
	Edge next;
};
typedef struct VertexNode{	//点结点
	char data;
	Edge firstedge;
} AdjList[MAXVEX];
typedef struct{	//图
	AdjList adjList;
	int numNodes,numEdges;
} Graph;
void CreateGraph(Graph &g){		//图的建立
	cin>>g.numNodes;
	for(int i=0;i<g.numNodes;i++){
		cin>>g.adjList[i].data;
		g.adjList[i].firstedge=NULL;
	}
	cin>>g.numEdges;
	for(int i=0;i<g.numEdges;i++){
		char a,b;
		cin>>a>>b;
		Edge e1=(Edge)malloc(sizeof(EdgeNode));
		for(int j=0;j<g.numNodes;j++){
			if(g.adjList[j].data==a){
				e1->next=g.adjList[j].firstedge;
				g.adjList[j].firstedge=e1;
			}
			if(g.adjList[j].data==b){
				e1->adjvex=j;
			}
		}
	}
}
int visited[MAXVEX];
void DFS(Graph G,int i){
	Edge p;
	visited[i]=1;
	cout<<G.adjList[i].data<<' ';
	p=G.adjList[i].firstedge;
	while(p){
		if(!visited[p->adjvex]){
			DFS(G,p->adjvex);
		}
		p=p->next;
	}
}
void DFSTraverse(Graph G){
	int i;
	for(i=0;i<G.numNodes;i++){
		visited[i]=0;
	}
	for(i=0;i<G.numNodes;i++){
		if(!visited[i]){
			DFS(G,i);
		}
	}
	cout<<endl;
}
void BFSTraverse(Graph G){
	int i;
	queue<char> q;
	for(i=0;i<G.numNodes;i++){
		visited[i]=0;
	}
	for(i=0;i<G.numNodes;i++){
		if(!visited[i]){
			visited[i]=1;
			cout<<G.adjList[i].data<<' ';
			Edge e;
			e=G.adjList[i].firstedge;
			while(e){
			 	q.push(e->adjvex);
				 e=e->next; 
			} 
			while(!q.empty()){
				int index=q.front();
				q.pop();
				if(!visited[index]){
					visited[index]=1;
					cout<<G.adjList[index].data<<' ';
					e=G.adjList[index].firstedge;
					while(e){
			 			q.push(e->adjvex);
				 		e=e->next; 
					} 
				} 
			}
		}
	}
}
int main(){
	Graph G;
	CreateGraph(G);
	DFSTraverse(G);
	BFSTraverse(G);
	return 0;
}
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值