请用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-12-08 15:06:44 浏览: 145
以下是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* first; // 指向第一个邻接点的指针
} VertexNode;
void createGraph(VertexNode* G, int n) {
// 根据输入建立邻接表
for (int i = 0; i < n; i++) {
// 输入顶点信息
char c;
scanf(" %c", &c);
G[i].data = c;
G[i].first = NULL;
// 输入该顶点对应边的信息
int v, w;
scanf("%d%d", &v, &w);
while (v != -1) {
EdgeNode* e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = v;
e->weight = w;
e->next = G[i].first;
G[i].first = e;
scanf("%d%d", &v, &w);
}
}
}
void printGraph(VertexNode* G, int n) {
// 输出邻接表
for (int i = 0; i < n; i++) {
printf("%c ", G[i].data);
EdgeNode* e = G[i].first;
while (e != NULL) {
printf("(%d,%d)%d ", i, e->adjvex, e->weight);
e = e->next;
}
printf("\n");
}
}
int main() {
int n;
scanf("%d", &n);
VertexNode* G = (VertexNode*)malloc(n * sizeof(VertexNode));
createGraph(G, n);
printGraph(G, n);
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,2)2 (1,3)9
c (2,3)6
d (3,0)3 (3,1)5 (3,2)8
```
阅读全文