1、已知无向图的邻接矩阵,求无向图的邻接表。 (1)提示:无向图如下图(a)所示,已知邻接矩阵如图(b)所示,求对应的邻接表(c)。 (2)请定义void adjMatrix_2_adjList(int b[4][4], AdjList a)函数
时间: 2023-06-11 21:09:19 浏览: 90
无向图的邻接表表示
4星 · 用户满意度95%
(a) 无向图示意图:
```
1 --- 2
/ \ / \
3 - 4-5 - 6
```
(b) 无向图的邻接矩阵:
```
1 2 3 4 5 6
1 0 1 1 0 0 0
2 1 0 0 1 1 0
3 1 0 0 1 0 0
4 0 1 1 0 1 1
5 0 1 0 1 0 1
6 0 0 0 1 1 0
```
(c) 无向图的邻接表:
```
1: 2 -> 3
2: 1 -> 4 -> 5
3: 1 -> 4
4: 3 -> 2 -> 5 -> 6
5: 2 -> 4 -> 6
6: 4 -> 5
```
定义void adjMatrix_2_adjList(int b[4][4], AdjList a)函数的代码如下所示:
```c++
#define MAX_VERTEX_NUM 100
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
//InfoType info; // 网络的边权值
} ArcNode; // 边结点
typedef struct VNode {
//VertexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM]; // 头结点
void adjMatrix_2_adjList(int b[4][4], AdjList a) {
int i, j;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
a[i].firstarc = nullptr;
}
for (i = 0; i < 4; i++) {
for (j = i; j < 4; j++) {
if (b[i][j] == 1) {
// 初始化一个弧结点
ArcNode *node1 = new ArcNode();
node1->adjvex = j;
node1->nextarc = a[i].firstarc;
a[i].firstarc = node1;
// 由于是无向图,还需要初始化一个反向弧结点
ArcNode *node2 = new ArcNode();
node2->adjvex = i;
node2->nextarc = a[j].firstarc;
a[j].firstarc = node2;
}
}
}
}
```
阅读全文