已知一个带权有向图,其存储结构为邻接表结构,请用C语言编程设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值,参见下面用例。 输入 4 a b c d 1 1 2 4 -1 2 2 3 9 -1 3 6 -1 0 3 1 5 2 8 -1 输出 a (0,2)4 (0,1)1 b (1,3)9 (1,2)2 c (2,3)6 d (3,2)8 (3,1)5 (3,0)3
时间: 2023-11-23 14:06:51 浏览: 174
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 边表节点
typedef struct EdgeNode {
int adjvex; // 相邻节点编号
int weight; // 权值
struct EdgeNode* next; // 下一个边表节点
} EdgeNode;
// 顶点节点
typedef struct VertexNode {
char data; // 顶点信息
EdgeNode* firstedge; // 第一个边表节点
} VertexNode;
// 邻接表
typedef struct {
VertexNode* vertexList; // 顶点数组
int numVertexes; // 顶点数
} GraphAdjList;
// 建立邻接表
void CreateALGraph(GraphAdjList* G) {
int i, j, k, w;
EdgeNode* e;
// 输入顶点数
printf("请输入图的顶点数:");
scanf("%d", &G->numVertexes);
// 初始化顶点数组
G->vertexList = (VertexNode*)malloc(sizeof(VertexNode) * G->numVertexes);
for (i = 0; i < G->numVertexes; ++i) {
G->vertexList[i].data = getchar(); // 吸收换行符
G->vertexList[i].data = getchar(); // 输入顶点信息
G->vertexList[i].firstedge = NULL; // 初始化第一个边表节点
}
// 输入边的信息
for (i = 0; i < G->numVertexes; ++i) {
printf("请输入%c顶点的边表信息(格式:相邻顶点编号1 权值1 相邻顶点编号2 权值2 ... -1):", G->vertexList[i].data);
j = 0;
while (1) {
scanf("%d", &k);
if (k == -1) break;
scanf("%d", &w);
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = k;
e->weight = w;
e->next = G->vertexList[i].firstedge;
G->vertexList[i].firstedge = e;
}
}
}
// 输出邻接表
void PrintALGraph(GraphAdjList G) {
int i;
EdgeNode* e;
// 遍历顶点数组
for (i = 0; i < G.numVertexes; ++i) {
printf("%c ", G.vertexList[i].data);
// 遍历边表
e = G.vertexList[i].firstedge;
while (e) {
printf("(%d,%d)%d ", i, e->adjvex, e->weight);
e = e->next;
}
printf("\n");
}
}
int main() {
GraphAdjList G;
CreateALGraph(&G);
PrintALGraph(G);
return 0;
}
```
输入示例:
```
4
a b c d
1 1 2 4 -1
2 2 3 9 -1
3 6 -1
0 3 1 5 2 8 -1
```
输出示例:
```
a (0,2)4 (0,1)1
b (1,3)9 (1,2)2
c (2,3)6
d (3,2)8 (3,1)5 (3,0)3
```
阅读全文