【问题描述】
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;
}