2016-03-30 17 views
0

ほとんどすべての再帰関数を使用してリンクリストを作成しています。コピーコンストラクタで困惑しています。リンクされたリストには、先頭と末尾のダミーノードがあります。私が持っている:リンクリストを再帰的にコピー

/* Recursively duplicates the list. */ 
void duplicateNodes(const SortedList& o, Node * const copyIter) { 

    if (copyIter != head) { 
     duplicateNodes(o, copyIter->previous); 
    } 

    tail = tail->next = createNode(tail, copyIter->data, nullptr); 
    size = o.size; 

} 

そして、私のコピーコンストラクタ:事前に

SortedList(const SortedList& o) { 
    duplicateNodes(o, o.tail); 
} 

ありがとう!私はまだ再帰を完全に理解していません。

+0

'headedと' tail'が 'SortedList'のプライベートメンバである場合、' _tail'や 'm_tail'のような接頭辞表記を使うことをお勧めします。 – Dagrooms

+0

または必ずthis-> tailと表示してください。また、同じ行で2つの課題を使用すると嫌いですが、読んでフォローするのは恐ろしいことです。 –

+0

ところで、ここにいるのは何度も何度も何度も自分自身を呼び出す無限ループだと私には思われます。あなたの最初のif文はおそらく真であり、あなたの再帰はduplicateNodes –

答えて

0

私は答えを説明するつもりですが、宿題のように思えるので、コードをそのまま残しておきます。おそらくあなた自身でそれを行うべきです。私はそれを可能にする力を願っています。再帰は常に停止条件を持つ必要があります。関数の先頭に配置することをお勧めします。あなたの再帰関数duplicateNodesは、その頭だけのリスト全体oを必要としません。 これは、基本的にはoのノードを走査してリスト内に対応するノードを作成するので、duplicateNodesはnodeBeingCopied-> nextで自身を呼び出します。停止条件は明らかにnodeBeingCopied == nullです(ただし、nodeBeingCopied-> next == nullも関数の最後にある場合は機能します)。再帰関数の本体は、新しいノードを作成し、それをリストの最後に追加します。ノードをリストに追加するたびに、サイズを1つ増やす必要があります。 これはあなた自身でそれを行うのに十分な情報を提供します。もっと助けが必要な場合は、尋ねてください。