鱼C论坛

 找回密码
 立即注册
查看: 1663|回复: 1

[学习笔记] 图的遍历-广度优先

[复制链接]
发表于 2022-9-11 16:33:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 奥普瓯江 于 2022-9-11 17:01 编辑

原理:


备注:



代码:


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 9


  4. typedef struct list
  5. {
  6.     int data;
  7.     struct list *next;
  8. }list, *lists;

  9. typedef struct dack
  10. {
  11.     char litte;
  12.     int Blo;
  13.     list *happy;
  14. }dack;
  15. void get_list(list **happy);
  16. //void print_list(list *happy);
  17. void loop_list(dack OK[MAX]);
  18. void free_list(list *temp);

  19. void free_list(list *temp)      //释放
  20. {
  21.     if(!temp)
  22.     {
  23.         return;
  24.     }
  25.     free_list(temp->next);
  26.     free(temp);
  27. }

  28. void loop_list(dack OK[MAX])            //广度优先遍历
  29. {
  30.     list *temp;                 //临时变量
  31.     int i, S = 0;

  32.     for(int j = 0; j < MAX; j++)           //遍历每一个节点A-I
  33.     {
  34.         temp = OK[j].happy;                 //把赋予temp初始变量,这个初始变量是每个节点的初始变量A的初始变狼B的初始变量等等
  35.         i = j;
  36.         while(1)                            //循环每个节点后的变量
  37.         {
  38.             if(OK[i].Blo != 1)               //如果这个节点被打印过就不对该几点进行执行输出
  39.             {

  40.                 printf("%c", OK[i].litte);
  41.                 OK[i].Blo = 1;                //标记该节点证明其被输出过
  42.                 S++;
  43.                 if(S > MAX)                   //减少遍历次数,如果前几个节点已经全部遍历完整个图及结束函数,后面的节点就不用遍历了
  44.                 {
  45.                     return;
  46.                 }
  47.             }
  48.             if(temp == NULL)                  //如果该节点以执行到最后空的位置及跳出while循环
  49.             {
  50.                 break;
  51.             }
  52.             else
  53.             {
  54.                 i = temp->data;                 //未执行到连边最后的位置则将该位置链表所包含的数据传给i使得其继续循环
  55.             }
  56.             temp = temp->next;                  //链表向后循环
  57.         }
  58.     }
  59. }

  60. /*void print_list(list *happy)        //打印输出
  61. {
  62.     while(happy)
  63.     {
  64.         printf("%3d", happy->data);
  65.         happy = happy->next;
  66.     }
  67. }*/

  68. void get_list(list **happy)         //生成链表及顶点
  69. {
  70.     list *temp, *tail;

  71.     int A = 0;

  72.     while(1)
  73.     {
  74.         scanf("%d", &A);
  75.         if(A >= 0 && A <= 9)
  76.         {
  77.             temp = (list *)malloc(sizeof(list ));
  78.             temp->data = A;
  79.             temp->next = NULL;          //复制最后一个指针如没有数据赋值为NULL,这个赋值在first_list函数中会使用到

  80.             if(*happy == NULL)
  81.             {
  82.                 *happy = temp;
  83.             }
  84.             else
  85.             {
  86.                 tail->next = temp;
  87.             }
  88.             tail = temp;

  89.         }
  90.         else
  91.         {
  92.             break;
  93.         }

  94.     }
  95. }

  96. int main()
  97. {
  98.     dack first[MAX];

  99.     first[0].litte = 'A';
  100.     first[1].litte = 'B';
  101.     first[2].litte = 'C';
  102.     first[3].litte = 'D';
  103.     first[4].litte = 'E';
  104.     first[5].litte = 'F';
  105.     first[6].litte = 'G';
  106.     first[7].litte = 'H';
  107.     first[8].litte = 'I';


  108.     for(int i = 0; i < MAX; i++)
  109.     {
  110.         first[i].happy = NULL;
  111.         first[i].Blo = 0;
  112.         get_list(&first[i].happy);
  113.     }


  114.     loop_list(first);       //传入的数据为first[0].happy的指针

  115.     for(int i = 0; i < MAX; i++)
  116.     {
  117.         free_list(first[i].happy);
  118.     }

  119.     /* for(int i = 0; i < MAX; i++)
  120.     {
  121.         printf("%c", first[i].litte);
  122.         print_list(first[i].happy);
  123.         putchar('\n');
  124.     }*/


  125.     return 0;
  126. }
复制代码



输入输出结果:

WOkiIdFAOL.png


print_list函数输入输出结果:


备注:用于印证广度遍历输出

cb_console_runner_CCdUnpbiw7.png


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-12 07:32:42 | 显示全部楼层
This word is NB!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 04:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表