GraphAddEdge
Description
Add a directed edge from -> to.
Duplicate edges are ignored and return false.
Parameters
| Name | Direction | Description |
|---|---|---|
g |
in,out | Graph to modify. |
from |
in | Source node id. |
to |
in | Destination node id. |
Success
true when a new edge was inserted.
Failure
false when edge already existed.
Usage example (Cross-references)
Usage examples (Cross-references)
GraphNodeId echo = city_add_intersection(&graph, &index, "Echo");
GraphAddEdge(&graph, alpha, beta);
GraphAddEdge(&graph, beta, gamma);
GraphAddEdge(&graph, gamma, delta);
GraphAddEdge(&graph, alpha, beta);
GraphAddEdge(&graph, beta, gamma);
GraphAddEdge(&graph, gamma, delta);
GraphAddEdge(&graph, gamma, echo); GraphAddEdge(&graph, alpha, beta);
GraphAddEdge(&graph, beta, gamma);
GraphAddEdge(&graph, gamma, delta);
GraphAddEdge(&graph, gamma, echo);
GraphAddEdge(&graph, echo, beta); GraphAddEdge(&graph, beta, gamma);
GraphAddEdge(&graph, gamma, delta);
GraphAddEdge(&graph, gamma, echo);
GraphAddEdge(&graph, echo, beta); GraphAddEdge(&graph, gamma, delta);
GraphAddEdge(&graph, gamma, echo);
GraphAddEdge(&graph, echo, beta);
bool result = city_reachable(&graph, &index, "Alpha", "Delta"); GraphNodeId d = GraphAddNodeR(&graph, 4);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d); GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d); GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d);
GraphForeachNode(&graph, node) { GraphNodeId d = GraphAddNodeR(&graph, 4);
GraphAddEdge(&graph, a, d);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d);
GraphAddEdge(&graph, a, d);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d);
GraphAddEdge(&graph, a, b); GraphAddEdge(&graph, a, d);
GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d);
GraphAddEdge(&graph, a, b); GraphAddEdge(&graph, b, d);
GraphAddEdge(&graph, c, d);
GraphAddEdge(&graph, a, b);
u64 predecessor_sum = 0; GraphNodeId c = GraphAddNodeR(&graph, 3);
GraphAddEdge(&graph, a, b);
GraphNodeForeachNeighbor(GraphGetNode(&graph, a), neighbor) { GraphNodeForeachNeighbor(GraphGetNode(&graph, a), neighbor) {
(void)neighbor;
(void)GraphAddEdge(&graph, a, c);
} GraphNodeId d = GraphAddNodeR(&graph, 4);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, c);
GraphNodeForeachPredecessor(GraphGetNode(&graph, c), predecessor) { GraphNodeForeachPredecessor(GraphGetNode(&graph, c), predecessor) {
(void)predecessor;
(void)GraphAddEdge(&graph, d, c);
}- In
Graph.Ops.c:39:
GraphNodeId c = GraphAddNodeR(&graph, 30);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, c, a);- In
Graph.Ops.c:40:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, c, a);- In
Graph.Ops.c:41:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, c, a);
GraphForeachNode(&graph, node) {- In
Graph.Ops.c:107:
GraphNodeId c = GraphAddNodeR(&graph, 30);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, c);- In
Graph.Ops.c:108:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, c);- In
Graph.Ops.c:109:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, b, c);
GraphForeachNode(&graph, node) {- In
Graph.Ops.c:152:
GraphNodeId b = GraphAddNodeR(&graph, 20);
GraphAddEdge(&graph, a, b);
bool result = !GraphEdgeMarkedForRemoval(&graph, a, b);- In
Graph.Ops.c:179:
GraphNodeId c = GraphAddNodeR(&graph, 30);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);- In
Graph.Ops.c:180:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
bool result = GraphMarkEdgeForRemoval(&graph, a, b);- In
Graph.Ops.c:208:
GraphNodeId a = GraphAddNodeR(&graph, 10);
bool result = GraphAddEdge(&graph, a, a);
result = result && (GraphOutDegree(&graph, a) == 1);
result = result && (GraphInDegree(&graph, a) == 1);- In
Graph.Ops.c:234:
GraphNodeId d = GraphAddNodeR(&graph, 40);
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, d, b);- In
Graph.Ops.c:235:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, d, b);- In
Graph.Ops.c:236:
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, b, c);
GraphAddEdge(&graph, d, b);
bool result = GraphMarkEdgeForRemoval(&graph, a, b);- In
Graph.Init.c:27:
u64 slot_index;
result = result && GraphAddEdge(&graph, first_id, second_id);
result = result && GraphAddEdge(&graph, second_id, third_id);
result = result && GraphAddEdge(&graph, third_id, first_id);- In
Graph.Init.c:28:
result = result && GraphAddEdge(&graph, first_id, second_id);
result = result && GraphAddEdge(&graph, second_id, third_id);
result = result && GraphAddEdge(&graph, third_id, first_id);
result = result && GraphAddEdge(&graph, third_id, third_id);- In
Graph.Init.c:29:
result = result && GraphAddEdge(&graph, first_id, second_id);
result = result && GraphAddEdge(&graph, second_id, third_id);
result = result && GraphAddEdge(&graph, third_id, first_id);
result = result && GraphAddEdge(&graph, third_id, third_id);
result = result && (GraphNodeVisit(GraphGetNode(&graph, first_id)) == 1);- In
Graph.Init.c:30:
result = result && GraphAddEdge(&graph, second_id, third_id);
result = result && GraphAddEdge(&graph, third_id, first_id);
result = result && GraphAddEdge(&graph, third_id, third_id);
result = result && (GraphNodeVisit(GraphGetNode(&graph, first_id)) == 1);
result = result && GraphMarkNodeForDeletion(GraphGetNode(&graph, second_id)); GraphNodeId c = GraphAddNodeR(&graph, 30);
GraphNode node_b;
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, c, a); GraphNode node_b;
GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, c, a); GraphAddEdge(&graph, a, b);
GraphAddEdge(&graph, a, c);
GraphAddEdge(&graph, c, a);
ValidateGraph(&graph); GraphNodeId blue = GraphAddNodeR(&graph, "blue");
GraphAddEdge(&graph, red, green);
GraphAddEdge(&graph, green, blue);
GraphAddEdge(&graph, red, green);
GraphAddEdge(&graph, green, blue);
bool result = GraphHasEdge(&graph, red, green); GraphNodeId b = GraphAddNodeR(&graph, 20);
GraphAddEdge(&graph, a, b);
(void)GraphPredecessorAt(&graph, a, 0); GraphNodeId b = GraphAddNodeR(&graph, 20);
GraphAddEdge(&graph, a, b);
(void)GraphNeighborAt(&graph, b, 0);
static bool test_graph_add_edge_dedup(void) {
WriteFmt("Testing GraphAddEdge deduplication\n");
typedef Graph(int) IntGraph; GraphNodeId c = GraphAddNodeR(&graph, 3);
bool result = GraphAddEdge(&graph, a, b);
result = result && GraphAddEdge(&graph, a, c);
result = result && !GraphAddEdge(&graph, a, b);
bool result = GraphAddEdge(&graph, a, b);
result = result && GraphAddEdge(&graph, a, c);
result = result && !GraphAddEdge(&graph, a, b);
result = result && GraphEdgeCount(&graph) == 2; bool result = GraphAddEdge(&graph, a, b);
result = result && GraphAddEdge(&graph, a, c);
result = result && !GraphAddEdge(&graph, a, b);
result = result && GraphEdgeCount(&graph) == 2;
result = result && GraphOutDegree(&graph, a) == 2; GraphNodeId c = GraphAddNodeR(&graph, 3);
bool result = GraphAddEdge(&graph, a, a);
result = result && GraphAddEdge(&graph, b, a);
result = result && GraphAddEdge(&graph, c, a);
bool result = GraphAddEdge(&graph, a, a);
result = result && GraphAddEdge(&graph, b, a);
result = result && GraphAddEdge(&graph, c, a);
result = result && !GraphAddEdge(&graph, a, a); bool result = GraphAddEdge(&graph, a, a);
result = result && GraphAddEdge(&graph, b, a);
result = result && GraphAddEdge(&graph, c, a);
result = result && !GraphAddEdge(&graph, a, a);
result = result && (GraphEdgeCount(&graph) == 3); result = result && GraphAddEdge(&graph, b, a);
result = result && GraphAddEdge(&graph, c, a);
result = result && !GraphAddEdge(&graph, a, a);
result = result && (GraphEdgeCount(&graph) == 3);
result = result && (GraphOutDegree(&graph, a) == 1);
Last updated on