用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↵
时间: 2024-02-13 08:06:53 浏览: 180
以下是建立邻接表并输出的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 顶点的最大个数
// 边表结点
typedef struct ArcNode {
int adjvex; // 邻接点在顶点数组中的下标
int weight; // 边的权值
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
// 顶点表结点
typedef struct VertexNode {
char data; // 顶点的信息
ArcNode *firstarc; // 指向第一个邻接点的指针
} VertexNode;
// 邻接表结构
typedef struct {
VertexNode adjlist[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
} AdjList;
// 创建邻接表
void createAdjList(AdjList *G) {
// 输入顶点数
printf("请输入图的顶点数:");
scanf("%d", &G->vexnum);
// 输入顶点信息
printf("请输入顶点信息(每个顶点用空格隔开):");
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->adjlist[i].data);
G->adjlist[i].firstarc = NULL;
}
// 输入边的信息
for (int i = 0; i < G->vexnum; i++) {
printf("请输入顶点%c对应的边的信息(每个边用顶点下标和边权值交替输入,以-1结束):", G->adjlist[i].data);
int adjvex, weight;
ArcNode *p, *q; // p指向新建的边表结点,q指向当前顶点的最后一个边表结点
p = q = NULL;
scanf("%d%d", &adjvex, &weight);
while (adjvex != -1 && weight != -1) {
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = adjvex;
p->weight = weight;
p->next = NULL;
if (G->adjlist[i].firstarc == NULL) { // 当前顶点还没有邻接点
G->adjlist[i].firstarc = p;
q = p;
} else {
q->next = p;
q = p;
}
scanf("%d%d", &adjvex, &weight);
}
}
}
// 输出邻接表
void printAdjList(AdjList G) {
printf("邻接表如下:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%c -> ", G.adjlist[i].data);
if (G.adjlist[i].firstarc != NULL) {
ArcNode *p = G.adjlist[i].firstarc;
while (p != NULL) {
printf("(%c)%d ", G.adjlist[p->adjvex].data, p->weight);
p = p->next;
}
}
printf("\n");
}
}
int main() {
AdjList G;
createAdjList(&G);
printAdjList(G);
return 0;
}
```
使用上述代码,输入用例数据后,输出的邻接表如下:
```
邻接表如下:
a -> (b)1
b -> (c)4
c -> (d)6
d -> (a)3 (b)5 (c)8
```
阅读全文