DFS BFS代码

#define maxnum 30

#include<bits_stdc++.h>

int visited[maxnum]={0};

using namespace std;

typedef struct bian//边

{

    int mark;//标记是否搜索

    int ivex,jvex;//两顶点位置

    bian *ilink,*jlink;//指向两顶点的其他边

    int info;//信息

} bian,*pbian;

typedef struct dian//点

{

    char name;

    bian *first;//指向边

} dain;

typedef struct graph//图

{

    dian dj[maxnum];

} graph;

typedef struct//队列

{

    int base[maxnum];

    int f;//front

    int r;//rear

}que;

void initq(que &q)//初始化队列

{

    q.f=q.r=0;

}

void enq(que &q,int e)//队尾插入

{

    q.base[q.r]=e;

    q.r=q.r+1;

}

void deq(que &q,int &e)//队头删除

{

    e=q.base[q.f];

    q.f=q.f+1;

}

int getlc(graph &g,char c,int n)//将顶点信息转化为位置

{

    for(int i=0; i<n; i++)

        if(c==g.dj[i].name)

      return i;

}

void creatgraph(graph &g,int &n)//图的创建

{

    int k,m;

    cout<<"请输入图顶点个数:"<<endl;

    cin>>n;

    cout<<endl<<"请输入顶点信息(名称):"<<endl;

    for(k=0; k<n; k++)

    {

        cin>>g.dj[k].name;

        g.dj[k].first=NULL;

    }

    cout<<endl<<"请输入边个数:"<<endl;

    cin>>m;

    char a,b;

   int mark,i,j;

   pbian p1,p2;

    cout<<endl<<"请输入边关系:"<<endl;

    for(k=0; k<m; k++)

    {

        cin>>a>>b;

        i=getlc(g,a,n);

        j=getlc(g,b,n);

        p1=(pbian)malloc(sizeof(bian));

        p1->ivex=i;

        p1->jvex=j;

        p1->ilink=NULL;

        p1->jlink=NULL;

        p2=g.dj[i].first;

        if(p2==NULL)

          g.dj[i].first=p1;

        else

        {

            mark=0;

            while(mark==0)

            {

                if(p2->ivex==i&&p2->ilink==NULL) mark=1;

                else if(p2->jvex==i&&p2->jlink==NULL) mark=2;

                else if(p2->ivex==i) p2=p2->ilink;

                else p2=p2->jlink;

            }

            if(mark==1) p2->ilink=p1;

            else p2->jlink=p1;

        }

        p2=g.dj[j].first;

        if(p2==NULL)

            g.dj[j].first=p1;

        else

        {

            mark=0;

            while(mark==0)

            {

                if(p2->ivex==j&&p2->ilink==NULL) mark=1;

                else if(p2->jvex==j&&p2->jlink==NULL) mark=2;

                else if(p2->ivex==j) p2=p2->ilink;

                else p2=p2->jlink;

            }

            if(mark==1) p2->ilink=p1;

            else p2->jlink=p1;

        }

   }

}

void disp(graph &g,int n)//显示对应关系

{

    cout<<"位置     名称"<<endl;

    for(int i=0; i<n; i++)

        cout<<i<<"        "<<g.dj[i].name<<endl;

}

void visit(graph &g,int v)//visit 函数

{

    cout<<g.dj[v].name;

    visited[v]=1;

}

void dfs(graph &g,int i)//dfs

{

    if(visited[i]==0)

    visit(g,i);

    bian *p;

    p=g.dj[i].first;

    if(p==NULL)return ;

    else

    {

        int m=0;

        while(m==0)

        {

            if(p->ivex==i)

            {

                if(visited[p->jvex]==0)

                {

                    dfs(g,p->jvex);

                }

                if(p->ilink==NULL)m=1;

                else p=p->ilink;

            }

            else

            {

                if(visited[p->ivex]==0)

                {

                    dfs(g,p->ivex);

                }

                if(p->jlink==NULL)m=1;

                else p=p->jlink;

            }

        }//while

    }//else

}

void bfs(graph &g)//bfs

{

    int i,u;

    bian *t;

    cout<<"请输入开始遍历的点:"<<endl;

    cin>>i;

    que q;//队列q

    initq(q);

    if(visited[i]==0)

        {

            visit(g,i);

            enq(q,i);

        }

            while(q.f!=q.r)//队不空

            {

            deq(q,u);

            t=g.dj[u].first;

            if(t==NULL)return;

            int m=0;

            while(m==0)

            {

              if(t->ivex==u)

              {

                if(visited[t->jvex]==0)

                {

                    visit(g,t->jvex);

                    enq(q,t->jvex);

                }

                if(t->ilink==NULL)m=1;

                else t=t->ilink;

             }

              else

              {

                if(visited[t->ivex]==0)

                {

                    visit(g,t->ivex);

                    enq(q,t->ivex);

                }

                if(t->jlink==NULL)m=1;

                else t=t->jlink;

              }

            }//while

            }//while

}

void clearr()

{

    for(int i=0;i<maxnum;i++)

    {

        visited[i]=0;

    }

}

int main()

{

    graph g;

    int t=0;

    int n;

    creatgraph(g,n);

   disp(g,n);

    while(t!=3)

    {

        cout<<endl<<"请选择遍历方式(1:DFS,2:BFS,3:QUIT):"<<endl;

        cin>>t;

        if(t==1)

        {

            dfs(g,0);

            clearr();

        }

        else if(t==2)

            {

                bfs(g);

                clearr();

            }

        else if(t==3)

           break;

    }

    return 0;

}

 

posted @ 2018-02-12 09:34  夜游星  阅读(533)  评论(0编辑  收藏  举报