领接矩阵(数据结构)

这篇博客介绍了如何用C语言实现图的领接矩阵数据结构,并提供了创建和显示图的函数。通过输入顶点数和边数,然后逐个输入顶点信息和边连接,程序会构建一个领接矩阵并将其打印出来。这有助于理解图的抽象数据类型及其在图论中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<stdio.h>
#define MAX 100//最大顶点个数 
typedef struct{
	int n,e;//顶点数、边数 
	char vexs[MAX];//顶点数组
	int deges[MAX][MAX];//边的领接矩阵 
}MGraph;
//图的领接矩阵建立函数 
void CreateMGraph(MGraph* G,char* arr){
	int i,j,k;
	char ch1,ch2;
	printf("输入顶点个数:");
	scanf("%d",&G->n);
	printf("输入边的数:");
	scanf("%d",&G->e);
	printf("输入各顶点信息(每个人顶点以回车结束):\n");
	for(i = 0;i < G->n ;i++){
		getchar();
		printf("输入第%d个顶点:",i+1);
		scanf("%c",&(G->vexs[i]));
		arr[i] = G->vexs[i];
	}
	for(i = 0 ;i < G->n;i++){
		for(j = 0;j < G->n;j++){
			G->deges[i][j] = 0; 
		}
	}
	for(k = 0;k < G->e;k++){
		getchar();
		printf("建立第%d条边(输入格式:顶点1,顶点2):",k+1);
		scanf("%c,%c",&ch1,&ch2);
		for(i = 0;i < G->n ;i++){
			for(j = 0;j < G->n;j++){
				if(ch1 == G->vexs[i] && ch2 == G->vexs[j]){
					G->deges[i][j] = 1;//与矩阵的转置一致
					G->deges[j][i] = 1;
				}
			}
		}
	}
}
void DispMGaph(MGraph G,char* arr){
	int i,j;
	printf("\n图的领接矩阵\n");
	for(i = 0;i < G.n;i++){//输出矩阵的表头 
		if(!i){
			printf("%10c",arr[i]);
		}else{
			printf("%5c",arr[i]);
		}
		
	}
	printf("\n");
	for(i = 0;i < G.n;i++){
		printf("%5c",arr[i]);
		for(j = 0;j < G.n;j++){
			printf("%5d",G.deges[i][j]);
		}
		printf("\n");
	}
}
int main(){
	char arr[MAX];//存放矩阵的表头
	MGraph G;
	CreateMGraph(&G,arr);
	DispMGaph(G,arr);
	return 0;
}

        有什么好的想法讨论区等你!

                                  

### 邻接矩阵与邻接表的概念及使用场景 #### 概念解析 **邻接矩阵**是一种通过二维数组表示图中顶点间关系的数据结构。对于一个包含 \( n \) 个顶点的图,邻接矩阵是一个 \( n \times n \)矩阵,其中矩阵元素 \( A[i][j] \) 表示从顶点 \( i \) 到顶点 \( j \) 是否存在边。如果存在边,则 \( A[i][j] \) 的值为边的权重(或1表示无权图);否则为0[^2]。 **邻接表**则是通过链表或其他动态数据结构来存储每个顶点的所有邻居节点。具体而言,每个顶点对应一个链表,链表中的每个节点代表与该顶点相连的一个邻居节点及其边的权重(若有)。这种结构的空间复杂度为 \( O(V + E) \),其中 \( V \) 和 \( E \) 分别表示顶点数和边数[^1]。 --- #### 区别分析 1. **空间复杂度** - 邻接矩阵的空间复杂度为 \( O(n^2) \),适合表示稠密图(即边数接近于顶点数平方的图)。然而,在稀疏图中,大部分矩阵元素为0,导致空间浪费严重。 - 邻接表的空间复杂度为 \( O(V + E) \),能够更高效地存储稀疏图中的边信息,避免了不必要的空间占用[^1]。 2. **时间复杂度** - 在邻接矩阵中,判断两个顶点之间是否存在边的操作可以通过直接访问矩阵元素完成,时间复杂度为 \( O(1) \)。但遍历所有邻居节点的时间复杂度为 \( O(n) \)[^2]。 - 在邻接表中,判断两个顶点之间是否存在边需要遍历对应顶点的链表,时间复杂度为 \( O(\deg(v)) \),其中 \( \deg(v) \) 是顶点 \( v \) 的度。而遍历所有邻居节点的时间复杂度为 \( O(\deg(v)) \)。 3. **灵活性** - 邻接矩阵由于固定大小的二维数组限制,难以动态扩展顶点数量或调整边权重。 - 邻接表则因其基于链表的结构,能够灵活地添加或删除顶点和边[^2]。 --- #### 应用场景 1. **邻接矩阵适用场景** - 稠密图:当图中边数较多时,邻接矩阵的空间利用率较高。 - 快速查询:若频繁需要判断顶点间是否存在边或获取边的权重,邻接矩阵的优势明显。 - 固定规模图:在顶点数量固定且不会频繁变化的情况下,邻接矩阵是合适的选择。 2. **邻接表适用场景** - 稀疏图:当图中边数较少时,邻接表能够显著减少空间占用。 - 动态图:若图的顶点或边会频繁增删,邻接表的灵活性使其成为更好的选择。 - 大规模图:在处理大规模稀疏图时,邻接表的空间效率尤为重要。 --- #### 示例代码 以下分别展示邻接矩阵和邻接表的实现方式: ```python # 邻接矩阵实现 class AdjacencyMatrix: def __init__(self, size): self.matrix = [[0 for _ in range(size)] for _ in range(size)] def add_edge(self, u, v, weight=1): self.matrix[u][v] = weight def has_edge(self, u, v): return self.matrix[u][v] != 0 # 邻接表实现 class AdjacencyList: def __init__(self): self.graph = {} def add_edge(self, u, v, weight=1): if u not in self.graph: self.graph[u] = [] self.graph[u].append((v, weight)) def has_edge(self, u, v): return any(node[0] == v for node in self.graph.get(u, [])) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值