m0_74365246 2022-10-18 16:59 采纳率: 0%
浏览 116
已结题

通信网中的算法问题—深入优先算法和广度优先算法

实验名称:(用C语言实现)
通信网中的算法问题—深入优先算法和广度优先算法(节点遍历)

实验内容:
1、以任意节点为起点,利用深度优先搜索算法,计算附图的遍历顺序并打印输出(是否可以用2种不同的实现方法);
2、以任意节点为起点,利用广度优先搜索算法,计算附图的遍历顺序并打印输出(是否可以用2种不同的实现方法);

注意:
1、请转换附件的图形为输入数据格式(附在实验报告上);
2、请打印的时候把节点编号、节点名称按照遍历的顺序打印.

具体显示内容:
1、节点数**
2、节点编号及名称**
3、边数**
4、深度优先搜索结果:(例如:1、重庆;4、上海)
5、广度优先搜搜结果:

6、是连通图,所有节点都遍历;
不是连通图,**节点无法遍历;

img

  • 写回答

1条回答 默认 最新

  • 吕布辕门 新星创作者: 后端开发技术领域 2022-10-19 16:53
    关注

    参考一下

    #include
    
    #include
    
    #include
    
    #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
    
    {
    
    for (j=0;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
    
    {
    
    printf("输入NO.%d标志(一个字符):",i+1);
    
    scanf("%c",&sign[i]);
    
    getchar();
    
    }
    
    printf("请输入边(用逗号分开,例如:a,b):");
    
    for (i=0;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
    
    {
    
    if (a==sign[i])
    
    {
    
    a_num=i;
    
    break;
    
    }
    
    }
    
    for (i=0;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
    
    {
    
    printf("%-2c",sign[j]);
    
    }
    
    printf("\n");
    
    for (i=0;i
    
    {
    
    printf("%-2c",sign[i]);
    
    for (j=0;j
    
    {
    
    printf("%-2d",graph[i][j]);
    
    }
    
    printf("\n");
    
    }
    
    }
    
    void DFS(char a)
    
    {
    
    int i,a_num,j,repect;
    
    for (i=0;i
    
    {
    
    if (a==sign[i])
    
    {
    
    a_num=i;
    
    break;
    
    }
    
    }
    
    in_stack(a_num);
    
    for (j=0;j<30;j++)
    
    {
    
    for(i=0;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
    
    {
    
    if (a==sign[i])
    
    {
    
    a_num=i;
    
    break;
    
    }
    
    }
    
    in_queue(a_num);
    
    for (j=0;j<30;j++)
    
    {
    
    for(i=0;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");
    
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月24日
  • 创建了问题 10月18日