如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。
因为作者能力水平有限,欢迎各位大佬指导。
一、题目描述
1.输入一组顶点,建立无向图的邻接矩阵。
2.输入一组顶点,建立有向图的邻接表。
3.以邻接矩阵为存储结构,对无向图分别进行DFS(深度优先遍历)和BFS(广度优先遍历)。
4. 根据建立的有向图,判断该图是否是有向无环图,若是,则输出其一种拓扑有序序列。
二、步骤描述
1.根据邻接矩阵的存储表示来建立无向图,限定定点的最大存储值为50,以及设置两个整型的变量vexnum和arcnum分别来表示当前顶点数和边数。
2.在Create的函数中,定义三个整型变量i,j,k,使用getchar来获得顶点的信息。无向图建立完成后,对其进行初始化。使用scanf函数输入每条边对应的两个顶点的序号,输入完成后,使用两个for循环将无向图的邻接矩阵输出,完成无向图邻接矩阵的创建。
3.从第i个顶点出发递归的深度优先遍历图G,先访问第i个顶点,如果第i个顶点没有进行访问,调用DFS函数来访问其邻接顶点j。
4.主函数:分别调用上述函数,并对其做相应的输出调整。
三、代码实现
#include<stdio.h>
#include<stdlib.h>
int visited[50];
typedef char VertexType;
typedef struct
{
VertexType vexs[50];
int arcs[50][50];
int vexnum,arcnum;
} MGraph;
//创建邻接矩阵
void Create(MGraph &G)
{
int i,j,k;
printf("输入顶点数和边数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
getchar();
printf("创建顶点信息:");
for(i = 0; i < G.vexnum; i++)
{scanf("%c", &G.vexs[i]);}
//初始化
for(i = 0; i < G.vexnum; i++)
{
for(j = 0; j < G.vexnum; j++)
{G.arcs[i][j] = 0;}
}
getchar();
printf("请输入每条边对应的两个顶点的序号:\n");
for(k = 0; k < G.arcnum; k++)
{
scanf("%d%d", &i, &j);
G.arcs[i][j] = 1;
G.arcs[j][i] = G.arcs[i][j] ;
}
printf("输出邻接矩阵:\n");
for(i = 0; i < G.vexnum; i++)
{
for(j = 0; j < G.vexnum; j++)
{
printf("%5d",G.arcs[i][j]);
}
printf("\n");
}
}
//深度优先遍历
void DFS(MGraph G,int i)
{
int j;
visited[i] = 1;
printf("%c ", G.vexs[i]);
for (j = 0; j < G.arcnum; j++)
{
if (G.arcs[i][j]!= 0 && !visited[j])
DFS(G, j);
}
}
void DFSTraverse(MGraph G)
{
int i;
for(i = 0; i < G.arcnum; i++)
{
visited[i] = 0;
}
for (i = 0; i < G.arcnum; i++)
{
if (!visited[i])
DFS(G, i);
}
}
//广度优先
void BFS(MGraph G)
{
int i, j;
for (i = 0; i < G.arcnum; i++)
visited[i] = 0;
for (i = 0; i < G.arcnum; i++)
{
if (!visited[i])
{
visited[i] = 1;
printf("%c ", G.vexs[i]);
while (!G.arcs)
{
for (j = 0; j < G.arcnum; j++)
{
if (!visited[j] && G.arcs[i][j] != 0)
{
visited[j] = 1;
printf("%c ", G.vexs[j]);
}
}
}
}
}
}
int main()
{
MGraph G;
Create(G);
printf("图的深度优先遍历为: ");
DFSTraverse(G);
printf("图的广度优先遍历为: ");
BFS(G);
}
四、运行截图
因为作者能力水平有限,欢迎各位大佬指导。