在C中复制链接列表

时间:2014-03-06 10:48:09

标签: c linked-list

我写了一个复制链表的函数。不幸的是,它没有完全复制列表。

Node *copy(Node *list)
{
    Node *copy2;
    while(list != NULL) {
        copy2 = malloc(sizeof(Node));
        memcpy(copy2,list,sizeof(Node));
        list = list->next;
        if(list != NULL) {
            copy2->next = malloc(sizeof(Node));
            copy2 = copy2->next;
        }
    }
    return copy2;
}

3 个答案:

答案 0 :(得分:2)

你有2个主要错误:

  1. 您不存储复制列表的头部。无处不在。当你返回copy2时,你会返回一个指向列表最后一个元素的指针,并永远失去对列表头的引用。

  2. copy2未动态分配,并在您的函数退出时将被释放。如果您修复问题1,这可能会导致分段错误。

答案 1 :(得分:2)

它只给你最后一个元素,它也有很多内存泄漏。

  1. 每个元素不需要两个malloc。
  2. 您需要将引用保留在列表的头部和当前复制的元素
  3. 您需要保持指向引用的指针以更改上一节点内的指针。
  4. 试试这个。

    Node *copy(Node *list)
    {
        Node *newList = NULL;
        Node **newIt = &newList;
        while(list!=NULL)
        {
            *newIt = malloc(sizeof(Node));
            memcpy(*newIt,list,sizeof(Node));
    
            list = list->next;
            newIt = &((*newIt)->next);
        }
        return newList;
    }
    

答案 2 :(得分:0)

这是用于将链表复制到另一个链表的C ++代码

struct Node {
    int value;
    Node* next;
};

Node* copy(Node* list) {
    if (list == NULL) return NULL;

    Node* result = new Node;
    result->value = list->value;
    result->next = copy(list->next);
    return result;
}