3

这段代码应该附加两个链表,我完全看不出这段代码是如何附加作为参数传递的两个 Cell Structs 的,因为第二个参数没有发生任何操作。它只是要求第一个 Cell 中的下一个节点 - 那么这如何工作呢?

void Append(Cell *& first, Cell* second)
{
  if (first == NULL)
  {
    first = second;
  }
else {
    Append(first->next, second);
  }
}
4

4 回答 4

1

它递归直到是对第一个列表中最后一个指针的first引用,它设置为指向第二个列表中的第一个。它不需要操纵(假设它是一个单链表)。nextCellCellsecond

于 2012-12-22T21:18:04.790 回答
1

这是一个递归算法,一直走到第一个列表(else分支)的末尾;一旦找到结尾(first==NULL),第二个列表的第一个元素将链接到第一个列表的最后一个元素,获得一个由两个原始列表连接而成的列表。

于 2012-12-22T21:18:17.217 回答
1

else函数块一直跟随next指针,first直到它到达该列表的末尾。也就是说,直到first->nextisNULL并且 theelse不会被执行。

if现在是块中的基本情况。当first->nextis时NULL,它将指针更改为指向second,这可能是另一个列表中的第一个元素。

有一些影响的原因是因为first->next指针是通过引用传递的。修改指针将修改列表末尾的实际指针,而不仅仅是修改副本。

于 2012-12-22T21:18:56.767 回答
1

第二个列表不需要修改。代码将递归遍历第一个列表,直到它到达第一个列表中的最后一个元素,并将该元素的下一个指针设置为第二个列表的开头。第二个列表中的元素将由两个列表共享。

前:

第一 → a → b → c

第二→d→e→f

后:

第一 → a → b → c
                ↓
第二→d→e→f
于 2012-12-22T21:19:39.767 回答