编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。
时间: 2023-04-19 10:02:51 浏览: 163
1. 首先输入顶点数目和弧的数目。
2. 接着输入各顶点的信息,可以用数组或结构体来存储。
3. 再输入各条弧的信息,包括起点、终点和权值等,也可以用数组或结构体来存储。
4. 建立邻接表,可以用链表来实现。对于每个顶点,创建一个链表,存储与该顶点相连的所有弧的信息。
5. 遍历所有弧的信息,将其插入到对应的链表中。
6. 最终得到有向图的邻接表表示。
相关问题
C语言编写算法,由依次输入顶点数目,弧的数目,各顶点的信息,各条弧的信息建立有向图的邻接表
好的,下面是一个简单的 C 语言算法,用于建立有向图的邻接表:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表中的弧节点
typedef struct ArcNode {
int adjvex; // 邻接顶点编号
int weight; // 弧的权值
struct ArcNode *nextarc; // 指向下一条弧的指针
} ArcNode;
// 定义邻接表中的顶点节点
typedef struct VertexNode {
char vertex; // 顶点信息
ArcNode *firstarc; // 指向第一条邻接弧的指针
} VertexNode;
// 定义图结构体
typedef struct {
VertexNode *vertices; // 顶点数组
int vexnum; // 顶点数目
int arcnum; // 弧的数目
} Graph;
// 创建邻接表
Graph* createGraph() {
int vexnum, arcnum, i, j;
scanf("%d %d", &vexnum, &arcnum);
// 初始化图
Graph *g = (Graph*) malloc(sizeof(Graph));
g->vexnum = vexnum;
g->arcnum = arcnum;
g->vertices = (VertexNode*) malloc(sizeof(VertexNode) * vexnum);
// 初始化邻接表中的各个顶点节点
for (i = 0; i < vexnum; i++) {
scanf(" %c", &g->vertices[i].vertex);
g->vertices[i].firstarc = NULL;
}
// 添加邻接表中的各个弧节点
for (i = 0; i < arcnum; i++) {
int start, end, weight;
scanf("%d %d %d", &start, &end, &weight);
// 创建新的弧节点
ArcNode *arcnode = (ArcNode*) malloc(sizeof(ArcNode));
arcnode->adjvex = end;
arcnode->weight = weight;
arcnode->nextarc = NULL;
// 将弧节点添加到起始顶点的邻接表中
if (g->vertices[start].firstarc == NULL) {
g->vertices[start].firstarc = arcnode;
} else {
ArcNode *p = g->vertices[start].firstarc;
while (p->nextarc != NULL) {
p = p->nextarc;
}
p->nextarc = arcnode;
}
}
return g;
}
int main() {
Graph *g = createGraph();
// 打印邻接表
int i;
for (i = 0; i < g->vexnum; i++) {
printf("%c -> ", g->vertices[i].vertex);
ArcNode *p = g->vertices[i].firstarc;
while (p != NULL) {
printf("%c(%d) ", g->vertices[p->adjvex].vertex, p->weight);
p = p->nextarc;
}
printf("\n");
}
return 0;
}
```
在这个算法中,我们首先读取顶点数目和弧的数目,然后创建一个新的图结构体,并初始化其中的顶点节点数组。接着,我们读取每个弧的信息,创建新的弧节点,并将其添加到起始顶点的邻接表中。最后,我们打印出邻接表。
希望这个算法对你有帮助!
C语言,编写算法,由依次输入的顶点数目,弧的数目,各顶点的信息和各条弧的信息建立有向图的邻接表
好的,这是一个关于C语言的算法问题。我会根据你的要求进行回答。
首先,我们需要定义一个顶点的结构体,包括顶点的信息和指向第一个邻接点的指针。
```c
typedef struct ArcNode {
int adjvex; // 指向的顶点
struct ArcNode *nextarc; // 指向下一条弧的指针
int weight; // 弧的权值
} ArcNode;
typedef struct VertexNode {
char vertex; // 顶点信息
ArcNode *firstarc; // 指向第一个邻接点的指针
} VertexNode;
```
然后,我们定义一个图的结构体,包括顶点数目、弧的数目和一个指向顶点数组的指针。
```c
typedef struct {
VertexNode *vertices; // 顶点数组
int vexnum; // 顶点数目
int arcnum; // 弧的数目
} Graph;
```
接下来,我们定义一个函数来创建图的邻接表。该函数首先需要读取输入的顶点数目和弧的数目,然后创建顶点数组并初始化每个顶点。接着,读取每个顶点的信息和每条弧的信息,并将它们添加到邻接表中。
```c
Graph* createGraph() {
int vexnum, arcnum;
scanf("%d %d", &vexnum, &arcnum);
Graph *g = (Graph*)malloc(sizeof(Graph));
g->vexnum = vexnum;
g->arcnum = arcnum;
g->vertices = (VertexNode*)malloc(sizeof(VertexNode) * vexnum);
// 初始化每个顶点
for (int i = 0; i < vexnum; i++) {
scanf(" %c", &g->vertices[i].vertex);
g->vertices[i].firstarc = NULL;
}
// 添加每条弧到邻接表中
for (int i = 0; i < arcnum; i++) {
int start, end, weight;
scanf("%d %d %d", &start, &end, &weight);
ArcNode *arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = end;
arc->weight = weight;
arc->nextarc = g->vertices[start].firstarc;
g->vertices[start].firstarc = arc;
}
return g;
}
```
最后,我们可以调用 createGraph 函数来创建一个有向图的邻接表。
```c
int main() {
Graph *g = createGraph();
// 其他操作
return 0;
}
```
以上就是一个建立有向图邻接表的C语言算法。希望对你有所帮助!