数据结构-图的基本操作(临接矩阵表示法,创建,获取3种位置序号,深度遍历)(详细注解)

#include<stdio.h>
#include<stdlib.h>

#pragma warning (disable:4996)//vs调试环境

#define MAX_VERTEX_NUM 20
typedef char VertexType;

typedef struct {
	VertexType vexs[MAX_VERTEX_NUM];//顶点向量
	int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//图的临接矩阵
	int vexnum, arcnum;//图的顶点数,边的个数
}MGraph;

int visited[MAX_VERTEX_NUM] = { 0 };

//获得顶点c的序号
int LocateVex(MGraph G, VertexType c)
{
	int i;
	for (i = 1;i <= G.vexnum;i++)//一个一个顶点的看
	{
		if (c == G.vexs[i])//如果顶点c= G.vexs[i]
			return i;//找到了,返回其序号i
	}
	return -1;//没找到,返回-1
}

//创建无向图
void CreateGraph(MGraph& G)
{
	//初始化环节
	int i, j;
	VertexType char1, char2;
	for (i = 0;i <= MAX_VERTEX_NUM - 1;i++)
	{
		for (j = 0;j <= MAX_VERTEX_NUM - 1;j++)
		{
			G.arcs[i][j] = 0;//令图的临接矩阵为0
		}
	}

	//创建环节
	printf("请输入图的顶点个数和边的个数\n");
	scanf("%d %d", &G.vexnum, &G.arcnum);
	getchar();
	printf("请依次输入顶点\n");
	for (i = 1;i <= G.vexnum;i++)
	{
		scanf("%c", &G.vexs[i]);//创建顶点向量
	}
	getchar();
	printf("请依次输入各条边(eg.AB回车):\n");
	for (i = 1;i <= G.arcnum;i++)
	{
		scanf("%c%c", &char1, &char2);
		getchar();
		int j, k;
		j = LocateVex(G, char1);//获得顶点char1在图中的序号,赋值给j
		k = LocateVex(G, char2);//获得顶点char2在图中的序号,赋值给k
		G.arcs[j][k] = 1;//无向图
		G.arcs[k][j] = 1;//存储邻接矩阵的二维数组中该元素置1,表示边存在
	}

	//输出环节
	printf("该图的各个顶点为: ");
	for (i = 1;i <= G.vexnum;i++)
		printf("%c ", G.vexs[i]);
	printf("\n该图的邻接矩阵为:\n");
	for (i = 1;i <= G.vexnum;i++)
	{
		for (j = 1;j <= G.vexnum;j++)
		{
			printf("%d ", G.arcs[i][j]);
		}
		printf("\n");
	}
}

//获得v的第一个邻接结点的序号
int FirstAdjVex(MGraph G, VertexType v)
{
	int i, j;
	i = LocateVex(G, v);//获得顶点v在图中的序号,赋值给i
	for (j = 1;j <= G.vexnum;j++)//一个一个顶点看
	{
		if (G.arcs[i][j] == 1)//如果i到j有边,则j为v的第一个邻接结点的序号
			return j;//返回j
	}
	return 0;//如果找不到,返回0
}

//获得图中v顶点的w邻接顶点之后的下一个顶点的序号
int NextAdjVex(MGraph G, VertexType v, VertexType w)
{
	int a, b, i;
	a = LocateVex(G, v);//获得顶点v在图中的序号,赋值给a
	b = LocateVex(G, w);//获得顶点w在图中的序号,赋值给b
	for (i = b + 1;i <= G.vexnum;i++)
	{
		if (G.arcs[a][i] == 1)//如果a到i有边,则i为v顶点的w邻接顶点之后的下一个顶点的序号
			return i;//找到了,返回i
	}
	return 0;//没找到,返回0
}

//无向图的从顶点v1的深度遍历
void DFS(MGraph G, VertexType v1)
{
	int i, w;
	i = LocateVex(G, v1);//获得顶点v1在图中的序号,赋值给a
	if (visited[i] == 0)//如果位置为i的顶点没有被访问过
	{
		printf("%c ", G.vexs[i]);//打印出来
		visited[i] = 1;//表示已经被访问过了
	}

	w = FirstAdjVex(G, v1);//如果访问过,则w为下一个顶点
	while (w)//只要w存在
	{
		if (visited[w] == 0)//如果序号为w的结点没有被访问
		{
			DFS(G, G.vexs[w]);//递归
		}
		w = NextAdjVex(G, v1, G.vexs[w]);//获得图中v顶点的w邻接顶点之后的下一个顶点的序号
	}
}

int main()
{
	MGraph G;
	CreateGraph(G);
	VertexType v1;
	v1 = G.vexs[1];
	printf("深度遍历结果为:");
	DFS(G, v1);
	printf("\n");
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值