0

ここでは、リンクされたリストの逆を印刷するコードを指定しました。

fun1() は、指定されたリンク リストを逆の方法で出力します。Linked List 1->2->3->4->5 の場合、fun1() は 5->4->3->2->1 を出力します。

void fun1(struct node* head)
{
  if(head == NULL)
    return;

  fun1(head->next);
  printf("%d  ", head->data);
}

fun1() の各呼び出しでスタックフレームがどのように構築されるかを説明できる人はいますか? リンクされたリストの最後のノードが印刷されると思っていました。しかし、リンクされたリストを逆の順序で取得しています。リンクリストを逆にするわけではありません。逆に印刷するだけです。Push/Popなどのスタック操作によるものだと思います。しかし、正確にはわかりません。図の段階的な操作の助けを借りて理解するのを手伝ってください。

4

2 に答える 2

1

あなたが何を達成しようとしているのかよくわかりません。あなたのコードは、何をすべきかを正確に出力します。以下は、期待に応えるコー​​ド セグメントです。

リンクされたリストの最後のノードが印刷されると思っていました。

void fun1(struct node* head)
{
  if(head == NULL)
     return;
  if(head->next == NULL)
   {
     printf("%d  ", head->data);
     return;
   }
  else
   fun1(head->next);
}
于 2013-07-29T11:23:56.430 に答える
1

リスト 1->2 を指定すると、次のようになります。

  1. head=1->2、head が null でない、2 で再帰 (5 への継続)
  2. => head=2、head が null でない、null で再帰 (4 への続き)
  3. => => head=null、head は null、return
  4. => 印字ヘッド -> データ "2" と戻ります
  5. head-data "1" を出力して返す

再発する前に print ステートメントを移動する場合:

void fun1(struct node* head)
{
  if(head == NULL)
    return;

  printf("%d  ", head->data);
  fun1(head->next);
}

次のようになります。

  1. head=1->2, head は null ではない, print head->data "1 ", 2 で繰り返す (5 に続く)
  2. => head=2, head is not null, print head->data "2 ", null で再帰 (4 への続き)
  3. => => head=null、head は null、return
  4. =>戻る
  5. 戻る

どちらの場合も、null 以外のすべてのノードが出力されます。そのうちの 1 つだけを印刷するには、次のようにコードで区別する必要があります。

void print_last(struct node* n)
{
    if( n == NULL )
    {
        printf("empty list!");
    }        
    else if( n->next == NULL )
    {
        printf("%d", n->data);
    }
    else
    {
        print_last(n->next);  
    }
}

取得した同じリスト 1->2 で呼び出されます。

  1. n=1->2、n != null および n->next != null、2 で再帰 (3 への継続)
  2. => n=2、n != null および n == null。n->data "2" を出力して返す
  3. 戻る

最後の要素が見つかったときに再帰しないことに注意してください。そのため、n が null になる唯一の方法は、空のリンク リスト (NULL) を印刷しようとした場合です。

于 2013-07-29T14:24:42.457 に答える