图的深度、广度优先遍历

今天和小伙伴们分享我自己的深度优先遍历和广度优先遍历的代码,经自己调试没有察觉出错误,希望大家帮我调试一下,交流改进,共同进步

云共享:

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;

}


你可能感兴趣的:(遍历,图)