请用c语言实现如下程序:已知一个带权有向图,其存储结构为邻接表结构 ,设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值,参见下面用例。
时间: 2023-11-27 13:03:05 浏览: 142
以下是实现该程序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ArcNode {
int adjvex; // 邻接点
int weight; // 权值
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点信息
ArcNode *first; // 指向第一个邻接点的指针
} VNode;
typedef struct {
VNode *vertices; // 存储所有顶点的数组
int vexnum; // 顶点数
} Graph;
// 创建一个邻接表存储的有向图
void createGraph(Graph *G) {
printf("请输入顶点数:");
scanf("%d", &(G->vexnum));
G->vertices = (VNode*) malloc(G->vexnum * sizeof(VNode));
printf("请输入每个顶点的信息:\n");
for (int i = 0; i < G->vexnum; i++) {
scanf("%d", &(G->vertices[i].data));
G->vertices[i].first = NULL;
}
printf("请输入每个顶点对应的边信息(以-1结束):\n");
for (int i = 0; i < G->vexnum; i++) {
int adjvex, weight;
printf("%d:", i);
while (1) {
scanf("%d%d", &adjvex, &weight);
if (adjvex == -1) break;
ArcNode *arc = (ArcNode*) malloc(sizeof(ArcNode));
arc->adjvex = adjvex;
arc->weight = weight;
arc->next = G->vertices[i].first;
G->vertices[i].first = arc;
}
}
}
// 输出邻接表存储的有向图
void printGraph(Graph G) {
printf("顶点数:%d\n", G.vexnum);
for (int i = 0; i < G.vexnum; i++) {
printf("%d:", i);
ArcNode *arc = G.vertices[i].first;
while (arc) {
printf("(%d)%d ", arc->adjvex, arc->weight);
arc = arc->next;
}
printf("\n");
}
}
int main() {
Graph G;
createGraph(&G);
printGraph(G);
return 0;
}
```
使用以下输入进行测试:
```
请输入顶点数:4
请输入每个顶点的信息:
0 1 2 3
请输入每个顶点对应的边信息(以-1结束):
0:1 1 2 2 -1
1:2 3 -1
2:3 4 0 1 -1
3:1 5 -1
```
输出结果如下:
```
顶点数:4
0:(2)2 (1)1
1:(2)3
2:(1)1 (3)4
3:(0)1
```
阅读全文