数据结构 邻接矩阵的BFS DFS

来源:互联网 发布:淘宝盗图技巧不被发现 编辑:程序博客网 时间:2024/05/20 16:34
#include <stdio.h>
#define MAXNODE 10
typedef struct
{
char vertexs[MAXNODE];//以为数组来存储顶点信息
int arc[MAXNODE][MAXNODE];//存储边
int vexnum,arcnum;
}GraphType;
typedef struct
{
int rear,front;
int data[MAXNODE];
}SepQueue;
void CreateGraphType(GraphType*);
int LocatedGraphType(GraphType*,char);
void DFSTraverse(GraphType*);
void DFS(GraphType*,int);
void BFSTraverse(GraphType*);//广度优先遍历
void BFS(GraphType*,int,SepQueue*);//我们用队列来进行遍历
int visited[MAXNODE];
int main(void)
{
GraphType G;
CreateGraphType(&G);
printf("dfs遍历为:\n");
DFSTraverse(&G);
printf("bfs遍历为:\n");
BFSTraverse(&G);
return 0;
}
int LocatedGraphType(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
if(v==G->vertexs[i])
{
k=i;
break;
}
return k;
}
void CreateGraphType(GraphType*G)
{
int i,j,k;
char a,b;
printf("请输入图的顶点数和边数:");
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arc[i][j]=0;//初始化
printf("请输入定点的信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));//这里接受一下回车键。
printf("输入相应的点点:");
for(k=0;k<G->arcnum;k++)
{
scanf("%c,%c",&a,&b);
i=LocatedGraphType(G,a);
j=LocatedGraphType(G,b);
G->arc[i][j]=1;
G->arc[j][i]=1;
}
return ;
}
void DFSTraverse(GraphType*G)//非连通图的遍历
{
int i;
for(i=0;i<G->vexnum;i++)
visited[i]=0;//标记全没有被访问
for(i=0;i<G->vexnum;i++)
if(!visited[i])
DFS(G,i);
return ;
}
void DFS(GraphType*G,int v)//深度优先遍历。相当于先序遍历
{
int i;
printf("当前DFS遍历的顶点为:%c\n",G->vertexs[v]);//首先访问。
visited[v]=1;
for(i=0;i<G->vexnum;i++)
if(!visited[i]&&G->arc[v][i]==1)//该节点没有被访问过,而且是刚才访问节点的邻接点(比如我们访问的是无向图的时候,我们访问过[1,3],但是我们访问点点3,就不会访问[3,1],因为visited[1]=1)
DFS(G,i);//接着以该邻接顶点为顶点,递归。()
return ;
}
void BFSTraverse(GraphType*G)
{
int i;
SepQueue queue;
queue.front=queue.rear=0;//队列的初始化。
for(i=0;i<G->vexnum;i++)
visited[i]=0;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
BFS(G,i,&queue);
return ;
}
void BFS(GraphType*G,int v,SepQueue*queue)//相当于层次遍历(先访问-》标记-》入队)
{
int j,k;
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[v]);
visited[v]=1;
queue->data[queue->rear++]=v;
while(queue->rear!=queue->front)//直到队列为空
{
j=queue->data[queue->front++];//将队头元素出列
for(k=0;k<G->vexnum;k++)
if(!visited[k]&&G->arc[j][k]==1)//将该节点的所有顶点都入队。(相当于二叉树的层次遍历)
{
printf("当前BFS遍历的顶点为:%c\n",G->vertexs[k]);
visited[k]=1;
queue->data[queue->rear++]=k;
}
}
return;
}
0 0