基于C语言采用邻接矩阵存储方式建立图

一.图的结构体介绍

在开始之前我们先思考如何对图进行描述。图是由点和边构成的,要想用编程语言对图进行描述,就必须把点和边描述清楚。在采用邻接矩阵创建图时,我们需要用一个一维数组记录顶点的情况和一个二维数组记录边的情况。代码如下:

typedef char VerTexType;
typedef int ArcType;
typedef struct{
	int numv,nume;//记录点和边的数目
    VerTexType vers[maxnumv];//记录点
	ArcType arcs[maxnumv][maxnumv];//记录边
}AMGraph;

 这样我们就创建了一个图的结构体。

二.邻接矩阵介绍

邻接矩阵其实就是一个二维数组。我们知道边其实是两个顶点之间的关系,我们采用二维数组来记录边。因为二维数组有两个下标,i和j,可以代表两个点。我们先建立一个图:

 

这是一个有五个顶点五条边的图,我们先将顶点存入vers[5]中。如图:

 接下来我们就要有邻接矩阵来存储边的关系了。邻接矩阵是这样的,若两个顶点之间有边,则两个顶点对应的下标构成的二维数组的值为1,否则为0。比如先前建立的图的邻接矩阵为:

 

 不难发现,无向图的邻接矩阵是对称的。这样我们就对图中的边进行了描述。

 三.完整代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ok 1
#define error -1
#define maxnumv 100
typedef char VerTexType;
typedef int ArcType;
typedef int Status;
typedef struct{
	int numv,nume;
    VerTexType vers[maxnumv];
	ArcType arcs[maxnumv][maxnumv];
}AMGraph;
//获取顶点的下标
int Locate(AMGraph g,VerTexType c){
	int i;
	for(i=0;i<g.numv;i++){
		if(g.vers[i]==c){
			return i;
		}
	}
	return error;
}
Status CreatAMGraph(AMGraph *G){
	printf("请输入图的总顶点数和总边数:\n");
	scanf("%d %d",&(*G).numv,&(*G).nume);
	//对图的邻接矩阵进行初始化操作
	int i,j;
	for(i=0;i<(*G).numv;i++){
		for(j=0;j<(*G).numv;j++){
			(*G).arcs[i][j]=0;
		}
	}
	//完成各个点的输入
	for(i=0;i<(*G).numv;i++){
		printf("请输入第%d个点的名称:\n",i+1);
		getchar();
		scanf("%c",&(*G).vers[i]);
	}
	//完成各条边的输入
	for(i=1;i<=(*G).nume;i++){
		printf("请输入第%d条边的两个顶点的名称:\n",i);
		getchar();
		VerTexType c1,c2;
		int x,y;
		scanf("%c %c",&c1,&c2);
		x=Locate((*G),c1);
		y=Locate((*G),c2);
		(*G).arcs[x][y]=1;
		(*G).arcs[y][x]=1;
	}
}
//输出图的邻接矩阵
void ShowAMGraph(AMGraph g){
	int i,j;
	printf(" ");
	for(i=0;i<g.numv;i++){
		printf(" %c",g.vers[i]);
	}
	printf("\n");
	for(i=0;i<g.numv;i++){
		printf("%c ",g.vers[i]);
		for(j=0;j<g.numv;j++){
			printf("%d ",g.arcs[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	AMGraph G;
	CreatAMGraph(&G);
	ShowAMGraph(G);
	return 0;
}

运行结果如图:

 

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以帮你解答这个问题。 在使用邻接矩阵存储时,我们可以用一个二维数组来表示中各个顶点之间的连通关系。具体来说,如果顶点i和j之间有边相连,那么邻接矩阵中第i行第j列的元素值就为1,否则为0。 以下是一个用 C 语言实现邻接矩阵存储的示例代码: ``` #define MAX_VERTICES 100 // 中最多有100个顶点 int adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵 int main() { int numVertices, numEdges; scanf("%d%d", &numVertices, &numEdges); // 输入的顶点数和边数 // 初始化邻接矩阵 for (int i = 0; i < numVertices; i++) for (int j = 0; j < numVertices; j++) adjMatrix[i][j] = 0; // 读入边信息,更新邻接矩阵 for (int i = 0; i < numEdges; i++) { int u, v; scanf("%d%d", &u, &v); // 输入一条边的两个顶点 // 对于无向,需要在邻接矩阵中同时更新u->v和v->u这两个位置 adjMatrix[u][v] = 1; adjMatrix[v][u] = 1; } // 输出邻接矩阵 for (int i = 0; i < numVertices; i++) { for (int j = 0; j < numVertices; j++) printf("%d ", adjMatrix[i][j]); printf("\n"); } return 0; } ``` 以上代码中,我们首先定义了一个二维数组 `adjMatrix` 来存储邻接矩阵。在 `main()` 函数中,我们首先读入的顶点数和边数,然后初始化邻接矩阵中所有元素的值为0。 接着,我们读入每条边的信息,并在邻接矩阵中更新相应的位置。需要注意的是,对于无向,我们需要在邻接矩阵中同时更新两个位置,即 `adjMatrix[u][v]` 和 `adjMatrix[v][u]`。 最后,我们输出邻接矩阵中的所有元素,以便查看存储的结果。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值