深度优先算法和广度优先算法

/* ---------------------------------------- */
/*  
图形的深度优先搜寻法                    */
/* ---------------------------------------- */
void dfs(int current)
{
   graph ptr;

   visited[current] = 1;     /* 记录已遍历*/
   printf("
顶点[%d] ",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},
               {2, 4}, {4, 2},
               {2, 5}, {5, 2},
               {3, 6}, {6, 3},
               {3, 7}, {7, 3},
               {4, 8}, {8, 4},
               {5, 8}, {8, 5},
                {6, 8}, {8, 6},
               {7, 8}, {8, 7}};
   int i;

   for ( i = 1; i <= 8; i++ )
   {
      head[i].vertex = i;     /*
设定顶点值*/
      head[i].nextnode = NULL; /*
清除图形指标*/
      visited[i] = 0;      /*
设定遍历初值*/
   }
   creategraph(node,20);   /*
建立图形*/
   printf("
图形的邻接链表内容:/n");
   for ( i = 1; i <= 8; i++ )
   {
      printf("
顶点%d =>",head[i].vertex); /* 顶点值*/
      ptr = head[i].nextnode; /* 
顶点位置*/
      while ( ptr != NULL )  /*
遍历至链表尾*/
      {
         printf(" %d ",ptr->vertex); /*
印出顶点内容*/
         ptr = ptr->nextnode;  /* 
下一个顶点*/
      }
      printf("/n"); /* 
换行*/
   }
   printf("
图形的深度优先遍历内容:/n");
   dfs(1);  /* 
印出遍历过程*/
   printf("/n");/* 
换行 */
}

/* ======================================== */
/*    
图形的广度优先搜寻法                  */
/* ======================================== */
#include <stdlib.h>
#define MAXQUEUE 10   /* 
伫列的最大容量*/

struct node  /*  图形顶点结构宣告*/
{
   int vertex; /* 
顶点资料 */
   struct node *nextnode; /* 
指下一顶点的指标 */
};
typedef struct node *graph; /* 
图形的结构新型态*/
struct node head[9];  /* 
图形顶点结构数组*/
int visited[9];  /* 
遍历记录数组*/

int queue[MAXQUEUE]; /*  伫列的数组宣告*/
int front = -1;  /* 
伫列的前端*/
int rear = -1;  /* 
伫列的后端 */

/* ---------------------------------------- */
/*  
建立图形  */
/* ---------------------------------------- */
void creategraph(int *node,int num)
{
   graph newnode; /* 
新顶点指标 */
   graph ptr;
   int from;  /* 
边线的起点 */
   int to;   /* 
边线的终点 */
   int i;

   for ( i = 0; i < num; i++ ) /*  读取边线的回路*/
   {
      from = node[i*2];  /* 
边线的起点 */
      to = node[i*2+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;  /* 
插入结尾 */
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值