C语言算法图的基本操作

算法与数据结构的图是不常使用的,而且操作上比较繁琐,但不得不说花样很多所以我还是参考了很多其他博主的代码和书上的代码进行了实现
直接看代码:

#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, &
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值