数据结构——图的遍历——邻接矩阵 深度优先遍历《递归》和《非递归》

/****深度优先 非递归算法***/——————————运行环境 DEV– C++5.0

#include<iostream>
using namespace std;
const int maxsize=20;
template<class T>
class MGraph
{
      public:
             MGraph(T a[],int n,int e);//够着函数
             ~MGraph(){}
             /*T getvex(int i);
             void putvex(int i,T value);
             void insertvex(int i,T value);
             void Deletevex(int i);
             void insertarc(int i,int j);
             void Deletearc(int i,int j);*/
             void dfstraverse(int v);//深度优先遍历
             void bfstraverse(int v);//广度优先遍历
      private:
              T vertex[maxsize];//结点的信息
              int arc[maxsize][maxsize];//存储边的信息,有边为1
              int vertexnum,arcnum;//结点数目,边的条数
};

template<class T>
MGraph<T>::MGraph(T a[],int n,int e)
{
   int i,j,k;
   vertexnum=n;arcnum=e;
   for(i=0;i<vertexnum;i++)
   vertex[i]=a[i];
   for(i=0;i<vertexnum;i++)
   for(j=0;j<vertexnum;j++)
   arc[i][j]=0;
   cout<<“边的信息”<<endl;
   for(k=0;k<arcnum;k++)
   {
    cout<<“第”<<k+1<<“条边”;
     cin>>i>>j;
     arc[i][j]=1;
     arc[j][i]=1;
   }
}
template<class T>
void MGraph<T>::dfstraverse(int v)//从第V个位置开始遍历
{
     int j,top;
     int stack[vertexnum],visited[vertexnum];//stack是定义的堆栈,visited是用来纪律结点是否被访问,访问值为1
     cout<<vertex[v];//输出第V的结点的信息

   top=-1;//初始堆栈栈顶

  visited[v]=1;//第v个结点被访问
     stack[++top]=v;//入栈
     j=0;
     while(top!=-1)//栈为空,遍历结束
     {
       if(arc[v][j]==1&&visited[j]!=1)//遍历未被访问的结点,并入栈
       {
         cout<<vertex[j];
         stack[++top]=j;
         visited[j]=1;
         j=0;
       }
        j++;
        if(j==vertexnum||visited[v]==1)//出栈和取栈顶的条件
        {

             v=stack[top];//深度遍历的下一个结点已经在栈顶
            if(j==vertexnum)//栈顶变化的条件
            {
            top–;

            j=0;//栈顶变化后,j也变化
            }    
        }
       }
}
template<class T>
void MGraph<T>::bfstraverse(int v)
{
     int front,rear,j,visited[vertexnum];
     int q[100];
     front=rear=-1;
     cout<<vertex[v];visited[v]=1;q[++rear]=v;
     while(front!=rear)
     {
       v=q[++front];
       for(j=0;j<vertexnum;j++)
       if(arc[v][j]==1&&visited[j]!=1)
       {cout<<vertex[j];
       visited[j]=1;
       q[++rear]=j;}
     }
}

/***深度优先 递归****/

template<class T>
void MGraph<T>::dfstraverse(int v)
{
     int j,top;
     cout<<vertex[v];
     vs[v]=1;
     for(j=0;j<vertexnum;j++)
     if(arc[v][j]==1&&vs[j]!=1)dfstraverse(j);
  }

/***主函数***/

int main()
{   char a[10];
    int n;
    int e,i;
    cout<<“结点数目 和 边得条数”;
    cin>>n>>e;
    cout<<“结点信息”;
    for(i=0;i<n;i++)
    cin>>a[i];
    MGraph<char> s(a,n,e);
     cout<<endl<<“广度优先遍历”;
    s.bfstraverse(0);
      cout<<endl<<“深度优先遍历”;
    s.dfstraverse(0);
    system(“pause”);
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/zty381309501/article/details/6502324
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞