数据结构–邻接表或邻接矩阵做广度优先遍历
1、邻接表的遍历
【代码】:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MaxVertexNum 50
typedef struct node
{
int adjvex;
struct node *next;
} EdgeNode;
typedef struct vnode
{
char vertex;
EdgeNode *firstedge;
} VertexNode;
typedef VertexNode AdjList[MaxVertexNum];
typedef struct
{
AdjList adjlist;
int n,e;
} ALGraph;
void CreatALGraph(ALGraph *G)
{
int i,j,k;
char a;
EdgeNode *s;
cout<<"Input VertexNum(n) and EdgesNum(e): ";
cin>>G->n>>G->e;
fflush(stdin);
cout<<"Input Vertex string:";
for(i=0; i<G->n; i++)
{
cin>>a;
G->adjlist[i].vertex=a;
G->adjlist[i].firstedge=NULL;
}
cout<<"Input edges,Creat Adjacency List"<<endl;
for(k=0; k<G->e; k++)
{
cin>>i>>j;
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s;
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=i;
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s;
}
}
typedef enum {FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];
void DFSM(ALGraph *G,int i)
{
EdgeNode *p;
cout<<G->adjlist[i].vertex;
visited[i]=TRUE;
p=G->adjlist[i].firstedge;
while(p)
{
if(! visited[p->adjvex])
DFSM(G,p->adjvex);
p=p->next;
}
}
void DFS(ALGraph *G)
{
int i;
for(i=0; i<G->n; i++)
visited[i]=FALSE;
for(i=0; i<G->n; i++)
if(!visited[i])
DFSM(G,i);
}
void BFS(ALGraph *G,int k)
{
int i,f=0,r=0;
EdgeNode *p;
int cq[MaxVertexNum];
for(i=0; i<G->n; i++)
visited[i]=FALSE;
for(i=0; i<=G->n; i++)
cq[i]=-1;
cout<<G->adjlist[k].vertex;
visited[k]=TRUE;
cq[r]=k;
while(cq[f]!=-1)
{
i=cq[f];
f=f+1;
p=G->adjlist[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
{
cout<<G->adjlist[p->adjvex].vertex;
visited[p->adjvex]=TRUE;
r=r+1;
cq[r]=p->adjvex;
}
p=p->next;
}
}
}
int main()
{
ALGraph *G;
G=(ALGraph *)malloc(sizeof(ALGraph));
CreatALGraph(G);
cout<<"Print Graph DFS: "<<endl;
DFS(G);
printf("\n");
cout<<"Print Graph BFS: "<<endl;
BFS(G,3);
printf("\n");
system ("pause");
}
【运行结果】
2、邻接矩阵的遍历
【代码】:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MaxVertexNum 100
typedef struct
{
char vexs[MaxVertexNum];
int edges[MaxVertexNum][MaxVertexNum];
int n,e;
} MGraph;
void CreatMGraph(MGraph *G)
{
int i,j,k;
char a;
cout<<"Input VertexNum(n) and EdgesNum(e): ";
cin>>G->n>>G->e;
cin>>a;
cout<<"Input Vertex string: ";
for(i=0; i<G->n; i++)
{
cin>>a;
G->vexs[i]=a;
}
for(i=0; i<G->n; i++)
for(j=0; j<G->n; j++)
G->edges[i][j]=0;
cout<<"Input edges,Creat Adjacency Matrix"<<endl;
for(k=0; k<G->e; k++)
{
cin>>i>>j;
G->edges[i][j]=1;
G->edges[j][i]=1;
}
}
typedef enum {FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];
void DFSM(MGraph *G,int i)
{
int j;
cout<<G->vexs[i];
visited[i]=TRUE;
for(j=0; j<G->n; j++)
if(G->edges[i][j]==1 && ! visited[j])
DFSM(G,j);
}
void DFS(MGraph *G)
{
int i;
for(i=0; i<G->n; i++)
visited[i]=FALSE;
for(i=0; i<G->n; i++)
if(!visited[i])
DFSM(G,i);
}
void BFS(MGraph *G,int k)
{
int i,j,f=0,r=0;
int cq[MaxVertexNum];
for(i=0; i<G->n; i++)
visited[i]=FALSE;
for(i=0; i<G->n; i++)
cq[i]=-1;
cout<<G->vexs[k];
visited[k]=TRUE;
cq[r]=k;
while(cq[f]!=-1)
{
i=cq[f];
f=f+1;
for(j=0; j<G->n; j++)
if(!visited[j] && G->edges[i][j]==1)
{
cout<<G->vexs[j];
visited[j]=TRUE;
r=r+1;
cq[r]=j;
}
}
}
int main()
{
MGraph *G;
G=(MGraph *)malloc(sizeof(MGraph));
CreatMGraph(G);
cout<<"Print Graph DFS: "<<endl;
DFS(G);
cout<<endl;
cout<<"Print Graph BFS: "<<endl;
BFS(G,3);
cout<<endl;
system ("pause");
}
【运行结果】