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

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

}

现在我的问题是,当我指派NULLlist1->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/

10-15 02:01