鱼C论坛

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

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

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

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

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

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

原理:


备注:



代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 9


typedef struct list
{
    int data;
    struct list *next;
}list, *lists;

typedef struct dack
{
    char litte;
    int Blo;
    list *happy;
}dack;
void get_list(list **happy);
//void print_list(list *happy);
void loop_list(dack OK[MAX]);
void free_list(list *temp);

void free_list(list *temp)      //释放
{
    if(!temp)
    {
        return;
    }
    free_list(temp->next);
    free(temp);
}

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

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

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

/*void print_list(list *happy)        //打印输出
{
    while(happy)
    {
        printf("%3d", happy->data);
        happy = happy->next;
    }
}*/

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

    int A = 0;

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

            if(*happy == NULL)
            {
                *happy = temp;
            }
            else
            {
                tail->next = temp;
            }
            tail = temp;

        }
        else
        {
            break;
        }

    }
}

int main()
{
    dack first[MAX];

    first[0].litte = 'A';
    first[1].litte = 'B';
    first[2].litte = 'C';
    first[3].litte = 'D';
    first[4].litte = 'E';
    first[5].litte = 'F';
    first[6].litte = 'G';
    first[7].litte = 'H';
    first[8].litte = 'I';


    for(int i = 0; i < MAX; i++)
    {
        first[i].happy = NULL;
        first[i].Blo = 0;
        get_list(&first[i].happy);
    }


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

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

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


    return 0;
}


输入输出结果:

WOkiIdFAOL.png


print_list函数输入输出结果:


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

cb_console_runner_CCdUnpbiw7.png


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-12 07:32:42 | 显示全部楼层
This word is NB!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 22:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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