邻接矩阵和邻接表c语言计算入度出度
时间: 2024-11-22 14:19:52 浏览: 44
在图论中,邻接矩阵和邻接表是两种常用的表示图的数据结构。
**邻接矩阵**:它是一个二维数组,其中的元素表示两个顶点之间是否存在边。如果第i行第j列的值为非零,表示从顶点i到顶点j有一条边。计算每个顶点的入度(即指向它的边的数量)和出度(即从它出发的边的数量),可以通过遍历矩阵的对应行和列来进行。例如,在矩阵`adjMatrix[i]`中,入度为第i行的所有非零元素之和,出度则为第i列的所有非零元素之和。
```c
int getDegreeAdjMat(int adjMatrix[][n], int vertex) {
int inDegree = 0, outDegree = 0;
for (int i = 0; i < n; i++) {
if (adjMatrix[vertex][i] != 0) {
inDegree++; // 如果有向边,增加入度
outDegree += adjMatrix[i][vertex]; // 如果无向边,两边都算一次
}
}
return inDegree, outDegree;
}
```
**邻接表**:它是一系列链表,每个链表节点包含一个顶点及其连接的相邻顶点列表。对于邻接表,我们需要遍历每个顶点的链表,统计经过该顶点的边数。由于邻接表通常只存储直接相连的顶点,入度和出度可以在链表上分别累加:
```c
struct Edge {
int destination;
struct Edge* next;
};
void computeDegrees(struct Edge** adjList, int numVertices, int* inDegree, int* outDegree, int vertex) {
struct Edge* current = adjList[vertex];
*inDegree = 0;
while (current != NULL) {
*inDegree++;
current = current->next;
}
current = adjList[vertex]; // 再次从头开始找,因为可能有多个出边
*outDegree = 0;
while (current != NULL) {
*outDegree++;
current = current->destination->adjList;
}
}
```
阅读全文