Linked List奇怪的行为

时间:2013-07-17 19:20:50

标签: 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 = 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()安全地打印该值。为什么呢?

1 个答案:

答案 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