C 链表奇怪的行为

C 链表奇怪的行为,c,pointers,structure,singly-linked-list,C,Pointers,Structure,Singly Linked List,我不知道怎么问这个问题,所以我举个例子。我希望你能理解。 以下是结构节点: 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 = appe

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

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

}

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

退出失败是因为当您将
NULL
分配给
list1->link
时,在while循环之后,
list2->link->link
的值变为
NULL
,并且您正试图打印f
NULL->data
。 然而,如果设置
list1=NULL
则不会损坏链接列表,并且
list2->link->link
指向数据值为3的第三个/最后一个节点。
下面是我对ascii图表的解释:

在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
设置为空:则列表变为:

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
的节点的下一个在赋值语句之后为空。所以
`ist2->link->link
值为空。
打印
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”,列表2->link->link->data)输出:
3
,了解下面的内容

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

它只是一个指针。您将其设置为NULL,但未对其指向的对象执行任何操作。烧掉地址不会烧掉房子。@wildplasser因此,当我将空值分配给list1时,它是分配给
list1->link
还是简单地分配给
list1
。您只需更改指针的值(将其设置为NULL)。它指向的对象不受影响。(>链表仍然是一样的。)但我在while循环之后更改了它。是
while
loop不增加指针printf()使用list2指针,它是在list1开始移动之前复制的。画得不错。顺便说一句:我不喜欢
假设
部分,因为这是没有发生的事情(但OP错误地认为它发生了),好吧,但当我将其设置为
list1=NULL
,在while循环之后会发生什么?@ashish2expert我正在编辑答案,检查更新answer@wildplasser这就是我想说的,(我的英语很差,请在我更新答案时再次检查我是否有错)不,对不起,你是对的。我错过了代码块下面的额外代码。