数据结构:图的邻接矩阵存储

1、 图的存储方法:邻接矩阵存储(无向图)

测试数据:
4 5
A B C D
0 1
0 2
0 3
1 2
1 3

邻接矩阵:

顶点ABCD
A0111
B1011
C1100
D1100

#include<iostream>
#include<malloc.h>
using namespace std;     //vertex:顶点    arc:弧    adjacent:邻近的 
#define MaxVertexNum 100  //最大顶点数
typedef char VertexType;  //顶点的数据类型
typedef int EdgeType;   //边的数据类型
typedef struct{
	VertexType Vex[MaxVertexNum];  //定点表 
	EdgeType  Edge[MaxVertexNum][MaxVertexNum];  //邻接矩阵,边表 
	int vernum,arcnum; //图的当前顶点数和弧数 
}MGraph; //适合存储稠密图 

//邻接矩阵法创建一个图 
void CreateGraph(MGraph *G)
{
	int i,j,k,w;
	printf("请输入图的顶点数和边数:");
	cin>>G->vernum>>G->arcnum;
	printf("请输入图的各个顶点的信息(A,B…):");
	for(i=0;i<G->vernum;i++)
		cin>>G->Vex[i];//"%c"中%c后面要有空格 
	for(i=0;i<G->vernum;i++)
	{
		for(j=0;j<G->vernum;j++)
			G->Edge[i][j]=0;		
	} 
	printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
	for(k=0;k<G->arcnum;k++)
	{//此为创建有向图的邻接矩阵 
		int Iindex,Jindex; 
		cin>>Iindex>>Jindex;
		G->Edge[Iindex][Jindex]=1;
		//如果加上G->Edge[j][i]=1;则建立的是无向图的邻接矩阵 
		G->Edge[Jindex][Iindex]=1;
	}		
} 

//打印邻接矩阵
void DisplayMGraph(MGraph G)
{
	int i,j;
	printf("	");
	for(i=0;i<G.vernum;i++)
	printf("%c ",G.Vex[i]);
	for(i=0;i<G.vernum;i++)
	{
		printf("\n%c\t",G.Vex[i]);
		for(j=0;j<G.vernum;j++)
			printf("%d ",G.Edge[i][j]); 
	}	
} 

//求图G中顶点x的第一个邻接点
int FirstNeighbor(MGraph G,char x)
{
	int i,j;
	for(i=0;i<G.vernum;i++)//找到x在顶点表中的位置 
	{
		if(x==G.Vex[i])
			break; 
	}
	for(j=0;j<G.vernum;j++)//在邻接矩阵中找到x所在行的值为1的元素。 
	{
		if(G.Edge[i][j]==1)
			break;
	}
	if(j<G.vernum)
		return j;
	else
		return -1; 
} 

//求图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号
//若y是x的最后一个邻接点,则返回-1
int NextNeighbor(MGraph G, char x,char y)
{
	int i,j,k;
	for(i=0;i<G.vernum;i++)
	{
		if(x==G.Vex[i])
			break; 
	}
	for(j=0;j<G.vernum;j++)//在邻接矩阵中找到x所在行的值为1的元素。 
	{
		if(G.Vex[j]==y&&G.Edge[i][j]==1)
			break;
	}
	for(k=j+1;k<G.vernum;k++)
		if(G.Edge[i][k]==1)
			break;
	if(k<=G.vernum)
		return k;
	else
		return -1; 
} 

int main()
{
	MGraph G;
	CreateGraph(&G);
	printf("图的邻接矩阵如下:\n");
	DisplayMGraph(G);
	int index1=FirstNeighbor(G,'A');
	if(index1!=-1)
		printf("\n顶点A的第一个邻接点是%c\n",G.Vex[index1]);
	else
		printf("顶点A没有邻接点!\n");
	int index2=NextNeighbor(G,'A','C');
	if(index2!=-1)
		printf("\n顶点A的第一个邻接点是%c\n",G.Vex[index2]);
	else
		printf("顶点C是顶点A的最后一个邻接点!\n");
	return 0;
} 

运行截图

在这里插入图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

mlmlmlml1234567

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值