2016-04-17 10 views
0

以下の交差関数でプッシュの最初の呼び出しが行われると、tail-> nextの値はNULLになります。私の理解は、& tail-> nextは、次にポインタを保持するスタック上のダミーオブジェクトの最後の4バイトを指しているということです。今、head_refがpush関数の中で変更されたとき、ダミーオブジェクトの次の変数の中に格納されているアドレスを変更していませんか?だから、ダミーは常にリストの最後の要素を指しているように見えますが、これは実行時にリストの先頭を正しく出力します。誰かがプッシュコールごとに何が起こっているのかを説明できますか?ありがとう。リンクされたリストメモリ

この問題は、ダミーの次のポインタを変更するんpushhere

struct node* sortedIntersect(struct node* a, struct node* b) 
{ 
    struct node dummy; 
    struct node* tail = &dummy; 
    dummy.next = NULL; 

    while (a != NULL && b != NULL) 
    { 
     if (a->data == b->data) 
     { 
      push((&tail->next), a->data); 
      tail = tail->next; 
      a = a->next; 
      b = b->next; 
     } 
     else if (a->data < b->data) /* advance the smaller list */ 
      a = a->next; 
     else 
      b = b->next; 
    } 
    return(dummy.next); 
} 

void push(struct node** head_ref, int new_data) 
{ 
    struct node* new_node = 
     (struct node*) malloc(sizeof(struct node)); 

    new_node->data = new_data; 

    /* link the old list off the new node */ 
    new_node->next = (*head_ref); 

    /* move the head to point to the new node */ 
    (*head_ref) = new_node; 
} 

答えて

0

ダミーは次のように出発する:

______  ______ 
|dummy| -> |NULL| 
| 0 | | | 
------- ------ 

私はa->dataが、これはロークます5であると仮定するつもりだ最初の呼び出しpush(&tail->next, a->data)、後に(心の中で持っていることをこの時点でdummyからtailポイント):

______ _________  _____ 
|dummy| -> |new_node| -> |NULL| 
| 0 | | 5 | | | 
-----  ---------  ------ 

はその後、我々は、なぜ、我々は再びpush(&tail->next, a->data)を呼ぶだろうというときである、new_nodeを指すようにtailの原因となりますtail = tail->next;を呼び出しますnew_node番号2は、我々は最初の場所に最後に追加されたノードとリンクリストを返すために起こっているreturn dummy->nextを呼び出す終わりに古いnew_nodeNULL

の間に挿入されます。ダミー自体は、スタックに割り当てられたときに削除されます。

我々はこのようにそれを書いた場合push機能は、非常に明確になる:あなたは `プッシュ(&tail->次の、A->データ)への2番目の呼び出しを行うとき

void push(struct node** head_ref, int new_data) 
{ 
    struct node* new_node = 
     (struct node*) malloc(sizeof(struct node)); 

    new_node->data = new_data; 

    /* save old head */ 
    struct node* old_head = *head_ref; 

    /* move the head to point to the new node */ 
    *head_ref = new_node; 

    /* link the old list off the new node */ 
    new_node->next = old_head; 
} 
+0

'、 '&tail-> nextはNULLを指すノードまたは空のノードのアドレスを保持しますか?したがって、 '* head_ref = new_node'が呼び出されたとき、tailの次のノードを新しく作成されたノードに設定します。あなたのプッシュの最後の行はそれを自分自身に戻しませんか? 'old_head'と' *head_ref'が実際にどのような値を格納しているのか分かりません。 – exozt912

0

最初の呼び出しから取得されますが、その後tailはちょうどプッシュ要素(tail = tail->next)を指すように進んでいます。したがって、次のpushはそのノードのnextで動作し、ダミーは動作しません。

関連する問題