深度、广度优先遍历算法C实现

来源:互联网 发布:淘宝网触屏版下载 编辑:程序博客网 时间:2024/05/16 10:19
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXNODE 30//最大节点数int graph[MAXNODE][MAXNODE]={{0,1,1,0,0,0},{1,0,0,1,0,0},{1,0,0,0,0,1},\                        {0,1,0,0,1,0},{0,0,0,1,0,0},{0,0,1,0,0,0}};//默认无向图char sign[MAXNODE]={'a','b','c','d','e','f'};//默认节点标志int num_node=6,num_edge=7;//节点数 边数int queue[MAXNODE],stack[MAXNODE],stack_2[MAXNODE];//队列 栈int *end_queue=NULL,*end_stack=NULL,*end_stack_2=stack_2;//队列指针 栈指针void in_queue(int a);//入队函数int out_queue();//出队函数int insearch_queue(int i);//查找队列void display_queue();//显示队列void in_stack(int a);//入栈函数int out_stack();//出栈函数int insearch_stack(int i);//查找栈void display_stack();//显示栈void main(){/*  // There are  declarations!    void display_graph();//显示无向图    void init(int choose);//初始化函数    void build();//建立无向图    void DFS(char a);//深度优先    void BFS(char a);//广度优先*/    int i,j,k;    int choose;    char c;    while (choose!=1 && choose!=2)    {        printf("**********************************************************\n");        printf("    1、构建无向路径图   2、使用默认无向路径图  3、退出程序\n");        printf("**********************************************************\n");        printf("请选择:");        scanf("%d",&choose);        switch(choose)        {        case 1:            init(choose);            build();            break;        case 2:            init(choose);            break;        case 3:exit(0);            break;        default:printf("请输入1-3!\n");            break;        }    }    display_graph();    while (1)    {        printf("******************************************\n");        printf("    1、广度优先   2、深度优先  3、退出程序\n");        printf("******************************************\n");        printf("请选择:");        scanf("%d",&choose);        getchar();        switch(choose)        {        case 1:            printf("输入起点:");            scanf("%c",&c);            getchar();            BFS(c);            break;        case 2:            printf("输入起点:");            scanf("%c",&c);            getchar();            DFS(c);            break;        case 3:exit(0);            break;        default:printf("请输入1-3!\n");            break;        }    }}void init(int choose){    int i,j;    if (choose==1)    {        for (i=0;i<MAXNODE;i++)        {            for (j=0;j<MAXNODE;j++)            {                graph[i][j]=0;            }        }    }    for (i=0;i<20;i++)    {        queue[i]=-1;    }    for (i=0;i<20;i++)    {        stack_2[i]=stack[i]=-1;    }}void build(){    void link(char a,char b);//连接节点    int i,j;    char a,b;    printf("请输入顶点数,边数(用逗号分开,例如:8,5):");//输入节点数边数    scanf("%d,%d",&num_node,&num_edge);    getchar();    for (i=0;i<num_node;i++)//输入节点标志    {        printf("输入NO.%d标志(一个字符):",i+1);        scanf("%c",&sign[i]);        getchar();    }    printf("请输入边(用逗号分开,例如:a,b):");    for (i=0;i<num_edge;i++)//输入边    {        printf("输入第%d条边:",i+1);        scanf("%c,%c",&a,&b);        getchar();        printf("%c %c\n",a,b);        link(a,b);    }}void link(char a,char b){    int a_num,b_num,i;    for (i=0;i<num_node;i++)    {        if (a==sign[i])        {            a_num=i;            break;        }    }    for (i=0;i<num_node;i++)    {        if (b==sign[i])        {            b_num=i;            break;        }    }    graph[a_num][b_num]=1;    graph[b_num][a_num]=1;}void display_graph(){    int i,j;    printf("构建的无向图如下:\n  ");    for (j=0;j<num_node;j++)    {        printf("%-2c",sign[j]);    }    printf("\n");    for (i=0;i<num_node;i++)    {        printf("%-2c",sign[i]);        for (j=0;j<num_node;j++)        {            printf("%-2d",graph[i][j]);        }        printf("\n");    }}void DFS(char a){    int i,a_num,j,repect;    for (i=0;i<num_node;i++)//字母对应数字行    {        if (a==sign[i])        {            a_num=i;            break;        }    }    in_stack(a_num);    for (j=0;j<30;j++)    {        for(i=0;i<num_node;i++)        {            if(graph[*end_stack][i]==1)            {                if (insearch_stack(i)!=1)                {                    in_stack(i);                    i=-1;                }            }        }        if (out_stack()==1)        {            break;        }    }    printf("深度优先:");    for (i=0;stack_2[i]!=-1;i++)    {        printf("%c ",sign[stack_2[i]]);    }    printf("\n\n");}void BFS(char a){    int a_num,i,j,repect;    int *p;    for (i=0;i<num_node;i++)//找出字母对应行    {        if (a==sign[i])        {            a_num=i;            break;        }    }    in_queue(a_num);    for (j=0;j<30;j++)    {        for(i=0;i<num_node;i++)        {            if(graph[*end_queue][i]==1)            {                if (insearch_queue(i)!=1)                {                    in_queue(i);                }            }        }        if (out_queue()==1)        {            break;        }    }    p=queue;    printf("广度优先:");    for (i=num_node;i>0;i--)    {        printf("%c ",sign[*(p+i-1)]);    }    printf("\n\n");}void in_queue(int a){    int *p;    if (end_queue==NULL)    {        end_queue=queue;        *end_queue=a;    }    else    {        for (p=queue;*p!=-1;p++)        {        }        p--;        for (;;p--)        {            *(p+1)=*p;            if (p==queue)            {                *p=a;                break;            }        }        end_queue++;    }//    printf("in:");    //display_queue();}int out_queue(){    if (end_queue!=queue)    {        end_queue--;    //    printf("out:");    //    display_queue();        return 0;    }    else    {        end_queue=NULL;    //    printf("out:");    //    display_queue();        return 1;    }}int insearch_queue(int i){    int j;    for(j=0;j<20;j++)    {        if(i==queue[j])        {            return 1;        }    }    return 0;}void display_queue(){    int *p,i;    p=queue;    for (i=0;i<20;i++)    {        printf("%d ",*(p+i));    }    printf("\n");}void in_stack(int a){    *end_stack_2=a;    end_stack_2++;    if (end_stack==NULL)    {        end_stack=stack;        *end_stack=a;    //    printf("in:");    //    display_stack();    }    else    {        end_stack++;        *end_stack=a;    //    printf("in:");    //    display_stack();    }}int out_stack(){    if (end_stack!=stack)    {        *end_stack=-1;        end_stack--;    //    printf("out:");    //    display_stack();        return 0;    }    else    {        *end_stack=-1;        end_stack=NULL;    //    printf("out:");    //    display_stack();        return 1;    }}int insearch_stack(int i){    int j;    for(j=0;j<20;j++)    {        if(i==stack_2[j])        {            return 1;        }    }    return 0;}void display_stack(){    int *p,i;    p=stack;    for (i=0;i<20;i++)    {        printf("%d ",*(p+i));    }    printf("\n");}
0 0
原创粉丝点击