图的深度遍历和广度遍历
来源:互联网 发布: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;}