给定一个带权有向图的邻接矩阵存储结构g,创建对应的邻接表存储结构G
时间: 2023-09-04 15:07:13 浏览: 111
数据结构学习--图的邻接矩阵和邻接表存储
创建邻接表存储结构G的步骤如下:
1. 定义邻接表的结构体,包括顶点结构体和边结构体。
```c++
struct Vertex {
int data; // 顶点数据
Edge* firstEdge; // 指向第一条依附该顶点的边的指针
};
struct Edge {
int adjvex; // 该边的邻接点编号
int weight; // 该边的权值
Edge* next; // 指向下一条依附同一顶点的边的指针
};
```
2. 遍历邻接矩阵g,将每个顶点和与其相邻的顶点存储到邻接表G中。
```c++
Vertex G[MAX_VERTEX_NUM]; // 定义邻接表
int n = g.n; // 顶点个数
for (int i = 0; i < n; i++) {
// 初始化每个顶点的数据和第一条边的指针
G[i].data = i;
G[i].firstEdge = NULL;
for (int j = 0; j < n; j++) {
if (g.edges[i][j] != 0) { // 存在一条边
Edge* p = new Edge; // 创建新的边结构体
p->adjvex = j; // 存储邻接点编号
p->weight = g.edges[i][j]; // 存储权值
p->next = G[i].firstEdge; // 将新边插入到顶点的边链表头部
G[i].firstEdge = p;
}
}
}
```
3. 创建完毕后,邻接表G即为所求。
完整的代码示例如下:
```c++
#include <iostream>
using namespace std;
const int MAX_VERTEX_NUM = 100;
struct Vertex {
int data; // 顶点数据
Edge* firstEdge; // 指向第一条依附该顶点的边的指针
};
struct Edge {
int adjvex; // 该边的邻接点编号
int weight; // 该边的权值
Edge* next; // 指向下一条依附同一顶点的边的指针
};
struct MGraph {
int n; // 顶点个数
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
};
void CreateGraph(MGraph& g) {
int n, m;
cin >> n >> m;
g.n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g.edges[i][j] = 0;
}
}
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
g.edges[u][v] = w;
}
}
void CreateAdjList(MGraph g, Vertex G[]) {
int n = g.n; // 顶点个数
for (int i = 0; i < n; i++) {
// 初始化每个顶点的数据和第一条边的指针
G[i].data = i;
G[i].firstEdge = NULL;
for (int j = 0; j < n; j++) {
if (g.edges[i][j] != 0) { // 存在一条边
Edge* p = new Edge; // 创建新的边结构体
p->adjvex = j; // 存储邻接点编号
p->weight = g.edges[i][j]; // 存储权值
p->next = G[i].firstEdge; // 将新边插入到顶点的边链表头部
G[i].firstEdge = p;
}
}
}
}
int main() {
MGraph g;
CreateGraph(g);
Vertex G[MAX_VERTEX_NUM];
CreateAdjList(g, G);
return 0;
}
```
阅读全文