鱼C论坛

 找回密码
 立即注册
查看: 1138|回复: 0

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

[复制链接]
发表于 2022-9-5 12:09:09 | 显示全部楼层 |阅读模式

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

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

x

原理:



备注:



代码:
#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], int Blo[MAX], int i);
void loop_list(dack OK[MAX], list *temp);
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)        //图的深度优先遍历
{
    if(temp == NULL)                            //递归结束条件,temp传入的时候是存在数据的只有当便利到本链表最后一个的时候才会等于NULL这个是在get_list函数中以赋值NULL
    {
        return;
    }

   loop_list(OK, temp->next);                   //将所有链表传入到递归栈中

   if(OK[temp->data].Blo != 1)                  //如果OK数组中的Blo子项被赋予了1这个值那么就表明这个顶点已被读取过,及不执行该语句
   {
       printf("%c", OK[temp->data].litte);
       OK[temp->data].Blo = 1;
       loop_list(OK,OK[temp->data].happy);      //这条很重要,当执行了上面if语句也就是说ok[temp->data].litte顶点以经被读取并已经赋值,那就需要从新把赋值成功的这个顶点以及后面的链表地址传入循环
   }
   //如果没有执行if语句及说明这个链表中的数字顶点以被执行过及自动回弹不执行任何操作

    /*list *temp;

    if(Blo[i] == 1)
    {
        return;
    }
    printf("%c", OK[i].litte);
    Blo[i] = 1;

    loop_list(OK, Blo, i = OK[i].happy->data);

    temp = OK[i].happy;

    while(Blo[i] == 1)
    {
        temp = temp->next;
        if(temp != NULL)
        {
            i = temp->data;
        }
        else
        {
            break;
        }
    }

    loop_list(OK, Blo, i);*/
}
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];
    //int Blo[MAX] = {0, 0, 0, 0, 0, 0, 0, 0, 0};

    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);       //传入的数据为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;
}


输入输出结果:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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