图的深度遍历和广度遍历

来源:互联网 发布:linux tar包解压 编辑:程序博客网 时间:2024/06/09 20:05
#include<stdio.h>#include<stdlib.h>#include "queue.h"#define MAX_VERTEX_NUM 20typedef 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;}