问题:还是指针的问题,在第一次遍历时,一定要用一个临时指针来指向图节点,不然等遍历玩指针为空,再用广度遍历算法就会失效。
广度遍历类似于树层次遍历,只是有顺序,因此用到了队列。再次证明了STL的强大和方便。
代码:
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;
#define MAXV 20
typedef struct edgeNode
{
int data;
struct edgeNode *next;
}edgeList;
typedef struct headNode
{
char vex;
edgeList *firstNode;
}headList;
typedef struct graph //定义邻接表结构
{
headList arr[MAXV];
int v,e;
}*adjGraph;
void createAdjGraph(adjGraph &ag)
{
char c;
int p,q;
edgeList *s;
cout<<"please input the num of v and e:";
cin>>ag->v>>ag->e;
for(int i=0;i<ag->v;i++) //初始化头节点
{
cout<<"please input vex:";
cin>>c;
ag->arr[i].vex=c;
ag->arr[i].firstNode=NULL;
}
for(int j=0;j<ag->e;j++)
{
cout<<"please input two vexs:";
cin>>p>>q;
s=(edgeList *)malloc(sizeof(struct edgeNode));
s->data=p;
s->next=ag->arr[q].firstNode;
ag->arr[q].firstNode=s;
}
}
void showAdjGraph(adjGraph ag)
{
edgeList* s;
for(int i=0;i<ag->v;i++)
{
cout<<ag->arr[i].vex<<" ";
s=ag->arr[i].firstNode;
while(s!=NULL)
{
cout<<s->data<<" ";
s=s->next;
}
cout<<endl;
}
delete s;
}
void BFSTraveral(adjGraph ag)
{
int visited[MAXV];
int k;
queue<int> q;
edgeList *el;
el=(edgeList*)malloc(sizeof(struct edgeNode));
for(int i=0;i<ag->v;i++)
{
visited[i]=0;
}
for(int i=0;i<ag->v;i++)
{
if(visited[i]==0)
{
visited[i]=1;
cout<<ag->arr[i].vex<<"->";
q.push(i);
while(!q.empty())
{
k=q.front();
q.pop();
el=ag->arr[k].firstNode;
// cout<<"hello world";
while(el)
{
// cout<<"hello world";
if(visited[el->data]==0)
{
visited[el->data]=1;
cout<<ag->arr[el->data].vex<<"->";
// cout<<"hello world";
q.push(el->data);
}
el=el->next;
}
cout<<endl;
}
}
}
free(el);
}
int main()
{
adjGraph ag;
ag=(adjGraph)malloc(sizeof(struct graph));
cout<<"创建有向图:"<<endl;
createAdjGraph(ag);
cout<<"输出有向图"<<endl;
showAdjGraph(ag);
cout<<"广度遍历有向图:"<<endl;
BFSTraveral(ag);
return 0;
}
运行截图: