邻接表表示图DFS与BFS

匿名 (未验证) 提交于 2019-12-02 23:43:01
#include<iostream> #define MAX_VERTEX_NUM 50  using namespace std;  typedef char VerType;  typedef struct ArcNode                 //定义弧结点所在位置, {   int adj;   int info;   ArcNode *next; }ArcNode;  typedef struct VerNode          //定义顶点(顶点数据,顶点所指向第一条弧的指针) {   VerType data;   ArcNode *first; }VerNode;  typedef struct AdjList      //图的定义 {   VerNode VerNodes[MAX_VERTEX_NUM]; //顶点集   int verNum,arcNum;        //顶点数,弧数 }AdjList;  typedef struct Queue      //FIFO队列 {   int Item[MAX_VERTEX_NUM];   int front,rear; }Queue;   int visited[MAX_VERTEX_NUM];    //顶点访问标志数组  //定位某一结点的位置,找不到返回0 int LocateGraph(AdjList *g,char data) {   for(int i=1;i<=g->verNum;i++)   {     if(g->VerNodes[i].data==data)        return i;   }   return 0; }  //初始化队列 void InitQueue(Queue *Q) {   for(int i=1;i<=MAX_VERTEX_NUM;i++)  {    Q->Item[i]=0;   }   Q->front=Q->rear=1; }   //创建图的邻接表 void CreateAdjList(AdjList *g) {   int s,d,weigth;   char sChar,dChar;   ArcNode *q=NULL;   cout<<"输入图的顶点数,弧数\n";   cin>>g->verNum>>g->arcNum;   cout<<"输入每个顶点的信息\n";   //初始化顶点   for(int i=1;i<=g->verNum;i++)   {     cin>>g->VerNodes[i].data;     g->VerNodes[i].first=NULL;   }   //初始化弧    for(i=1;i<=g->arcNum;i++)   {     cout<<"输入第"<<i<<"条弧的起始,目的,弧的权值"<<endl;     cin>>sChar>>dChar>>weigth;     s=LocateGraph(g,sChar);     d=LocateGraph(g,dChar);       //定位该顶点的位置     q=(ArcNode *)malloc(sizeof(ArcNode));     q->adj=d;q->info=weigth;     q->next=g->VerNodes[s].first;     g->VerNodes[s].first=q;   } }  // void InitVisited(AdjList *g) {   for(int i=1;i<=g->verNum;i++)   {      visited[i]=0;   } }  //访问顶点值 void visit(AdjList *g,int v) {   cout<<g->VerNodes[v].data<<endl; }  //深度遍历图 void DFSTransfer(AdjList *g,int v) {   visit(g,v);visited[v]=1;   ArcNode *q=NULL;   q=g->VerNodes[v].first;   while(q!=NULL)   {      if(!visited[q->adj])     {       DFSTransfer(g,q->adj);       q=q->next;      }   } }  //广度遍历v顶点 void BFS(AdjList *g,int v) {   ArcNode *q=NULL;   Queue *Q=(Queue *)malloc(sizeof(Queue));   InitQueue(Q);          Q->Item[Q->rear]=v;visit(g,v);visited[v]=1;   Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;   while(Q->front!=Q->rear)   {      v=Q->Item[Q->front];      Q->front=(Q->front+1)%MAX_VERTEX_NUM;      q=g->VerNodes[v].first;      while(q!=NULL)      {        if(!visited[q->adj])       {         visit(g,q->adj);         visited[q->adj]=1;         Q->Item[Q->rear]=q->adj;         Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;         q=q->next;       }     }   } }  //广度遍历图 void BFSTransfer(AdjList *g) {   InitVisited(g);   for(int i=1;i<=g->verNum;i++)   {      if(!visited[i])      {        BFS(g,i);      }   }   cout<<endl; }  int main() {   AdjList *g=(AdjList*)malloc(sizeof(AdjList));   CreateAdjList(g);   cout<<"---------------------广度优先搜索----------------------"<<endl;   BFSTransfer(g);   cout<<"---------------------深度优先搜索----------------------"<<endl;   InitVisited(g);   DFSTransfer(g,1);   return 0; }

转载于:https://my.oschina.net/u/1167421/blog/546454

转载请标明出处:邻接表表示图DFS与BFS
文章来源: https://blog.csdn.net/weixin_34013044/article/details/92080819
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!