完整程序:
#include <windows.h>
#include <stdio.h>
typedef struct Graph
{
char *vexs; // 顶点元素
int **arcs; // 邻接表
int vexNum; // 顶点数量
int arcsNum; // 边数量
}Graph;
typedef struct Edge
{
char vex; //存储顶点
int weight; //存储顶点对应的权重
}Edge;
/*
1、顶点之间不存在边的关系 邻接矩阵的值为 MAX
2、如果是顶点本身,邻接矩阵的值为 0
*/
#define MAX 32767
Graph *initgraph(int vexNum);
void creat_graph(Graph *graph,char *vexs,int *arcs);
void DFS(Graph *graph,int *flag,int index);
Edge *Init_Edge(Graph *graph,int index);
int Get_Min_Edge(Edge *edge,Graph *graph); //获取最小权重下标
void prim(Graph *graph,int index); //普利姆算法
void main()
{
Graph *graph = initgraph(6);
int *flag = (int *)malloc(sizeof(int) * graph->vexNum);
for(int i = 0;i < graph->vexNum;i++)
{
flag[i] = 0;
}
int arcs[6][6] = {
0,6,1,5,MAX,MAX,
6,0,5,MAX,3,MAX,
1,5,0,5,6,4,
5,MAX,5,0,MAX,2,
MAX,3,6,MAX,0,6,
MAX,MAX,4,2,6,0,
};
creat_graph(graph,"123456",(int *)arcs);
printf("DFS遍历结果:\n");
DFS(graph,flag,0);
printf("\n");
prim(graph,0);
system("pause");
return ;
}
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 && graph->arcs[i][j] != MAX) //二维数组不等于0且不等于最大值时存在边,边数加 1
graph->arcsNum ++;
}
}
graph->arcsNum /= 2; //无向图两顶点之间是没有方向的,
}
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] > 0 && graph->arcs[index][i] != MAX && !flag[i])
{
DFS(graph,flag,i);
}
}
}
Edge *Init_Edge(Graph *graph,int index)
{
Edge *edge = (Edge *)malloc(sizeof(Edge) * graph->vexNum);
for(int i = 0;i < graph->vexNum;i++)
{
edge[i].vex = graph->vexs[index];
edge[i].weight = graph->arcs[index][i];
}
return edge;
}
int Get_Min_Edge(Edge *edge,Graph *graph)
{
int index;
int min = MAX;
for(int i = 0;i < graph->vexNum;i++)
{ //遍历找到与当前顶点权重最小的顶点下标
if(edge[i].weight != 0 && min > edge[i].weight)
{
min = edge[i].weight;
index = i;
}
}
return index;
}
void prim(Graph *graph,int index)
{
int min;
Edge *edge = Init_Edge(graph,index);
for(int i = 0;i < graph->vexNum - 1;i++)
{
min = Get_Min_Edge(edge,graph); //获取最小权重顶点的下标
printf("v%c --> v%c,weight = %d\n",edge[min].vex,graph->vexs[min],edge[min].weight);
edge[min].weight = 0;
for(int j = 0;j < graph->vexNum;j++)
{
if(graph->arcs[min][j] < edge[j].weight)
{
edge[j].weight = graph->arcs[min][j];
edge[j].vex = graph->vexs[min];
}
}
}
}
测试结果:
声明:此文章为学习笔记,如有侵权请联系删除