ArcNode *q = (ArcNode *)malloc(sizeof(ArcNode));//申请一个结点 q->adjvex=k; //此节点所指向的下一个顶点序号为K q->nextarc=p.vertices[j].firstarc; //节点所指向的弧变成第j个节点的上一条弧 p.vertices[j].firstarc=q;
时间: 2024-02-12 14:03:19 浏览: 110
这段代码是用来实现有向图的邻接表存储结构中,添加一条从顶点j指向顶点k的弧的操作。具体来说,它的作用是:
1. 创建一个新的弧节点q,并为其分配内存空间。
2. 将节点q的adjvex字段设置为k,表示这个节点所指向的下一个顶点的序号是k。
3. 将节点q的nextarc字段设置为顶点j的firstarc字段,表示节点q所指向的弧是顶点j的第一条出边。
4. 将顶点j的firstarc字段更新为节点q,表示从顶点j出发现在有一条指向顶点k的出边。
需要注意的是,这段代码中的p是一个存储有向图的邻接表结构体,其成员vertices是一个顶点数组,每个顶点可能有多条出边,因此需要用一个指针来指向它的第一条出边(即firstarc字段)。而ArcNode则是邻接表中的弧节点结构体,包含了一个指向下一个顶点的指针(adjvex字段)和一个指向下一条弧的指针(nextarc字段)。
相关问题
完善代码:void AddEdge(Graph* G,char v1,char v2,int weight) { ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v2; p->weight = weight; // 添加权值 p->next = G->vertices[v1].firstarc; G->vertices[v1].firstarc = p; ++G->arcnum; p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v1; p->weight = weight; // 添加权值 p->next = G->vertices[v2].firstarc; G->vertices[v2].firstarc = p; ++G->arcnum; }
void AddEdge(Graph* G, char v1, char v2, int weight) {
ArcNode* p1 = (ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex = v2;
p1->weight = weight;
p1->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p1;
++G->arcnum;
ArcNode* p2 = (ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex = v1;
p2->weight = weight;
p2->next = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p2;
++G->arcnum;
}
在原有代码上,增加了 ArcNode* p2 指针,用于添加双向边。在第一段代码中,我们添加了指向 v2 的边,而在第二段代码中,我们添加了指向 v1 的边。这样就可以确保两个顶点之间的边是双向的。
在下列添加边的代码中增加边的权值:// 添加边 void AddEdge(Graph* G, int v1, int v2) { ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v2; p->next = G->vertices[v1].firstarc; G->vertices[v1].firstarc = p; ++G->arcnum; p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = v1; p->next = G->vertices[v2].firstarc; G->vertices[v2].firstarc = p; ++G->arcnum; }
可以在代码中增加一个变量来表示边的权值,例如我们可以在ArcNode结构体中增加一个weight变量,然后在AddEdge函数中对这个变量进行赋值即可。
修改后的代码如下:
```
// 添加边
void AddEdge(Graph* G, int v1, int v2, int weight) {
ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v2;
p->weight = weight; // 添加权值
p->next = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p;
++G->arcnum;
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = v1;
p->weight = weight; // 添加权值
p->next = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p;
++G->arcnum;
}
```
在调用AddEdge函数时,需要传入一个表示边权值的参数。例如,如果要添加从v1到v2的权值为3的边,可以这样调用:
```
AddEdge(&G, v1, v2, 3);
```
阅读全文