zoukankan      html  css  js  c++  java
  • 图的广度优先搜索 皇星客栈

    View Code
      1 //----------------------图的广度优先搜索-----------------------
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 
      5 #define MAXQUEUE   10                        //队列的最大容量
      6 
      7 
      8 struct  node                                  //图顶点结构声明
      9 { 
     10     int vertex;                               //顶点数据
     11     struct  node *nextnode;                         //指向下一顶点的指针
     12 
     13 };
     14 typedef  struct  node *graph;                    //图的结构新类型
     15 struct  node head[9];                       //图的顶点结构数组
     16 int visited[9];                               //遍历记录数组
     17 
     18 
     19 int queue[MAXQUEUE];                     //队列数组声明
     20  
     21 int  front =-1;                           //队列的对头
     22 int rear  =-1;                              //队列的队尾
     23 
     24 
     25 
     26 //---------------------创建图-----------------------
     27 
     28 
     29 void  creategraph(int *node,int num)
     30 {
     31     graph newnode;                      //新顶点指针
     32         graph ptr;                      
     33         int  from;                       //边的起点
     34         int  to;                           //边的终点
     35 
     36         int  i;
     37 
     38               for(i=0;i<num;i++)       //读取边的循环
     39               {
     40                   from=node[i*2];       //边的起点
     41                   to=node[i*2+1];        //边的终点
     42 
     43 
     44                   //-----------创建新顶点内存---------------------
     45 
     46                   newnode=( graph ) malloc(sizeof(struct  node));
     47                   newnode->vertex=to;                   //创建顶点内容
     48                   newnode->nextnode=NULL;              //设置指针初值
     49                   ptr=&(head[from]);                   //顶点位置
     50                   while(ptr->nextnode!=NULL)        //遍历至链表尾
     51                   
     52                       ptr=ptr->nextnode;              //下一个顶点
     53                       ptr->nextnode=newnode;     //插入结尾
     54                   
     55 
     56               }
     57 
     58 }
     59 
     60 //-----------------------队列的数据存入-------------------------
     61 int enqueue(int value)
     62 {
     63     if(rear>=MAXQUEUE)                          //检查队列是否全满
     64         return  -1;                              //无法存入
     65         rear++;                                   //队尾指针往前移
     66         queue[rear]=value;                         //存入队列
     67 
     68 }
     69 
     70 
     71 //-----------------------队列数据的取出-----------------------
     72 
     73 int  dequeue()
     74 {
     75     if(front==rear)                          //检查队列是否为空
     76         return  -1;                       //无法取出
     77     front++;                                 //对头指针往前移
     78     return  queue[front];                        //队列取出
     79 }
     80 
     81 //-------------------------图的广度优先搜索法--------------------------------
     82 void   bfs(  int   current)
     83 {
     84     graph  ptr;
     85 
     86     //处理第一个顶点
     87         enqueue(current);               //将顶点存入队列
     88         visited[current]=1;             //记录已遍历过
     89                                      
     90         printf("顶点[%d]  ",current);   //输出遍历顶点值
     91 
     92         while(front !=rear )                  //队列是否为空
     93         {
     94             current=dequeue();              //将顶点从队列中取出
     95             ptr=head[current].nextnode;        //顶点位置
     96 
     97             while(ptr!=NULL)                //遍历至链表尾
     98             {
     99                 if(visited[ptr->vertex]==0)   //如果没有遍历过
    100                 {
    101                     enqueue(ptr->vertex);   //递归遍历调用 
    102                     visited[ptr->vertex]=1;  //记录已遍历过
    103 
    104                   printf("顶点[%d] ",ptr->vertex);
    105                 }
    106             ptr=ptr->nextnode;  //下一个顶点
    107             }
    108         
    109         }
    110 
    111 }
    112 //-----------------将遍历内容输出-----------------------
    113 
    114 int  main()
    115 {
    116 
    117     graph ptr;
    118     int node[20][2]= {                               //边数组
    119         {1,2},{2,1},  
    120         {1,3},{3,1},  
    121         {2,4},{4,2},   
    122         {2,5},{5,2}, 
    123         {3,6},{6,3},
    124         {3,7},{7,3},  
    125         {4,8},{8,4},   
    126         {5,8},{8,5},   
    127         {6,8},{8,6}, 
    128         {7,8},{8,7}  };
    129 
    130        int  i;  
    131        for(i=1;i<=8;i++) 
    132        { 
    133            head[i].vertex=i;                                                     //设置顶点值 
    134            head[i].nextnode=NULL;                                                //清除图指针     
    135            visited[i]=0;                                                         //设置遍历初值   
    136        } 
    137        creategraph(*node,20);                                                      //创建图    
    138        printf("图的邻接表内容:\n");  
    139        for(i=1;i<=8;i++)
    140        {
    141            printf("顶点%d => ",head[i].vertex);                                 //顶点值     
    142            ptr=head[i].nextnode;                                               //顶点位置     
    143            while(ptr!=NULL)                                                     //遍历至链表尾    
    144            {
    145                printf(" %d ",ptr->vertex);                                      //输出顶点内容    
    146                ptr=ptr->nextnode;                                              //下一个顶点     
    147            } 
    148            printf("\n");    
    149        }    
    150        printf("图的广度优先遍历内容: \n");    
    151        bfs(1);
    152        printf("\n");
    153        system("pause");
    154 }

    第一次,比较粗糙

  • 相关阅读:
    数据库(四)—— Redis数据库
    数据库——MySQL乐观锁与悲观锁
    Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
    centos7 php7 安装composer时Failed to decode zlib stream解决办法
    PHP 迭代器模式
    PHP 装饰器模式
    PHP 原型模式
    PHP 观察者模式
    PHP 策略模式
    PHP 适配器模式
  • 原文地址:https://www.cnblogs.com/huangxingkezhan/p/2731953.html
Copyright © 2011-2022 走看看