图的遍历

本示例中的图采用的存储方式为二维数组存储的无向图

一、深度优先遍历
void DFS(int *graph,int n,int vertex) //避免因图中出现多个连通分量导致无法遍历全部节点 { int count=0; int i=vertex; while(count<n) { if(visited[i]==0) { dfsearch(graph,n,i); } i=(i+1)%n; } } void dfsearch(int *graph,int n,int v) //深度遍历算法 { visited[v]=1; printf("%d ",v); for(int w=nextVer(graph,n,v);w!=-1;w=nextAdjan(graph,n,w,v)) if(visited[w]==0) dfsearch(graph,n,w); }

二、广度优先遍历
void BFS(int *graph,int n,int vertex) //避免出现多个连通分量导致无法访问全部节点 { int count=0; int i=vertex; while(count<n) { if(visited[i]==0) { bfsearch(graph,n,i); } i=(i+1)%n; } } void bfsearch(int *graph,int n,int vertex) //深度优先遍历算法 { int l=0,r=0; int ver; int queue[queueCap]; queue[r++]=vertex; while(r!=l) { ver=queue[l]; printf("%d ",ver); visited[ver]=1; l=(l+1)%queueCap; for(int i=0;i<n;i++) { if(graph[ver*n+i]==1&&graph[ver*n+i]!=ver&&visited[i]==0) { queue[r]=i; if((r+1)%queueCap==l) { printf("queueFull"); return; } r=(r+1)%queueCap; } } } }

具体实现代码:
`#include<stdio.h>

include <stdlib.h>

//宏定义最大顶点数量和队列的大小

define vertexCount 5

define queueCap 5

int visited[vertexCount];
//声明深度遍历和广度遍历算法
void dfsearch(int *graph,int n,int v);
void bfsearch(int *graph,int n,int vertex);

int *creatGraph(int n)
//创建图以一维数组二维化实现
{
int graphMatrix=(int )malloc(sizeof(int)nn);
return graphMatrix;
}

void destoryGraph(int *graphMatrix)
//销毁二维数组
{
free(graphMatrix);
}

void initGraph(int graphMatrix,int n)
//初始化二维数组
{
char ch;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&graphMatrix[i
n+j]);
scanf("%c",&ch);
}
}
}

int nextVer(int graph,int n,int nowVer)
//当前顶点的下一个顶点
{
for(int i=0;i<n;i++)
if(graph[n
nowVer+i]==1&&i!=nowVer)
return i;
return -1;
}

int nextAdjan(int graph,int n,int nowVer,int firstVer)
//当前顶点所在行的下一个顶点
{
for(int i=nowVer+1;i<n;i++)
if(graph[n
firstVer+i]==1)
return i;
return -1;
}

void DFS(int *graph,int n,int vertex)
{
int count=0;
int i=vertex;
while(count<n)
{
if(visited[i]0)
{
dfsearch(graph,n,i);
}
i=(i+1)%n;
}
}
void dfsearch(int *graph,int n,int v)
{
visited[v]=1;
printf("%d ",v);
for(int w=nextVer(graph,n,v);w!=-1;w=nextAdjan(graph,n,w,v))
if(visited[w]
0)
dfsearch(graph,n,w);
}

//广度优先遍历
void BFS(int graph,int n,int vertex)
{
int count=0;
int i=vertex;
while(count<n)
{
if(visited[i]0)
{
bfsearch(graph,n,i);
}
i=(i+1)%n;
}
}
void bfsearch(int graph,int n,int vertex)
{
int l=0,r=0;
int ver;
int queue[queueCap];
queue[r++]=vertex;
while(r!=l)
{
ver=queue[l];
printf("%d ",ver);
visited[ver]=1;
l=(l+1)%queueCap;
for(int i=0;i<n;i++)
{
if(graph[ver
n+i]
1&&graph[ver
n+i]!=ver&&visited[i]0)
{
queue[r]=i;
if((r+1)%queueCap
l)
{
printf("queueFull");
return;
}
r=(r+1)%queueCap;
}
}
}
}

int main()
{
int n,vertex;
int *graph;
printf("请输入顶点个数\n");
scanf("%d",&n);
graph=creatGraph(n);
printf("请输入图的二维矩阵表示\n");
initGraph(graph,n);
printf("请输入需要访问的顶点\n");
scanf("%d",&vertex);
BFS(graph,n,vertex);//可自行更改为深度遍历调用算法
destoryGraph(graph);
return 0;
}`

posted @ 2024-08-09 19:20  jenniferCAI  阅读(17)  评论(0)    收藏  举报