图的深搜广搜


//图 存顶点 存边 存顶点数 存边数
//用临接表存储
#include <iostream>

typedef struct bian
{
    int j;
    struct bian* next;
};
//每一个点存储自己的边表,每个点最多10条边
typedef struct dian
{
    char a;
    bian* bianbiao ;
};
//图存储边数,点数,以及点的集合,最多20个点
typedef struct graph
{
    int n,e;
    struct dian dianbiao[20];
};


struct graph mygraph;
int visited[20];
void buildgraph()
{
    for(int i = 0;i<20;i++)
        visited[i]=0;
    printf("请输入边数和点数\n");
    scanf("%d %d",&mygraph.e,&mygraph.n);
    getchar();
    //printf("请输入点的名字\n");
    for(int i = 0;i<mygraph.n;i++)
    {
        scanf("%c",&mygraph.dianbiao[i].a);
        getchar();
        mygraph.dianbiao[i].bianbiao= NULL;
    }
    //printf("请输入边的编号");
    int i,jj;
    //设成有向边
    for(int t = 0;t<mygraph.e;t++)
    {
        scanf("%d %d",&i,&jj);
        //加入链表
        bian* newbian = (bian*)malloc(sizeof(bian));
        newbian->j = jj;
        newbian->next = mygraph.dianbiao[i].bianbiao;
        mygraph.dianbiao[i].bianbiao = newbian;
    }
    return;
}
//参数为点的序号
void dfs(int i)
{
    //输出本身的值
    if(visited[i]==0)
    {
        printf("%c ",mygraph.dianbiao[i].a);
        visited[i] = 1;
        while(mygraph.dianbiao[i].bianbiao!=NULL)
        {
            dfs(mygraph.dianbiao[i].bianbiao->j);

            mygraph.dianbiao[i].bianbiao = mygraph.dianbiao[i].bianbiao->next;
            if(mygraph.dianbiao[i].bianbiao !=NULL)
                dfs(mygraph.dianbiao[i].bianbiao->j);

        }
    }
    
}

typedef struct queue
{
    dian queuedata[100];
    int front;
    int rear;
};
queue myqueue;

void init()
{
    myqueue.front = 0;
    myqueue.rear = 0;

    for(int i = 0;i<100;i++)
    {
        myqueue.queuedata[i].a = NULL;
        myqueue.queuedata[i].bianbiao = NULL;
    }
    return ;
}
void inqueue(dian * _dian)
{
    if(myqueue.front == 100)
        exit(1);
    myqueue.queuedata[myqueue.front].a = _dian->a;
    myqueue.queuedata[myqueue.front].bianbiao = _dian->bianbiao;
    myqueue.front++;
    return;
}
bool isEmpty()
{
    return myqueue.front == myqueue.rear;
}
dian* outqueue()
{
    dian* ret;
    if(myqueue.rear<myqueue.front)
    {
        ret = &(myqueue.queuedata[myqueue.rear]);
        myqueue.rear++;
    }
    
    return ret;
}
void bfs()
{
    inqueue(&(mygraph.dianbiao[0]));
    visited[0] = 1;
    dian *temp;
    while(isEmpty()==0)
    {
        temp = outqueue();
        printf("%c ",temp->a);
 
        while(temp->bianbiao!=NULL)
        {
            if(visited[temp->bianbiao->j]==0)
            {
                inqueue(&(mygraph.dianbiao[temp->bianbiao->j]));
                visited[temp->bianbiao->j] = 1;
                temp->bianbiao = temp->bianbiao->next;
            }
            else
                temp->bianbiao = temp->bianbiao->next;
        }
    }
}
int main()
{
    buildgraph();
    //深搜
    /*for(int i = 0;i<mygraph.n;i++)
    {
        if(visited[i]==0)
        dfs(i);
    }*/
    
    //广搜
    bfs();
    return 0;
}

//测试数据
//8 6
//a b c d e f
//0 1
//0 5
//0 4
//1 5
//1 2
//3 2
//3 5
//4 3



原文地址:https://www.cnblogs.com/qingcheng/p/3113646.html