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
,并且您正试图打印fNULL->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这就是我想说的,(我的英语很差,请在我更新答案时再次检查我是否有错)不,对不起,你是对的。我错过了代码块下面的额外代码。