065.图的深度优先遍利

举报
C语言与CPP编程 发表于 2022/04/30 23:59:51 2022/04/30
【摘要】 /*/*//* 图的深度优先遍历 *//*/*/#include <stdlib.h>#include <stdio.h> struct node /* 图顶点结构定义 */{...

      /*/*/
      /* 图的深度优先遍历 */
      /*/*/
      #include <stdlib.h>
      #include <stdio.h>
      struct node                       /* 图顶点结构定义 */
      {
        int vertex;                    /* 顶点数据信息 */
        struct node *nextnode;         /* 指下一顶点的指标 */
      };
      typedef struct node *graph;       /* 图形的结构新型态 */
      struct node head[9];              /* 图形顶点数组 */
      int visited[9];                   /* 遍历标记数组 */
      /********************根据已有的信息建立邻接表********************/
      void creategraph(int node[20][2],int num)/*num指的是图的边数*/
      {
         graph newnode;                 /*指向新节点的指针定义*/
         graph ptr;
        int from;                      /* 边的起点 */
        int to;                        /* 边的终点 */
        int i;
        for ( i = 0; i < num; i++ )    /* 读取边线信息,插入邻接表*/
         {
            from = node[i][0];         /* 边线的起点 */
            to = node[i][1];           /* 边线的终点 */
     	  /* 建立新顶点 */
            newnode = ( graph ) malloc(sizeof(struct node));
            newnode->vertex = to;        /* 建立顶点内容 */
            newnode->nextnode = NULL;    /* 设定指标初值 */
            ptr = &(head[from]);         /* 顶点位置 */
           while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */
               ptr = ptr->nextnode;     /* 下一个顶点 */
            ptr->nextnode = newnode;    /* 插入节点 */
         }
      }
      /********************** 图的深度优先搜寻法********************/
      void dfs(int current)
      {
         graph ptr;
         visited[current] = 1;          /* 记录已遍历过 */
        printf("vertex[%d]\n",current);   /* 输出遍历顶点值 */
         ptr = head[current].nextnode;  /* 顶点位置 */
        while ( ptr != NULL )          /* 遍历至链表尾 */
         {
           if ( visited[ptr->vertex] == 0 )  /* 如过没遍历过 */
              dfs(ptr->vertex);              /* 递回遍历呼叫 */
            ptr = ptr->nextnode;              /* 下一个顶点 */
         }
      }
      /****************************** 主程序******************************/
      void main()
      {
         graph ptr;
        int node[20][2] = { {1, 2}, {2, 1},  /* 边线数组 */
                             {1, 3}, {3, 1},
                             {1, 4}, {4, 1},
                             {2, 5}, {5, 2},
                             {2, 6}, {6, 2},
                             {3, 7}, {7, 3},
                             {4, 7}, {4, 4},
                             {5, 8}, {8, 5},
                             {6, 7}, {7, 6},
                             {7, 8}, {8, 7} };
        int i;
        clrscr();
        for ( i = 1; i <= 8; i++ )      /* 顶点数组初始化 */
         {
            head[i].vertex = i;         /* 设定顶点值 */
            head[i].nextnode = NULL;    /* 指针为空 */
            visited[i] = 0;             /* 设定遍历初始标志 */
         }
        creategraph(node,20);          /* 建立邻接表 */
        printf("Content of the gragh's ADlist is:\n");
        for ( i = 1; i <= 8; i++ )
         {
           printf("vertex%d ->",head[i].vertex); /* 顶点值 */
            ptr = head[i].nextnode;             /* 顶点位置 */
           while ( ptr != NULL )       /* 遍历至链表尾 */
            {
              printf(" %d ",ptr->vertex);  /* 印出顶点内容 */
               ptr = ptr->nextnode;         /* 下一个顶点 */
            }
           printf("\n");               /* 换行 */
         }
        printf("\nThe end of the dfs are:\n");
        dfs(1);                        /* 打印输出遍历过程 */
        printf("\n");                  /* 换行 */
        puts(" Press any key to quit...");
        getch();
      }
  
 

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124495755

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。