用C语言写一个程序,已知一个带权有向图,其存储结构为邻接表结构 ,设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值,
时间: 2023-11-02 17:04:54 浏览: 152
dg.zip_dirtddf_图 数据结构_数据结构 图_数据结构 C语言_有向图
以下是用C语言编写的程序,它可以根据输入的数据建立带权有向图的邻接表,并将其输出。
```c
#include <stdio.h>
#include <stdlib.h>
// 邻接表节点的结构体
typedef struct AdjListNode {
int dest; // 目标顶点
int weight; // 边权值
struct AdjListNode* next; // 下一个节点
} AdjListNode;
// 邻接表的结构体
typedef struct AdjList {
AdjListNode* head; // 链表头指针
} AdjList;
// 图的结构体
typedef struct Graph {
int V; // 顶点数
AdjList* array; // 邻接表数组
} Graph;
// 创建邻接表节点
AdjListNode* newAdjListNode(int dest, int weight) {
AdjListNode* newNode = (AdjListNode*) malloc(sizeof(AdjListNode));
newNode->dest = dest;
newNode->weight = weight;
newNode->next = NULL;
return newNode;
}
// 创建图
Graph* createGraph(int V) {
Graph* graph = (Graph*) malloc(sizeof(Graph));
graph->V = V;
graph->array = (AdjList*) malloc(V * sizeof(AdjList));
int i;
for (i = 0; i < V; ++i) {
graph->array[i].head = NULL;
}
return graph;
}
// 添加边到图中
void addEdge(Graph* graph, int src, int dest, int weight) {
AdjListNode* newNode = newAdjListNode(dest, weight);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
}
// 输出邻接表
void printGraph(Graph* graph) {
int i;
for (i = 0; i < graph->V; ++i) {
AdjListNode* node = graph->array[i].head;
printf("Vertex %d: ", i);
while (node) {
printf("(%d)%d ", node->dest, node->weight);
node = node->next;
}
printf("\n");
}
}
int main() {
int V, i, j, k, w;
printf("Enter the number of vertices: ");
scanf("%d", &V);
Graph* graph = createGraph(V);
char info[100];
printf("Enter the information of each vertex:\n");
for (i = 0; i < V; ++i) {
scanf("%s", info);
printf("Vertex %d: %s\n", i, info);
}
printf("Enter the edges of the graph:\n");
for (i = 0; i < V; ++i) {
printf("Vertex %d:\n", i);
j = 0;
while (1) {
scanf("%d %d", &k, &w);
if (k == -1) break;
addEdge(graph, i, k, w);
j++;
}
}
printf("The adjacency list of the graph:\n");
printGraph(graph);
return 0;
}
```
程序的流程如下:
1. 从键盘输入顶点数V,创建一个有V个顶点的图。
2. 从键盘输入每个顶点的信息,并输出到屏幕上。
3. 从键盘输入每个顶点的邻接表,根据输入的信息将边添加到图中。
4. 输出建立好的邻接表到屏幕上。
下面是一个测试用例:
```
Enter the number of vertices: 4
Enter the information of each vertex:
Vertex 0: A
Vertex 1: B
Vertex 2: C
Vertex 3: D
Enter the edges of the graph:
Vertex 0:
1 2 2 3 -1
Vertex 1:
3 4 -1
Vertex 2:
1 5 -1
Vertex 3:
2 1 -1
The adjacency list of the graph:
Vertex 0: (3)2 (2)1
Vertex 1: (4)3
Vertex 2: (5)1
Vertex 3: (1)2
```
这个测试用例创建了一个有4个顶点的图,其中顶点0到顶点1和顶点2,顶点1到顶点3,顶点2到顶点1和顶点3,顶点3到顶点2和顶点0都有边连接,边的权值分别是2、1、3、4、5、1和2。程序根据这些输入建立了邻接表,并将其输出到屏幕上。
阅读全文