为什么在复制链表时会指定此指针?

时间:2014-11-16 04:29:40

标签: c memory-management linked-list

在此代码中:

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->next分配给malloc()来电的结果?显然,如果我们不这样做,就会发生分段错误。

为什么我们不分配tail而不是tail->next?在这种情况下,我应该像这样分配下一个?

2 个答案:

答案 0 :(得分:2)

避免额外的变量只是一种方便:

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

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

我们为什么不分配尾部而不是尾部>接下来?

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

为该节点分配一个新节点和链接尾部

答案 1 :(得分:1)

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