1

我不知道怎么问这个问题,所以我举个例子。我希望你能理解。这是结构节点:

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

假设我使用appendList(Node *list, int data);[you can use your own also] 函数将节点插入到这样的列表中:

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

}

现在我的问题是,当我分配NULLlist1->linkafter while 循环然后打印list2->link->link->data导致退出失败的值时,但是当它分配给list1(在 while 循环之后变为list1->link)然后printf()安全地打印该值。为什么?

4

1 回答 1

3

退出失败是因为当您分配NULL给时list1->link,在 while 循环之后,list2->link->link成为的值是NULL并且您正在尝试 printf NULL->data。而如果您设置list1 = NULL它不会破坏您的链表并list2->link->link指向数据值为 3 的第三个/最后一个节点。
下面是我对 ascii-diagrams 的解释:

在 while 循环之前,您列出的内容是这样的:

步骤1

Before while loop  

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

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

while(--i)循环运行一次,因为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指向节点22在赋值语句之后,具有值的节点的下一个为空。所以`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 回答