#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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/xiaochaocnn/article/details/8940444
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。