今天和小伙伴们分享我自己的深度优先遍历和广度优先遍历的代码,经自己调试没有察觉出错误,希望大家帮我调试一下,交流改进,共同进步。
云共享:
http://yunpan.cn/cAkX9wyZbmGU8 提取码 f7ed
#include<iostream>
#include<queue>// 引入标准模板库(STL)里的容器类—queue 类
using namespace std;
# define MAX_VEX_NUM 20
//宏定义图顶点的最大值
int visited[MAX_VEX_NUM];//给图结点设置访问标志
struct ArcNode//定义弧结构
{
int adjvex;//弧头的序号
ArcNode *nextarc;//指向下一条弧的指针
};
typedef struct VNode//定义顶点结构类型
{
char data;//顶点信息 如:a b c d
ArcNode *firstarc;//指向第一条依附于该顶点的弧的头指针它的nextarc才是第一个结点
}Adjlist[MAX_VEX_NUM];//创建了一个顶点类型的数组
struct ALGraph
{
Adjlist vertices;//创建了顶点数组用于存放所有顶点
int vexnum; //顶点数
int arcnum; //边数
};
class Graph
{
public:
ALGraph G;
Graph()
{
G.arcnum=0;
G.vexnum=0;
};
int locatevex(char v);//寻找顶点位置的下标
void Create_DG();//创建图
void DFS(int v);//深度优先遍历的递归部分
void DFSTraverse(char c);//对图 G 做深度优先遍历
int BFSTraverse();//广度遍历
};
int Graph::locatevex(char v)//寻找顶点位置的下标
{
int i=0;
while(i<G.vexnum && v!=G.vertices[i].data)
i++;
if(i<G.vexnum)
return i;
}
void Graph::Create_DG()//创建一个有向图图的邻接链表表示
{
cout<<"请输入图的顶点数:"<<endl;
cin>>G.vexnum;
cout<<"请输入图的弧数:"<<endl;
cin>>G.arcnum;
char v1; //弧的起点
char v2; //弧的终点
int v1locate; //弧的起点 v1 的存储的位置
int v2locate; //弧的起点 v2 的存储的位置
ArcNode * p;//弧指针
//以下的程序段为构造表头结点
for(int i=0;i<G.vexnum;i++)
{
cout<<"请输入第"<<i+1<<"个顶点的值"<<endl;
cin>>G.vertices[i].data;
G.vertices[i].firstarc=new ArcNode;
G.vertices[i].firstarc->nextarc=NULL;
}
//输入各弧并创建链表
for(int k=1;k<=G.arcnum;k++)
{
cout<<"请输入第"<<k<<"个弧的起点"<<endl;
cin>>v1;
v1locate=locatevex(v1);
cout <<"请输入第"<<k<<"个弧的终点"<<endl;
cin>>v2;
v2locate=locatevex(v2);
//以下类似于单链表的插入操作
p= new ArcNode;
p->adjvex=v2locate;
p->nextarc=NULL;
ArcNode* q=G.vertices[v1locate].firstarc;
while(q->nextarc!=NULL)
{
q=q->nextarc;
}
q->nextarc=p;
}
cout<<"该图的邻接表为"<<endl;
for(int k=0;k<G.vexnum;k++)
{
p=G.vertices[k].firstarc->nextarc;
cout<<k<<"\t"<<G.vertices[k].data;
while(p!=NULL)
{
cout<<"->"<<p->adjvex;
p=p->nextarc;
}
cout<<endl;
}
cout<<endl;
}//Create_DG
void Graph::DFS(int v)//从第 v 个顶点出发递归地深度优先遍历图 G
{
ArcNode *p;
visited[v]=1;
cout<<G.vertices[v].data<<" ";
p=G.vertices[v].firstarc->nextarc;
while(p)
{
if(!visited[p->adjvex])
DFS(p->adjvex);
p=p->nextarc;
}
}//DFS
void Graph::DFSTraverse(char c)//对图 G 做深度优先遍历
{
for(int i=0;i<G.vexnum;i++)
{
visited[i]=0;
}
int cl;
cl=locatevex(c);
DFS(cl);
for(int i=0;i<G.vexnum;i++)
{
if(!visited[i])
DFS(i);
}
}//DFSTraverse
int Graph::BFSTraverse()//无向图广度优先遍历
{
ArcNode *p;
queue<int>q; //定义一个存放 int 型元素的空队 q
for(int i = 0;i < G.vexnum;i++) //访问数组初始化
visited[i]=0;
int v;
/*while(!q.empty())
{q.pop();}*/
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
{
visited[v]=1;
cout<<G.vertices[v].data<<" ";
q.push(v);
while(!q.empty())
{
v=q.front();
q.pop();
p=G.vertices[v].firstarc->nextarc;
while(p)
{
if(!visited[p->adjvex])
{
visited[p->adjvex]=1;
cout<<G.vertices[p->adjvex].data<<" ";
q.push(p->adjvex);
}
p=p->nextarc;
}
}
}
}
return 1;
}//BFSTraverse
int main()
{
char a;
Graph G;
G.Create_DG();
cout<<"输入图深度遍历的起点"<<endl;
cin>>a;
cout<<"深度优先遍历"<<endl;
G.DFSTraverse(a);
cout<<endl;
cout<<"广度优先遍历"<<endl;
G.BFSTraverse();
cout<<endl;
system("pause");
return 0;
}