3

このコードは2つのリンクリストを追加することになっていますが、2番目のパラメーターは操作されていないため、このコードが引数として渡された2つのセル構造体を追加する方法を完全に理解できません。最初のセルの次のノードを要求するだけです-では、これはどのように機能しますか?

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

4 に答える 4

1

これは、最初のリストの最後firstのポインターへの参照になるまで繰り返され、2番目のリストの最初のポインターを指すように設定されます。操作する必要はありません(単一リンクリストを想定)。nextCellCellsecond

于 2012-12-22T21:18:04.790 に答える
1

elseこれは、最初のリスト(ブランチ)の最後まで歩く再帰的アルゴリズムです。終わりが見つかると(first==NULL)、2番目のリストの最初の要素が最初のリストの最後の要素にリンクされ、2つの元のリストを連結したリストが取得されます。

于 2012-12-22T21:18:17.217 に答える
1

関数のelseブロックは、そのリストの最後に到達するまで、のnextポインターをたどり続けます。firstつまり、までfirst->nextは実行されNULLelseは実行されません。

ifこれで、ブロックのベースケースになります。の場合、そのポインタを、おそらく別のリストの最初の要素であるfirst->nextを指すように変更します。NULLsecond

何らかの効果がある理由は、first->nextポインタが参照によって渡されるためです。ポインタを変更すると、コピーを変更するだけでなく、リストの最後にある実際のポインタが変更されます。

于 2012-12-22T21:18:56.767 に答える
1

2番目のリストを変更する必要はありません。コードは、最初のリストの最後の要素に到達するまで最初のリストを再帰的にトラバースし、その要素の次のポインターを2番目のリストの先頭に設定します。2番目のリストの要素は、両方のリストで共有されます。

前:

最初→a→b→c

秒→d→e→f

後:

最初→a→b→c
                ↓
秒→d→e→f
于 2012-12-22T21:19:39.767 に答える