1.用邻接矩阵作为存储结构,实现图的创建。2.把邻接矩阵转换为邻接表
时间: 2024-12-21 07:21:21 浏览: 16
数据结构学习--图的邻接矩阵和邻接表存储
1. **使用邻接矩阵作为存储结构实现图的创建**:
邻接矩阵是一种常见的图的存储方式,它是一个二维数组,其中的每个元素表示两个顶点之间是否存在边。如果节点i和节点j之间有边,那么矩阵中的元素A[i][j]通常被设置为非零值(如1或true),表示连接;如果没有边,则为0或false。
创建一个邻接矩阵图的基本步骤如下:
- 初始化一个与图中顶点数相等的二维数组,比如`int adjMatrix[numVertices][numVertices];`
- 对于每一对顶点(i, j),如果它们之间存在边,就在矩阵A[i][j]位置存储相关信息(通常是1、1代表有边);否则,保持为0或NULL。
```c
// 假设顶点数量为V
int V = numVertices;
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (adjacent[i][j]) { // adjacent[]是包含边信息的数组
adjMatrix[i][j] = 1;
} else {
adjMatrix[i][j] = 0;
}
}
}
```
2. **把邻接矩阵转换为邻接表**:
邻接列表则是另一种常用的图数据结构,对于每一个顶点,我们维护一个链接到其相邻顶点的链表。转换过程包括以下步骤:
- 对于邻接矩阵中的每个顶点i,遍历所有其他顶点j,如果A[i][j]不为0(表示有边),则添加一个新的节点到顶点i的链表中,该新节点指向顶点j,并记录相关的边的信息(如权重)。
```c
struct Edge {
int destination;
int weight; // 如果图是有权的
};
typedef struct Node {
int vertex;
struct Edge* edges; // 指向链表头部
int numEdges;
} Node;
void matrixToAdjList(int V, int adjMatrix[], Node** adjList) {
for (int i = 0; i < V; i++) {
adjList[i] = NULL;
for (int j = 0; j < V; j++) {
if (adjMatrix[i][j]) {
Edge* edge = (Edge*)malloc(sizeof(Edge));
edge->destination = j;
edge->weight = someWeight[j]; // 如果图是有权的
if (adjList[i] == NULL) {
adjList[i] = edge;
} else {
Edge* current = adjList[i];
while (current->next != NULL) {
current = current->next;
}
current->next = edge;
}
adjList[i]->numEdges++;
}
}
}
}
```
阅读全文