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