typedef struct ArcNode{ //表结点 int adjvex; //邻接点的位置 struct ArcNode *nextarc; //指向下一个表结点的指针 }ArcNode; typedef struct VNode{ char data; //顶点信息 ArcNode *firstarc; //指向第一个表结点的指针 }VNode, AdjList[MVNum]; //AdjList表示邻接表类型 typedef struct{ AdjList vertices; //头结点数组 int vexnum, arcnum; //图的当前顶点数和边数 }ALGraph;建立一个无向图,采用邻接表做为存储结构。输入信息为:第一行给出图的顶点数n和边数e。第二行给出n个字符,表示n个顶点的数据元素的值。后面是e行,给出每一条边的两个顶点的值(顶点之间无空格)。 输出每个顶点的值以及各顶点的邻接点的值。 输入样例: 7 9 0123456 02 03 04 13 15 23 25 45 56 输出样例: 0: 4 3 2 1: 5 3 2: 5 3 0 3: 2 1 0 4: 5 0 5: 6 4 2 1 6: 5
时间: 2024-03-23 18:38:59 浏览: 58
好的,这个问题是关于邻接表存储结构的无向图建立和遍历的问题。以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MVNum = 100; // 最大顶点数
typedef struct ArcNode {
int adjvex; // 邻接点的位置
struct ArcNode *nextarc; // 指向下一个表结点的指针
} ArcNode;
typedef struct VNode {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一个表结点的指针
} VNode, AdjList[MVNum]; // AdjList表示邻接表类型
typedef struct {
AdjList vertices; // 头结点数组
int vexnum, arcnum; // 图的当前顶点数和边数
} ALGraph;
// 建立无向图
void CreateGraph(ALGraph &G) {
cin >> G.vexnum >> G.arcnum;
for (int i = 0; i < G.vexnum; i++) {
cin >> G.vertices[i].data;
G.vertices[i].firstarc = NULL;
}
for (int k = 0; k < G.arcnum; k++) {
int i, j;
cin >> i >> j;
// 生成一个新的表结点
ArcNode *p = new ArcNode;
p->adjvex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p; // 将新节点插入到顶点i的边表头部
// 由于是无向图,所以边需要建立双向
p = new ArcNode;
p->adjvex = i;
p->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p; // 将新节点插入到顶点j的边表头部
}
}
// 输出邻接表
void PrintGraph(ALGraph G) {
for (int i = 0; i < G.vexnum; i++) {
cout << G.vertices[i].data << ": ";
ArcNode *p = G.vertices[i].firstarc;
while (p != NULL) {
cout << G.vertices[p->adjvex].data << " ";
p = p->nextarc;
}
cout << endl;
}
}
int main() {
ALGraph G;
CreateGraph(G);
PrintGraph(G);
return 0;
}
```
希望能帮到你!
阅读全文