如何在C中制作链表的副本?

时间:2014-03-06 20:26:54

标签: c struct linked-list

这是我复制列表的功能。错误是它总是复制第一个元素两次。我究竟做错了什么?

Node *copy(Node *list) {

  Node *newlist, *p;

  p = malloc(sizeof(Node));
  newlist = p;

  while (list != NULL) {
      strcpy(p->airport, list->airport);
      p = p->next;
      p = malloc(sizeof(Node));
      list = list->next;
  }

  return newlist;
}

4 个答案:

答案 0 :(得分:2)

将其分为3部分。

// Part 1 - the null list
if (list == NULL) return NULL;

// Part 2 - the head element
Node *newHead = malloc(sizeof(Node));
strcpy(newHead->airport, list->airport);

// Part 3 - the rest of the list
Node *p = newHead;
list = list->next;
while(list != NULL) {
    p->next = malloc(sizeof(Node);
    p=p->next;
    strcpy(p->airport, list->airport);
    list = list->next;
}
p->next = NULL;  // terminate last element.

答案 1 :(得分:1)

只需更改这些行的顺序

  p = p->next;
  p = malloc(sizeof(Node));

  p->next = malloc(sizeof(Node));
  p = p->next;

答案 2 :(得分:0)

这些行不对:

p = p->next;
p = malloc(sizeof(Node));

因为它设置了p的新值,然后覆盖它。

我建议你将malloc新节点放在while循环中。您还需要在分配后将p->next设置为某个内容,并保留指向分配的第一个新节点的指针。

答案 3 :(得分:0)

怎么样:

Node *copy(Node *list) {

  Node *newlist, *p, *prev;

  newlist = p = NULL;

  while (list != NULL) {
      p = malloc(sizeof(*p));
      strcpy(p->airport, list->airport);
      if (!newlist)
          newlist = p;
      else
          prev->next = p;
      prev = p;
      list = list->next;
  }
  prev->next = NULL;
  return newlist;
}

您需要保留对上一个节点的引用,以便在下一次迭代中更新其next