算法与数据结构的图是不常使用的,而且操作上比较繁琐,但不得不说花样很多所以我还是参考了很多其他博主的代码和书上的代码进行了实现
直接看代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
//图的结构:多对多的关系
//图中有点和边,点:数据,边:描述点之间的关系
//主要描述方式:邻接矩阵,邻接表
//邻接矩阵:基于数组->用一个一维数组存储顶点,用一个二位数组存储边
//邻接表:基于链表->用一个一维数组或者一个链表来存储所有顶点
//其中每个顶点都是一个链表的头结点,后面跟着所有能通过边到达的顶点
#define max 100
#define countless 32767
typedef enum {
FALSE, TRUE }sf;
sf visit[max];
//邻接矩阵
typedef struct graph
{
char vexs[max];//顶点
int arcs[max][max];//邻接矩阵
int vexnum;//顶点数
int edgenum;//边数
}g;
//获取顶点v的下标
int location(g* node, char v)
{
for (int i = 0; i < node->vexnum; i++)
{
if (v == node->vexs[i])
{
return i;//返回下标
}
else
{
/*printf("顶点不存在\n");*/
}
}
return -1;
}
//创建无向图
void creategraph1(g* node)
{
//输入边数和顶点数
printf("输入顶点数:");
scanf_s("%d", &node->vexnum);
printf("输入边数:");
scanf_s("%d", &node->edgenum);
//用户输入顶点
for (int i = 0; i < node->vexnum; i++)
{
printf("请输入第%d个顶点:",i+1);
scanf_s(" %c", &node->vexs[i], 1);
/*fflush(stdin);*/
}
//矩阵初始化
for (int i = 0; i < node->vexnum; i++)
{
for (int j = 0; j < node->vexnum; j++)
{
node->arcs[i][j] = 0;//让矩阵置空为0,即点都不连通
}
}
//构建无向图的邻接矩阵
char v1, v2;
int n, m;
printf("请输入边之间的关系(例:AB连通->AB):\n");
for (int i = 0; i < node->edgenum; i++)
{
/*fflush(stdin);*/
scanf_s(" %c %c", &v1, 1, &v2, 1);
n = location(node, v1);//获取顶点的下标
m = location(node, v2);
if (n == -1 || m == -1)
{
printf("顶点不存在\n");
return;
}
else
{
node->arcs[n][m] = 1;//无向图只要连通就是1
node->arcs[m][n] = 1;
}
}
}
//创建有向图
void creategraph2(g* node)
{
//输入顶点数和边数
printf("请输入顶点数:");
scanf_s("%d", &node->vexnum);
printf("请输入边数:");
scanf_s("%d", &node->edgenum);
//输入顶点
for (int i = 0; i < node->vexnum; i++)
{
printf("请输入第%d个顶点:", i + 1);
scanf_s(" %c", &node->vexs[i],1);
}
//邻接矩阵初始化
for (int i = 0; i < node->vexnum; i++)
{
for (int j = 0; j < node->vexnum; j++)
{
node->arcs[i][j] = 0;
}
}
//创建有向图的邻接矩阵
char v1, v2;
int n, m;
printf("请输入边之间的关系(例:AB有序连通->AB):\n");
for (int i = 0; i < node->edgenum; i++)
{
scanf_s(" %c %c", &v1, 1, &