在c语言中,已知一个带权有向图,其存储结构为邻接表结构 ,设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值
时间: 2024-02-15 19:06:17 浏览: 83
以下是C语言实现的邻接表建立和输出的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 边结构体
typedef struct Edge {
int to; // 边指向的顶点编号
int w; // 边的权值
struct Edge *next; // 指向下一条边的指针
} edge_t;
// 顶点结构体
typedef struct Vertex {
int info; // 顶点信息
edge_t *head; // 指向第一条边的指针
} vertex_t;
// 建立邻接表
void build_adj_list(vertex_t *adj_list, int n) {
int i, j, t, w;
// 输入顶点信息
for (i = 0; i < n; i++) {
scanf("%d", &adj_list[i].info);
adj_list[i].head = NULL; // 初始化邻接表
}
// 输入边信息
for (i = 0; i < n; i++) {
scanf("%d", &t);
while (t != -1) {
scanf("%d", &w);
// 创建新的边节点
edge_t *e = (edge_t *)malloc(sizeof(edge_t));
e->to = t;
e->w = w;
e->next = NULL;
// 将边节点插入到邻接表
if (adj_list[i].head == NULL) {
adj_list[i].head = e;
} else {
edge_t *p = adj_list[i].head;
while (p->next != NULL) {
p = p->next;
}
p->next = e;
}
// 读取下一条边
scanf("%d", &t);
}
}
}
// 输出邻接表
void print_adj_list(vertex_t *adj_list, int n) {
int i;
edge_t *p;
// 遍历邻接表
for (i = 0; i < n; i++) {
printf("%d: ", adj_list[i].info);
p = adj_list[i].head;
while (p != NULL) {
printf("(%d)%d ", p->to, p->w);
p = p->next;
}
printf("\n");
}
}
int main() {
int n;
printf("Enter the number of vertices: ");
scanf("%d", &n);
// 创建邻接表
vertex_t *adj_list = (vertex_t *)malloc(n * sizeof(vertex_t));
build_adj_list(adj_list, n);
// 输出邻接表
print_adj_list(adj_list, n);
return 0;
}
```
该算法首先读入图的顶点数和顶点信息,然后按照顺序输入每个顶点对应的边信息,最后依次输出邻接表中每个顶点对应的边信息。其中,`edge_t` 结构体表示边,`vertex_t` 结构体表示顶点,`build_adj_list` 函数用于建立邻接表,`print_adj_list` 函数用于输出邻接表。
阅读全文