代码部分:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
struct GNode
{
int Nv;//点数
int Ne;//边数
int G[MAX][MAX];//各个点的连通情况
};
typedef struct GNode* PTGNode;
typedef PTGNode MGraph;
struct ENode
{
int v1;
int v2;
};//v1和v2的连通情况
typedef struct ENode* Edge;
void InsertEdge(MGraph Graph,Edge e);
MGraph BuildGraph();
void DFS(MGraph Graph,int v,int visit[]);
void BFS(MGraph Graph,int v,int visit[]);
int main()
{
MGraph Graph;
Graph=BuildGraph();
int visit[MAX]={0};//visit[]表示各点是否被访问,初始化为0
int i;
for(i=0;i<Graph->Nv;i++)
{
if(visit[i]==0)//被访问过的点不参与DFS
{
printf("{ ");
DFS(Graph,i,visit);
printf("}\n");
}
}
for(i=0;i<MAX;i++)//visit[]初始化0
{
visit[i]=0;
}
for(i=0;i<Graph->Nv;i++)
{
if(visit[i]==0)
{
printf("{ ");
BFS(Graph,i,visit);
printf("}\n");
}
}
return 0;
}
MGraph BuildGraph()
{
int i,j;
Edge e;
MGraph Graph;
Graph=(MGraph)malloc(sizeof(struct GNode));
e=(Edge)malloc(sizeof(struct ENode));
scanf("%d",&Graph->Nv);//输入点数
for(i=0;i<Graph->Nv;i++) /*各点之间初始化为不连通*/
for(j=0;j<Graph->Nv;j++)
Graph->G[i][j]=0;
scanf("%d",&Graph->Ne);//输入边数
for(i=1;i<=Graph->Ne;i++)
{
scanf("%d %d",&e->v1,&e->v2);
InsertEdge(Graph,e);
}
free(e);
return Graph;
}
void InsertEdge(MGraph Graph,Edge e)//无向图
{
Graph->G[e->v1][e->v2]=1;
Graph->G[e->v2][e->v1]=1;
}
void DFS(MGraph Graph,int v,int visit[])
{
int i;
visit[v]=1;
printf("%d ",v);
for(i=0;i<Graph->Nv;i++)
{
if(visit[i]==0&&Graph->G[v][i]==1)
{
DFS(Graph,i,visit);
}
}
}
void BFS(MGraph Graph,int v,int visit[])
{
int queue[100];
int first,rear,i,w;
first=-1,rear=-1;
visit[v]=1;
queue[++rear]=v;//入队
while(first<rear)//队不为空
{
w=queue[++first];//出队
printf("%d ",w);
for(i=0;i<Graph->Nv;i++)
{
if(visit[i]==0&&Graph->G[w][i]==1)//没有被访问过并且连通
{
visit[i]=1;
queue[++rear]=i;//入队
}
}
}
}