0
static void just_traverse(sll **head_ref) {
    sll *first = *head_ref;
    sll *second = (*head_ref)->next;

    if(second == NULL) {
            return;
    }

    just_traverse(&(second));
    *head_ref = second;
    printf("%d \t",second->payload);
}

上記のコードで*head_ref=secondを削除すると; スタックに関して出力を取得しますが、この行を入力すると* head_ref = second; {4,3,2,1}と言う最後の要素を常に出力し、次に常に1を出力しますか?誰かが理由を説明できますか?

4

3 に答える 3

0

複雑にしすぎていると思います。これはテストされていませんが、少なくとも、単一リンクリストで再帰的な逆方向ウォークを実行するためのより単純なパターンです。

static void just_traverse(sll *head_ref) {
    if (head_ref == NULL) {
            return;
    }

    just_traverse(head_ref -> next);

    printf("%d \t",head_ref->payload);
}
于 2012-08-08T20:10:39.653 に答える
0
  1. ポインタを間違って設定した理由を理解するためにデバッグを試みることができます。

  2. おそらく次のようになります

    just_traverse(&(second)); 2番目->次=最初; 最初->次=NULL;

于 2012-08-08T20:04:05.550 に答える
0

リストに{4,3,2,1}が含まれている場合、出力は正しいはず1 1 1です。

これはステートメントのためです*head_ref = second;。3回目の呼び出しで、関数just_traverse head_refはを指し2secondを指し1ます。今、あなたはに更新**head_refしてい1ます。今、あなたは印刷していsecondます。したがって、出力は値になります1

そして、2番目の呼び出しに戻ります。ここhead_ref3ありsecondます123番目に更新したためではありません)。ここでも、ヘッドへの割り当て1と印刷を行いますsecond。ここでも、値1のみが出力されます。

そして、それは最初の呼び出しに戻ります、ここhead_refにあり4、ありsecondます132番目の呼び出しで更新したためではありません)。ここでも、ヘッドへの割り当て1と印刷を行いますsecond。ここでも、値1のみが出力されます。

したがって、出力は3になります1

1 1 1
于 2012-08-09T03:02:47.387 に答える