1

この質問の仕方がわからないので、例を挙げて説明します。ご理解いただければ幸いです。構造ノードは次のとおりです。

typedef struct NODE {
    struct NODE *link;
    int data;
} SList;

appendList(Node *list, int data);[独自のものも使用できます] 関数を使用して、次のようにノードをリストに挿入するとします。

int main() {
   SList *list1 = NULL;
   // append like this: 1, 2, 3
   list1 = appendList(list1, 1);
   list1 = appendList(list1, 2);
   list1 = appendList(list1, 3);
   SList *list2 = list1;  

   // Here starts the confusing part (atleast for me)
   int i = 1;
   while(i--) {
    list1 = list1->link;
   }
   // Now list1 == list1->link;
   list1 = NULL;   // This is the point of confusion
   printf("%d", list2->link->link->data);     // Return 3

}

ここで私の質問は、while ループの後に に代入NULLして終了失敗の原因の値を出力するときですが、( while ループの後に)に代入すると安全に値を出力することです。なんで?list1->linklist2->link->link->datalist1list1->linkprintf()

4

1 に答える 1

3

終了の失敗は、 while ループの後に に割り当てるNULLと、の値が変わり、 printf を試みているためです。一方、設定した場合、リンクリストは破損せず、データ値3の3番目/最後のノードを指します。 以下は、ascii-diagramsを使用した説明です。 list1->linklist2->link->linkNULLNULL->datalist1 = NULLlist2->link->link

while ループの前に、リストは次のようになります。

ステップ1

Before while loop  

+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |                                
 ^                       null  
 |                
list1
list2 = list1;

Both `list2`, `list1` are pointing to first node 

ループはwhile(--i)1 回だけ実行されi = 1ます。while ループ本体では、list1次のノードを指すように更新し、while ループの後は次のようになります。

ステップ2

After: list1 = list1->link; in while-loop

+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |                                
 ^         ^             null  
 |         |             
list2     list1

ステップ-3a

ケース-1: list1->linkNULL: に設定すると、リストは次のようになります。

After: list1->link = NULL

+---+    +---+          +---+                               
| 1 |--->| 2 |---+      | 3 |---+
+---+    +---+   |      +---+   |                                
 ^         ^     null          null  
 |         |             
list2     list1

A bad think, You do not have any variable pointing to node with value `3` 

今何が何であるかを理解するlist2->link->link->data

list2->linkノードを指します2。そして、値を持つノードの次は2、割り当てステートメントの後に null です。したがって、`ist2->link->link値は NULL です。
そして、印刷list2->link->link->data することで、実際に印刷NULL->dataするのは間違っています! プログラムがクラッシュした理由。

ステップ-3b

これはケース 2 です: NULLが割り当てられている場合list、以下の図のようになります。

After set: list1 = NULL 

+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |                                
 ^                      null  
 |                      
list2     list1---> NULL

1.  Linked-List is correct state. 
2.  Because list1 is assigned NULL, its just shown that it pointing to NULL
3.  Now, list1 not pointing any node in lined-list 
4.  Whereas we can still access linked-list using  variable `list2`. 

printf("%d", list2->link->link->data);出力: 3、この外観を理解するには、以下を参照してください。

+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |
 ^         ^        ^     null
 |         |        |
 |         |        list2->link->link     
list2     list2->link
于 2013-07-17T19:35:03.437 に答える