实现方法:
Graph *initgraph(int vexNum); //初始化图
void creat_graph(Graph *graph,char *vexs,int *arcs); //创建图
//void creat_graph(Graph *graph,char *vexs,int (*arcs)[5]); //创建图
void DFS(Graph *graph,int *flag,int index); //DFS遍历
定义结构体:
#include <stdio.h>
#include <windows.h>
typedef struct Graph
{
char *vexs; // 顶点元素
int **arcs; // 邻接表
int vexNum; // 顶点数量
int arcsNum; // 边数量
}Graph;
初始化图:
Graph *initgraph(int vexNum)
{
Graph *graph = (Graph *)malloc(sizeof(Graph));
graph->vexs = (char *)malloc(sizeof(char) * vexNum); //为顶点元素申请内存空间
graph->arcs = (int **)malloc(sizeof(int *) * vexNum); //指针数组(存储一维数组首地址)
for(int i = 0;i < vexNum;i++)
{
graph->arcs[i] = (int *)malloc(sizeof(int) * vexNum); //为一维数组申请内存空间
}
graph->vexNum = vexNum; //初始化顶点数量
graph->arcsNum = 0; //初始化边数量
return graph;
}
创建图:
void creat_graph(Graph *graph,char *vexs,int *arcs)
{
for(int i = 0;i < graph->vexNum;i++)
{
graph->vexs[i] = vexs[i]; //为顶点赋值
for(int j = 0; j < graph->vexNum;j++)
{
graph->arcs[i][j] = *(arcs + i * graph->vexNum + j) ; //创建邻接表
if(graph->arcs[i][j] != 0) //二维数组不等于0是存在边,边数加 1
graph->arcsNum ++;
}
}
for(int i = 0;i < graph->vexNum;i++)
{
for(int j = 0; j < graph->vexNum;j++)
{
printf("%d\t",graph->arcs[i][j]);
}
printf("\n");
}
printf("\n");
graph->arcsNum /= 2; //无向图两顶点之间是没有方向的,
}
DFS遍历:
void DFS(Graph *graph,int *flag,int index)
{
//打印结点内容
printf("%c\t",graph->vexs[index]);
//标记已访问
flag[index] = 1;
//遍历二维数组
for(int i = 0;i < graph->vexNum;i++)
{ //如果未访问过且存在边的关系则访问结点
if(graph->arcs[index][i] == 1 && !flag[i])
{
DFS(graph,flag,i);
}
}
}
测试:
#include "graph.h"
void main()
{
Graph *graph = initgraph(5);
int *flag = (int *)malloc(sizeof(int) * graph->vexNum);
for(int i = 0;i < graph->vexNum;i++)
{
flag[i] = 0;
}
int arcs[5][5] = {
0,1,1,1,0,
1,0,1,1,1,
1,1,0,0,0,
1,1,0,0,1,
0,1,0,1,0
};
creat_graph(graph,"ABCDE",(int *)arcs);
printf("DFS遍历结果:\n");
DFS(graph,flag,0);
printf("\n");
system("pause");
return ;
}
输出结果:
结果分析:
声明:此文章为学习笔记,如有侵权请联系删除。