据我所知,insert_edge
通过将数组索引x和y处的两个 node 添加到edges
数组来连接这两个 node .
我不会称之为"添加到edges
数组",因为edges
数组有固定的长度,并且每个node都有一个条目(而不是每个edge).
索引edges
标识边的"From"顶点,而AN edgenode
的y
字段标识同一条边的对应"To"顶点.
对于每个顶点x
,此代码维护一个边的链接列表(不是edges
,而是edges[x]
),该列表最初将为空.
让我们对一个示例图执行此操作:
...在初始化后使用其边填充,如下所示:
insert_edge(g, 0, 1, true);
insert_edge(g, 0, 2, true);
insert_edge(g, 1, 2, true);
insert_edge(g, 2, 3, true);
insert_edge(g, 3, 4, true);
让我们看看这是如何填充graph
数据 struct 的.我们从g
的这个状态开始(对于这个表示,我假设MAXV
是4):
┌───────────┬────┬────┬────┬────┬────┐
g ─►│ edges │ - │ - │ - │ - │ - │
├───────────┼────┼────┼────┼────┼────┤
│ degree │ 0 │ 0 │ 0 │ 0 │ 0 │
├───────────┼────┼────┴────┴────┴────┘
│ nvertices │ 5 │
├───────────┼────┤
│ nedges │ 0 │
├───────────┼────┤
│ directed │true│
└───────────┴────┘
连字符代表nullpointer
个值.我想所有这些都已经被正确初始化了.
然后,insert_edge(g, 0, 1, true)
将创建一个p
node ,该 node 被分配和初始化为:
┌────────┬────┐
p ─►│ weight │ 0 │
├────────┼────┤
│ y │ 1 │
├────────┼────┤
│ next │ - │
└────────┴────┘
值得注意的是,next
字段是nullptr
,因为这是g->edges[0]
的值.
则下一条语句g->edges[x] = p
建立链接,并且在两个计数器已经递增之后,该函数已经完成其工作:
┌────────┬────┐
p ─►│ weight │ 0 │
├────────┼────┤
│ y │ 1 │
├────────┼────┤
┌─►│ next │ - │
│ └────────┴────┘
│
│
│
│
┌───────────┬──│─┬────┬────┬────┬────┐
g ─►│ edges │ ┴ │ - │ - │ - │ - │
├───────────┼────┼────┼────┼────┼────┤
│ degree │ 1 │ 0 │ 0 │ 0 │ 0 │
├───────────┼────┼────┴────┴────┴────┘
│ nvertices │ 5 │
├───────────┼────┤
│ nedges │ 1 │
├───────────┼────┤
│ directed │true│
└───────────┴────┘
现在我们来看看更有趣的一个:insert_edge(g, 0, 2, true);
.p
再次指向新的edgenode
,但这次g->edges[0]
不是nullptr
,因此p->next
将指向先前添加的edgenode
.在insert_edge
次完成之后,我们得到这样的结果:
┌────────┬────┐ ┌────────┬────┐
p ─►│ weight │ 0 │ │ weight │ 0 │
├────────┼────┤ ├────────┼────┤
│ y │ 2 │ │ y │ 1 │
├────────┼────┤ ├────────┼────┤
┌─►│ next │ ────►│ next │ - │
│ └────────┴────┘ └────────┴────┘
│
│
│
│
┌───────────┬──│─┬────┬────┬────┬────┐
g ─►│ edges │ ┴ │ - │ - │ - │ - │
├───────────┼────┼────┼────┼────┼────┤
│ degree │ 2 │ 0 │ 0 │ 0 │ 0 │
├───────────┼────┼────┴────┴────┴────┘
│ nvertices │ 5 │
├───────────┼────┤
│ nedges │ 2 │
├───────────┼────┤
│ directed │true│
└───────────┴────┘
对于其他边也是如此:每次将新的edgenode
添加到链表的前面时,其头指针存储在edges
数组中.我们有5个链表:每个顶点一个.
以下是上述示例的最终结果:
┌────────┬────┐ ┌────────┬────┐
│ weight │ 0 │ │ weight │ 0 │
├────────┼────┤ ├────────┼────┤
│ y │ 2 │ │ y │ 1 │
├────────┼────┤ ├────────┼────┤
┌─►│ next │ ────►│ next │ - │
│ └────────┴────┘ └────────┴────┘
│ ┌────────┬────┐ ┌────────┬────┐
│ │ weight │ 0 │ │ weight │ 0 │
│ ├────────┼────┤ ├────────┼────┤
│ │ y │ 4 │ │ y │ 2 │
│ ├────────┼────┤ ├────────┼────┤
│ ┌─►│ next │ ────►│ next │ - │
│ │ └────────┴────┘ └────────┴────┘
│ │ ┌────────┬────┐
│ │ │ weight │ 0 │
│ │ ├────────┼────┤
│ │ │ y │ 3 │
│ │ ├────────┼────┤
│ │ ┌─►│ next │ - │
│ │ │ └────────┴────┘
│ │ │ ┌────────┬────┐
│ │ │ │ weight │ 0 │
│ │ │ ├────────┼────┤
│ │ │ │ y │ 4 │
│ │ │ ├────────┼────┤
│ │ │ ┌─►│ next │ - │
│ │ │ │ └────────┴────┘
┌───────────┬──│─┬──│─┬──│─┬──│─┬────┐
g ─►│ edges │ ┴ │ ┴ │ ┴ │ ┴ │ - │
├───────────┼────┼────┼────┼────┼────┤
│ degree │ 2 │ 2 │ 1 │ 1 │ 0 │
├───────────┼────┼────┴────┴────┴────┘
│ nvertices │ 5 │
├───────────┼────┤
│ nedges │ 6 │
├───────────┼────┤
│ directed │true│
└───────────┴────┘
希望这能澄清这一点.