图的深度遍历和广度遍历

#include<stdio.h>
#include<stdlib.h>
#include "queue.h"
#define MAX_VERTEX_NUM 20
typedef int VertexType;
typedef struct ArcNode
{
  int adjvex;//该弧所指向的顶点的位置
  struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
typedef struct VNode
{
  VertexType data;//顶点信息
  ArcNode  *firstarc;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{
  AdjList vertices;
  int vexnum,arcnum;//图的当前顶点数和弧数
  int kind;//图的种类
}ALGraph;
int visited[MAX_VERTEX_NUM];  //图的是否访问标志函数
//查询某个顶点的位置函数
int LocateVex(ALGraph G,VertexType u)//此处u为顶点
{
  int i;
  for(i=0;i<G.vexnum;i++)
  {
	  if(u==G.vertices[i].data)
		  return i;
  }
 if(i==G.vexnum)
 {
	 printf("不存在该顶点!\n");
     exit(1); 
 }
 return 0;
}
//创建图
void CreatGraph(ALGraph &G)
{
  int i,j,k,v1,v2;
  ArcNode *p;
  printf("请输入要创建的图的顶点数和边数\n");
  scanf("%d%d",&G.vexnum,&G.arcnum);
  printf("请输入顶点的信息:\n");
  for(i=0;i<G.vexnum;i++)
  {
	  scanf("%d",&G.vertices[i].data);
	  G.vertices[i].firstarc=NULL;//输入顶点信息,并设置其firstarc为空
  }
      printf("请输入边的信息格式为:(1,2)\n");
  for(k=0;k<G.arcnum;k++)
  {
    scanf("%d,%d",&v1,&v2);//输入两点之间的弧线
    i=LocateVex(G,v1);//得到v1,v2的位置
	j=LocateVex(G,v2);
	p=(ArcNode*)malloc(sizeof(ArcNode));//为新的节点申请空间
	p->adjvex=j;//当前节点位置
	p->nextarc=G.vertices[i].firstarc;
	G.vertices[i].firstarc=p;//将新节点前插法插入链表中
  }
}
//显示图的信息
void display(ALGraph &G)
{
   int i;
   ArcNode *p;
   for(i=0;i<G.vexnum;i++)
   {
	   printf("第%d个顶点的信息:",i+1);
	   p=G.vertices[i].firstarc;
	while(p)
	{
	  printf("(%d,%d) ",i+1,G.vertices[p->adjvex].data);
	 p=p->nextarc;
	}
	printf("\n");
   }
}
//递归深度遍历
void DFS(ALGraph &G,int v)
{
   ArcNode *p;
   printf("%d ",G.vertices[v].data);
   visited[v]=1;
   p=G.vertices[v].firstarc;
   while(p)
   {
     if(!visited[p->adjvex])
	      DFS(G,p->adjvex);
	 p=p->nextarc;
   }
}
//深度遍历图
void DFSTraverse(ALGraph &G)
{
   for(int i=0;i<G.vexnum;i++)
	   visited[i]=0;//开始设置图的每个节点都未访问过
   for(int v=0;v<G.vexnum;v++)
   {
     if(!visited[v])
		 DFS(G,v);//对未访问过的节点进行访问
   }
   printf("\n");
}
//广度遍历图
void BFSTraverse(ALGraph &G)
{
	int v,i;
   	LinkQueue q;
	ArcNode *p;
	InitQueue(q);
	for(i=0;i<G.vexnum;i++)
	   visited[i]=0;//开始设置图的每个节点都未访问过
	for(v=0;v<G.vexnum;v++)
	{
	   if(!visited[v])
	   {
		   visited[v]=1;//对方问过的节点标志设置为1
		   printf("%d ",G.vertices[v].data);
		   EnQueue(q,G.vertices[v].data);//用队列进行广度遍历
		   while(!QueueEmpty(q))
		   {
		     DeQueue(q,G.vertices[v].data);
			 for(p=G.vertices[v].firstarc;p;p=p->nextarc)
			 {
			     if(!visited[p->adjvex])
				 {
				   visited[p->adjvex]=1;
				   printf("%d ",G.vertices[p->adjvex].data);
                   EnQueue(q,G.vertices[p->adjvex].data);
				 }
			 }
		   }

	   }

	}
	
}
int main()
{ 
	ALGraph G;
	CreatGraph(G);//创建图
	display(G);//显示所创建的图
	printf("图的深度遍历为:\n");
	DFSTraverse(G);//深度遍历图
	printf("图的广度遍历为:\n");
	BFSTraverse(G);//广度遍历图
	printf("\n");
    return 0;
}

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