邻接表实现无向图的深度和广度遍历

/*/*
DFS深度优先遍历邻接表
*/
#include <iostream>
#include <malloc.h>
using namespace std;
#define  MAX    20
typedef  struct e_node//表节点
{
    int vex;//索引值
    struct  e_node *next;
}*enode;

typedef  struct v_node//头节点
{
    int data;
    struct  e_node *next;
}head,*vnode;

typedef  struct  G_list//图的邻接表
{
    head  lead[MAX];//存放头节点
    int   vexnum,arcnum;//节点数,弧数
}*graph;

int get_pos(graph map,char in)//失败返回-1
{
    for(int i=0;i<map->vexnum;i++)
    {
        if(in==map->lead[i].data)return i;
    }
    return -1;
}
void link_last(enode list,enode node)
{
    while(list->next)
    {
        list=list->next;
    }
    list->next=node;
}
/*用户输入创建图*/
graph creat_graph()
{
    int vex,arc;
    char temp;
    char in1,in2;
    int  p1,p2;
    graph  map;
    cout<<"请输入顶点数:"<<endl;
    cin>>vex;
    cout<<"请输入弧数:"<<endl;
    cin>>arc;

    map=(graph)malloc(sizeof(G_list));
    memset(map,0,sizeof(sizeof(G_list)));

    //初始化
    map->arcnum=arc;
    map->vexnum=vex;
    //////////////////
    //初始化邻接表的顶点
    for(int i=0;i<vex;i++)
    {
        printf("请输入lead[%d]\n",i);
        cin>>temp;
        map->lead[i].data=temp;
        map->lead[i].next=NULL;
    }
    //初始化弧
    for(int j=0;j<arc;j++)
    {
        cout<<"输入边弧:"<<endl;
        cin>>in1>>in2;
        p1=get_pos(map,in1);
        p2=get_pos(map,in2);
        enode arc_side1=(enode)malloc(sizeof(e_node));
        arc_side1->vex=p1;
        arc_side1->next=NULL;

        if(map->lead[p2].next==NULL)//空的话
            map->lead[p2].next=arc_side1;
        else
            link_last(map->lead[p2].next,arc_side1);

        enode arc_side2=(enode)malloc(sizeof(e_node));
        arc_side2->vex=p2;
        arc_side2->next=NULL;

        if(map->lead[p1].next==NULL)//空的话
            map->lead[p1].next=arc_side2;
        else
            link_last(map->lead[p1].next,arc_side2);
    }
    return map;
}
void  DFS(graph map,int i,int *visit)
{
    enode node;
    visit[i]=1;//标志
    cout<<(char)map->lead[i].data<<" ";
    node=map->lead[i].next;
    while(node!=NULL)//邻接表有元素
    {
        if(visit[node->vex]==0)//尚未遍历
        {
            DFS(map,node->vex,visit);
        }//如果遍历
        node=node->next;
    }

}
void BFS(graph map,int *visit)
{
    int head,rear;
    int quene[MAX];
    int k,temp,var;
    head=rear=0;
    enode node;
    for(int j=0;j<map->vexnum;j++)
    {
        if(visit[j]==0)
        {
            visit[j]=1;
            cout<<(char)map->lead[j].data<<" ";
            quene[rear++]=j;
        }
        while(head!=rear)
        {
            k=quene[head++];//出队
            node=map->lead[k].next;
            while(node!=NULL)
            {
                var=node->vex;
                if(visit[var]==0)
                {
                    visit[var]=1;
                    cout<<(char)map->lead[var].data<<" ";
                    quene[rear++]=var;
                }
                node=node->next;
            }

        }

    }





}
void main()
{
    int  visit[MAX];
    memset(visit,0,sizeof(visit));
    graph map=creat_graph();//创建图
    //DFS(map,0,visit);

    cout<<"BFS:"<<endl;
    BFS(map,visit);

}

 

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