奥普瓯江 发表于 2022-9-5 12:09:09

图的遍历-深度优先


原理:



备注:



代码:

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

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

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

    /*list *temp;

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

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

    temp = OK.happy;

    while(Blo == 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;
    //int Blo = {0, 0, 0, 0, 0, 0, 0, 0, 0};

    first.litte = 'A';
    first.litte = 'B';
    first.litte = 'C';
    first.litte = 'D';
    first.litte = 'E';
    first.litte = 'F';
    first.litte = 'G';
    first.litte = 'H';
    first.litte = 'I';


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


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

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


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


    return 0;
}



输入输出结果:


页: [1]
查看完整版本: 图的遍历-深度优先