我不知道如何提出这个问题,所以我举一个例子。我希望你理解它。 这是结构节点:
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
分配给list1->link
然后打印list2->link->link->data
的值导致退出失败,但是当它分配给list1
时(在while循环变为list1->link
后,然后printf()
安全地打印该值。为什么呢?
答案 0 :(得分:3)
退出失败是因为当您将NULL
分配给list1->link
时,在while循环之后,list2->link->link
的值变为NULL
并且您正在尝试print {{1} }}。
然而,如果您设置NULL->data
它不会损坏您的链接列表和list1 = NULL
指向具有数据值3的第三个/最后一个节点。
以下是我对ascii-diagrams的解释:
在while循环之前,你列出的是这样的:
<强>步骤1 强>
list2->link->link
Before while loop
+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---+
+---+ +---+ +---+ |
^ null
|
list1
list2 = list1;
Both `list2`, `list1` are pointing to first node
循环运行一次,因为while(--i)
。在while循环体中,您更新i = 1
以指向下一个节点,在while循环之后,它变为如下所示:
<强>步骤-2 强>
list1
<强>步骤-3A 强>
案例1:如果将After: list1 = list1->link; in while-loop
+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---+
+---+ +---+ +---+ |
^ ^ null
| |
list2 list1
设置为NULL:那么您的列表将变为:
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
值为NULL
通过打印`ist2->link->link
,您实际上打印list2->link->link->data
这是错误的!程序崩溃的原因。
步骤3b ,
这是案例2:如果将NULL->data
分配给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