C语言:已知一个带权有向图,其存储结构为邻接表结构 ,设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值,参见下面用例。
时间: 2024-02-02 22:03:28 浏览: 80
以下是一份用 C 语言实现建立带权有向图邻接表并输出的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 100 // 最大顶点数
struct EdgeNode {
int adjvex; // 该边所连的顶点的位置
int weight; // 边的权值
struct EdgeNode* next; // 指向下一条边的指针
};
struct VertexNode {
int data; // 顶点的数据,可以是任意类型
struct EdgeNode* firstedge; // 指向第一条边的指针
};
VertexNode adjList[MAXV]; // 存储所有顶点的数组
int n; // 顶点数量
void addEdge(int u, int v, int w) { // u 和 v 是边的两个端点,w 是边的权值
EdgeNode* edge = new EdgeNode;
edge->adjvex = v;
edge->weight = w;
edge->next = adjList[u].firstedge;
adjList[u].firstedge = edge;
}
void createAdjList() { // 从键盘输入数据,建立邻接表
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &adjList[i].data);
adjList[i].firstedge = NULL;
int v, w;
while (scanf("%d", &v) && v != -1) {
scanf("%d", &w);
addEdge(i, v, w);
}
}
}
void printAdjList() { // 输出邻接表
for (int i = 0; i < n; i++) {
printf("%d -> ", adjList[i].data);
EdgeNode* p = adjList[i].firstedge;
while (p != NULL) {
printf("(%d)%d -> ", p->weight, adjList[p->adjvex].data);
p = p->next;
}
printf("NULL\n");
}
}
int main() {
createAdjList();
printAdjList();
return 0;
}
```
使用示例:
```
输入:
4
1 2 3 4
1 1 2 2 -1
2 3 3 -1
3 4 4 -1
4 -1
输出:
1 -> (2)2 -> (3)3 -> NULL
2 -> (3)3 -> NULL
3 -> (4)4 -> NULL
4 -> NULL
```
阅读全文