2014-11-16 48 views
1

在此代码:为什么在复制链表时这个指针被赋值?

Node *CopyList(Node **head) { 
    Node *current = *head; 
    Node *NewNode = NULL; 
    Node *tail = NULL; 

    while (current != NULL) { 
     if (NewNode == NULL) { 
      NewNode = malloc(sizeof(Node)); 
      NewNode->data = current->data; 
      NewNode->next = NULL; // routine 
      tail = NewNode; 
     } else { 
      tail->next = malloc(sizeof(Node)); // here 
      tail = tail->next; 
      tail->data = current->data; 
      tail->next = NULL; 
     } 
     current = current->next; 
    } 
    return(NewNode); 
} 

为什么我们分配tail->nextmalloc()调用的结果?很显然,如果我们不这样做,会发生分段错误。

为什么我们不是只分配tail而不是tail->next?有什么情况下我应该这样分配?

+0

这段代码看起来很合理。在第一次迭代中,它分配新列表的头部('NewNode'),并在每个后续迭代中扩展新列表的尾部。你认为这是什么错误?由于'tail',不应该有段错误,因为它在使用时不会为NULL。这里唯一错误的是'malloc'的返回值没有被检查为NULL。 – JS1

+0

我没有想到这个错误,只是我没有得到它的方式。 –

回答

2

这仅仅是一个方便,以避免额外的变量:

Node* temp = malloc(sizeof(Node)); // here 
temp->data = current->data ; 
temp->next = NULL ; 

tail->next = temp ; 
tail = tail->next; 

为什么我们不只是分配,而不是tail->下一页尾?

尾已分配,它充当前一个节点,因此我们可以将其链接到下一个节点。我们使用tail-> next = that_node来为该节点分配一个新节点和链接尾部。

+0

编辑后感谢你,这已经足够了。 –

1

此处NewNode表示新的链接列表头。所以在while循环中第一次被分配,所以下一次不会改变。回到你的问题,'tail-> next'而不是'tail',因为第一次'NewNode == NULL'时'tail = NewNode'被执行意味着尾部有NewNode地址。所以下一步你需要将下一个块复制到'tail-> next'中,因为尾部已经有了'NewNode'。

+0

对不起,但有些东西我仍然不明白,我是否需要将下一个块复制到'tail-> next'中,请问您能解释更多特殊字符吗? –

+1

如果'tail = NewNode'意味着NewNode被分配给tail,现在在其他部分中,您应该将下一个块复制到尾部意味着您需要将新块分配给'tail-> next',因为尾部已经具有NewNode。一旦您尝试通过链接列表拥有2个以上节点进行空运行。然后你很容易就可以了 – kriyeta

相关问题