zoukankan      html  css  js  c++  java
  • 图的深度遍历和广度遍历

    #include<stdio.h>
    #include<malloc.h>
    #define MAX_VERTEX_NUM 10
    typedef char VertexType;
    typedef struct ArcNode//
    {
           int adjvex;
           struct ArcNode *nextarc;
           int info;
    }ArcNode;  //表结点类型
    typedef struct VNode//顶点 
    {
           VertexType data;
           ArcNode *firstarc;
    }VNode,AdjList[MAX_VERTEX_NUM]; //头结点
    
    typedef struct
    {
           AdjList vertices;  //邻接表
           int vexnum,arcnum;
    }ALGraph;
    //设置一个全局的数组遍历
    int visited[MAX_VERTEX_NUM]={0};//访问过设置为1,未访问完设置为0 
    
    //定义队列 
    typedef struct node  //队列节点 
    {  
        int  vNode;  
        struct node *Next;  
    }Node;    
    typedef struct Q
    {
            struct node *front;
            struct node *end;
    }Queue;
    
    
    ////获取边的位置 
    int Locate(ALGraph *G, char vex)
    {
     int i=0;
     for(;i<G->vexnum;i++)
       if(vex==G->vertices[i].data)
       break;
     return i;
    }
     
    //建立邻接表(无向图的邻接表)
    ALGraph *CreateALGraph(ALGraph *G)
    {
      G=(ALGraph*)malloc(sizeof(ALGraph));
      printf("输入图的顶点数:\n");
      scanf("%d",&G->vexnum); 
      
      printf("输入图的边数:\n");
      scanf("%d",&G->arcnum); 
      printf("输入顶点的数据:\n");
      int i;
      for(i=0;i<G->vexnum;i++)
      {
        printf("第%d次输入\n",i);
        printf("好奇葩\n");
        fflush(stdin);
        scanf("%c",&G->vertices[i].data);
        G->vertices[i].firstarc=NULL;
      
      } 
      printf("输入边:\n");
      char vex1,vex2;
      ArcNode *p,*q; 
      int in,out;
      for(i=0;i<G->arcnum;i++)
      {
       printf("输入弧%d(顶点1,顶点2)",i);
       fflush(stdin);//清空缓冲区,避免对后面数据的影响 
       scanf("%c%c",&vex1,&vex2);//输入一条弧的始点和终点
       in =Locate(G,vex1);
       out =Locate(G,vex2);
       printf("%c,%c",vex1,vex2);
       p=(ArcNode *)malloc(sizeof(ArcNode));
       p->adjvex=out;
       p->nextarc=NULL;
       //从头部插入节点
       p->nextarc=G->vertices[in].firstarc;
       G->vertices[in].firstarc=p;
       
       //如果在这里也赋值的话,说明是无向图,此时需要重新设置值
        q=(ArcNode *)malloc(sizeof(ArcNode)); 
        q->adjvex=in; 
        q->nextarc=NULL;
        q->nextarc=G->vertices[out].firstarc;
        G->vertices[out].firstarc=q;
       //给弧赋予权值
       fflush(stdin);//清空缓冲区,避免对后面数据的影响 
       printf("给弧赋予权值!\n");
       int index;
       scanf("%d",&index);
       p->info=index;
       q->info=index;
      }
      return G; 
    
    } 
    //测试一下
    void Test(ALGraph *G)
    {
       int i=0;
       printf("输出顶点的参数值\n");
       for(;i<G->vexnum;i++)
       {
         printf("%c\n",G->vertices[i].data);
       } 
    
    }
    void DFS(ALGraph *G,int v)
    {
      printf("%c",G->vertices[v].data);
      visited[v]=1;
      ArcNode *p=G->vertices[v].firstarc; 
      for(;p!=NULL;p=p->nextarc)
        if(visited[p->adjvex]==0) DFS(G,p->adjvex);
    } 
    //深度遍历图
    void DFSTraverse(ALGraph *G)
    {
         int i=0;
        for(;i<G->vexnum;i++)
          if(visited[i]==0)
             DFS(G,i); 
    }
    
    //广度遍历图(借助于队列实现) 
    Queue* InitQueue(Queue *q)
    {
      q=(Queue *)malloc(sizeof(Queue)); 
      Node *front = (Node *)malloc(sizeof(Node));  
      q->front=q->end=front;
      q->front->Next=NULL;
      q->front->vNode=0;//用于存放节点的个数 
      return q;
    
    }
    void Traverse(Queue *q)
    {
     int i=0; 
     Node *p=q->front->Next;
     for(;i<q->front->vNode;i++)
     {
      printf("%d\n",p->vNode);
     
     }
    
    }
    void EnQueue(Queue *q,int vNode)
    {
    //  printf("进队列开始:\n");
      Node *node=(Node*)malloc(sizeof(Node));
      node->vNode=vNode;
      q->end->Next=node;
      node->Next=NULL; 
    //  printf("%d\n",q->end->Next->vNode); 
      q->end=node;
      q->front->vNode++;
     // printf("%d\n",q->end->vNode); 
     // printf("进队列结束:\n"); 
    //  printf("遍历一下队列:\n");
     // Traverse(q);  
    }
    
    int DeQueue(Queue *q)
    {
      int vNode=q->front->Next->vNode;
     // printf("%d出队列\n",q->front->Next->vNode);
      Node *p=q->front->Next;
      if(q->end==q->front->Next)
      {
       q->end=q->front; 
      }
      q->front->Next=q->front->Next->Next;
      free(p);
      q->front->vNode--;
     // printf("%d出队列\n",vNode);
      return vNode;
    }/*
    bool QueueEmpty(Queue *q)
    {
      if(q->front->vNode==0)
          return false;
      else
          return true;
    
    }*/
    void BFSTraverse(ALGraph *G)
    {
      Queue *q;
      ArcNode *p;
      int u;
       
     //初始化队列
     q=InitQueue(q);
     int v=0;
     for(;v<G->vexnum;v++)
     {
      visited[v]=0;
     }
     for(v=0;v<G->vexnum;v++)//v尚未访问 
     {
       if(visited[v]==0)
       {
         printf("%c",G->vertices[v].data);
         visited[v]=1; 
         EnQueue(q,v);//入队 
         while(q->front->vNode!=0)//不为空的话 
         {
           u=DeQueue(q);
           p=G->vertices[u].firstarc; 
           for(;p!=NULL;p=p->nextarc)
            if(visited[p->adjvex]==0) 
            {
              printf("%c",G->vertices[p->adjvex].data);
              visited[p->adjvex]=1;
            //  printf("输出位置:%d\n",p->adjvex);
              EnQueue(q,p->adjvex);
              //Traverse(q);
            }            
         } 
       }
     } 
    
    }
    
    int main()
    {
       //创建图,并将其保存到邻接表中 
       ALGraph *G; 
       G=CreateALGraph(G); 
       //测试一下是否有问题
       Test(G); 
       //广度优先遍历图
       printf("深度优先遍历的结果如下:");
       DFSTraverse(G); 
       printf("\n");
       printf("广度优先遍历的结果如下:");
       BFSTraverse(G); 
       system("pause");
    
    } 

    开发环境:dev-c++,保存为:.c

  • 相关阅读:
    Discuz!X/数据库操作方法
    使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别
    ECShop模板原理
    ecshop中smarty最常用的6大基本语法
    Laravel学习笔记
    Laravel的目录结构分析
    Intellij Idea 常用快捷键
    Code optimization and organization in Javascript / jQuery
    Bossies 2015: The Best of Open Source Software Awards
    解决jetty runner锁定js
  • 原文地址:https://www.cnblogs.com/moshang/p/3773201.html
Copyright © 2011-2022 走看看