【数据结构-图】图的建立以及广度优先遍历算法

本文利用邻接表的方法将图进行了表示,并且利用广度优先遍历方法对图进行遍历

下面是一个图的示例:

《【数据结构-图】图的建立以及广度优先遍历算法》

代码如下:

#include<iostream>
using namespace std;
typedef int VexType;
typedef struct Arcnode{
VexType data;
struct Arcnode *nextarc;
}ArcNode;
typedef struct Vexnode
{

VexType data;
    ArcNode *firstarc;
}Vnode,AdjList[100];
typedef struct Graph
{
AdjList adjlist;
int vexnum;
int arcnum;
}*MGraph,Graph;
MGraph Create_Graph()
{
MGraph mygraph =new Graph;
int key;
int i;
int m;
int x,y,z;
printf(“图一共有多少个顶点?\n”);
scanf(“%d”,&x);
mygraph->vexnum=x;
printf(“图一共有多少个边?\n”);
scanf(“%d”,&y);
mygraph->arcnum=y;
printf(“请输入每个顶点\n”);
for(i=1;i<=mygraph->vexnum;i++)
{
scanf(“%d”,&z);
   mygraph->adjlist[i].data=z;
}
for(i=1;i<=mygraph->vexnum;i++)
{
printf(“%d有没有相关连的顶点?有输入1,没有输入0\n”,mygraph->adjlist[i].data);
scanf(“%d”,&key);
if(key)
{
   printf(“请输入与%d相关联的顶点,以-123结束\n”,mygraph->adjlist[i].data);
            scanf(“%d”,&m);
ArcNode *p=new ArcNode;
p->data=m;
p->nextarc=NULL;
mygraph->adjlist[i].firstarc=p;
printf(“请输入与%d相关联的顶点,以-123结束\n”,mygraph->adjlist[i].data);
            scanf(“%d”,&m);
while(m!=-123)
{
               ArcNode *q=new ArcNode;
  q->data=m;
  p->nextarc=q;
  p=q;
  printf(“请输入与%d相关联的顶点,以-123结束\n”,mygraph->adjlist[i].data);
               scanf(“%d”,&m);
}
p->nextarc=NULL;
}
if(!key)
{
mygraph->adjlist[i].firstarc=NULL;
}
//printf(“完成了第%d个节点\n”,i);
}
printf(“done\n”);
return mygraph;
}

void prints(MGraph root)
{
MGraph mygraph=root;
int i;
ArcNode *q;
printf(“这个图的邻接表表示为:\n”);
for(i=1;i<=mygraph->vexnum;i++)
{
printf(“%d:”,mygraph->adjlist[i].data);
q=mygraph->adjlist[i].firstarc;
if(q)
{
while(q->nextarc!=NULL)
{
printf(“%d,”,q->data);
q=q->nextarc;
}
printf(“%d”,q->data);
}
printf(“\n”);
}
}
void BFS(MGraph root)//广度优先遍历
{
MGraph mygraph=root;
bool *sign=new bool;//标记这个节点是不是被访问了
int i;
for(i=1;i<=mygraph->vexnum;i++)
sign[i]=false;
Vnode *Q[100];
Vnode *p;
ArcNode *q;
int rear=-1;
int front=-1;
printf(“广度优先遍历为:”);
for(i=1;i<=mygraph->vexnum;i++)
{
if(!sign[i])
{
printf(“%d “,mygraph->adjlist[i].data);
sign[i]=1;
}
Q[++rear]=&(mygraph->adjlist[i]);
while(front!=rear)
{
p=Q[++front];
if(p->firstarc!=NULL)
{
q=p->firstarc;
while(q->nextarc!=NULL)
{
   if(!sign[q->data])
      {
      printf(“%d “,q->data);
      Q[++rear]=&(mygraph->adjlist[q->data]);
      sign[q->data]=true;
      q=q->nextarc;
       }
   else
      {
      q=q->nextarc;
      }
     }
if(!sign[q->data])
      {
      printf(“%d “,q->data);
      Q[++rear]=&(mygraph->adjlist[q->data]);
      sign[q->data]=true;
       }//访问每个链表中的最后一个元素
}
}
}
}
int main(void)
{
MGraph mygraph;
mygraph=Create_Graph();
BFS(mygraph);
return 0;
}

结果展示:

《【数据结构-图】图的建立以及广度优先遍历算法》

《【数据结构-图】图的建立以及广度优先遍历算法》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/wodeai1625/article/details/45080153
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞