我不知道怎么问这个问题,所以我举了一个例子。希望你能理解。
下面是结构节点:
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
后循环,然后打印list2->link->link->data
的值导致退出失败,但是当它分配给list1
(之后while循环变成list1->link
)时,printf()
安全地打印值。为什么? 最佳答案
退出失败是因为当您将NULL
赋值为list1->link
,在while循环之后,list2->link->link
的值变为NULL
,并且您尝试打印PrtfNULL->data
。
而如果设置list1 = NULL
则不会损坏链接列表,并且list2->link->link
指向数据值为3的第三个/最后一个节点。
下面是我对ascii图的解释:
在while循环之前,列表如下:
STEP -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循环之后,它将如下所示:STEP -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
这是错误的!程序崩溃的原因。步骤3b,
这是第二种情况:如果
NULL->data
被分配到NULL
中,则情况如下图所示: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`.
和
list
输出:printf("%d", list2->link->link->data);
,了解下面的内容+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---+
+---+ +---+ +---+ |
^ ^ ^ null
| | |
| | list2->link->link
list2 list2->link
关于c - 链表异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17708453/