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

#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");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值