有向图的邻接矩阵表示求各节点的度、出度和入度-----数据结构与算法笔记

📚 参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。

🍋 邻接矩阵表示的补充

🚗 无论是无向图还是有向图的邻接矩阵表示,主对角线都是0,理由:顶点本身无法连接;

🚗 无向图的邻接矩阵表示图是对称矩阵;如下图1;

🚗 邻接矩阵表示无向图的优点在于:
  🚲 LocateVex(G,V)定位函数判断图中任意两个顶点是否邻接,寻找顶点的邻接点,求顶点的度等操作易于实现,算法简单、直观,易于理解;
  🚲 对于无向图,计算任意顶点的度,对应的行(列)的非零个数;
  🚲 对于有向图,对应行的非零元个数是出度,对应列的非零元个数是入度;

如下图1中:V1的度为2,V2的度为1,V3的度为2,V4的度为1;
如下图2中:V1的出度为2,入度为1;V2的出度为0,入度为1;V3的出度为1,入度为1,V4的出度为1,入度为1;
在这里插入图片描述

🚗 无向图、有向图的邻接矩阵表示和无向网、有向网的邻接矩阵表示区别在于是否有权值,如下:
在这里插入图片描述

🔗 相关代码:

#include "stdio.h"
#include "stdlib.h"
#define TRUE     1
#define FALSE    0
#define OK       1
#define ERROR    0
#define OVERFLOW	-2
#define INFINITY INT_MAX	//最大值 
#define MAX_VERTEX_NUM 20	//最大顶点数 

typedef int Status;
typedef int VertexType;
typedef struct {
	VertexType	vexs[MAX_VERTEX_NUM];		//顶点向量
	int	arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];		//邻接矩阵
	int vexnum,arcnum;		//图的当前顶点数和弧数
} MGraph;

Status LocateVex(MGraph G,VertexType v);
//定位v在邻接矩阵中的位置
Status LocateVex(MGraph G,VertexType v) {
	int i;
	for(i=0; i<G.vexnum; i++) {
		if(G.vexs[i]==v) return i;
	}
	return -1; 
}

Status CreateDGraph(MGraph &G);
//构造邻接矩阵表示的有向图DG
Status CreateDGraph(MGraph &G) {
	printf("请输入当前顶点数和弧数(空格隔开):");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	int i,j,k;
	int v1,v2,w;	//弧尾和弧头及权值 
	for(i=0; i<G.vexnum; i++) {
		printf("请输入第%d个的顶点信息:",i+1);
		scanf("%d",&G.vexs[i]);
	}
	printf("\n");
	for(i=0; i<G.vexnum; i++) 	//初始化邻接矩阵
		for(j=0; j<G.vexnum; j++) {
			G.arcs[i][j]={INFINITY};
		}
	for(k=0; k<G.arcnum; k++) {
		printf("请输入第%d条边的起点序号和终点序号(空格隔开):",k+1);
		scanf("%d %d",&v1,&v2);
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		if(i==-1 || j==-1) return ERROR;
		else{
			G.arcs[i][j]=1;
		}
	}
	return OK;
}

Status PrintDGraph(MGraph G);
//打印图
Status PrintDGraph(MGraph G) {
	int i,j;
	printf("\n有向图的顶点为:\n");
	for(i=0; i<G.vexnum; i++)
		printf("V%d ",G.vexs[i]);
	printf("\n有向图的邻接矩阵为:\n");
	printf("\t");
	for(i=0; i<G.vexnum; ++i)
		printf("%8d", G.vexs[i]);
	putchar('\n');
	for(i=0; i<G.vexnum; ++i) {
		printf("\n%8d", G.vexs[i]);
		for(j=0; j<G.vexnum; ++j) {
			if(G.arcs[i][j] == INT_MAX) printf("%8s", "0");
			else printf("%8d",G.arcs[i][j]);
		}
		printf("\n");
	}
	return OK;
}

Status InDegree(MGraph G);
//求有向图各顶点的入度  
Status InDegree(MGraph G){
	int i,j,into;
	for(i=0; i<G.vexnum; i++){
		into=0;
		for(j=0; j<G.vexnum; j++){
			if(G.arcs[j][i] != INT_MAX) {
				into++;
			}
		}
		if(into == 0) printf("\n顶点V%d没有入度\n",G.vexs[i]);
		else printf("\n顶点V%d的入度为:%d\n",G.vexs[i],into);
	}
} 

Status OutDegree(MGraph G);
//求有向图各顶点的出度
Status OutDegree(MGraph G) {
	int i,j, out;
	for(i=0; i<G.vexnum; i++) {
		out=0;	//初始为0
		for(j=0; j<G.vexnum; j++) {
			if(G.arcs[i][j] != INT_MAX) {
				out++;
			}
		}
		if(out==0) printf("\n顶点V%d没有出度\n",G.vexs[i]);
		else printf("\n顶点V%d的出度为:%d\n",G.vexs[i],out);
	}
}

Status Degree(MGraph G);
//求有向图各顶点的度
Status Degree(MGraph G) {
	int i,j,deg;
	for(i=0; i<G.vexnum; i++){
		deg=0;
		for(j=0; j<G.vexnum; j++){
			if(G.arcs[i][j]!=INT_MAX || G.arcs[j][i]!=INT_MAX)
				deg++;
		}
		if(deg==0) printf("\n顶点V%d没有度\n",G.vexs[i]);
		else printf("\n顶点V%d的度为:%d\n",G.vexs[i],deg);
	}
} 

int main(void) {
	MGraph G;
	CreateDGraph(G);
	PrintDGraph(G);
	putchar('\n');
	OutDegree(G);
	putchar('\n');
	InDegree(G);
	putchar('\n');
	Degree(G);
	return 0;
}

🌔 实现:
在这里插入图片描述

  • 24
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王桐学

谢谢,只求点赞哟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值