Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中复制链表?_C_Struct_Linked List - Fatal编程技术网

如何在C语言中复制链表?

如何在C语言中复制链表?,c,struct,linked-list,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)

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

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;
}

这些行不可能是正确的:

p = p->next;
p = malloc(sizeof(Node));
这将设置一个新值
p
,然后将其覆盖


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

这些行不能正确:

p = p->next;
p = malloc(sizeof(Node));
这将设置一个新值
p
,然后将其覆盖


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

这些行不能正确:

p = p->next;
p = malloc(sizeof(Node));
这将设置一个新值
p
,然后将其覆盖


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

这些行不能正确:

p = p->next;
p = malloc(sizeof(Node));
这将设置一个新值
p
,然后将其覆盖

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

如何:

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;
}
您需要保留对上一个节点的引用,以便在下一次迭代中更新其下一个节点。

如何:

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;
}
您需要保留对上一个节点的引用,以便在下一次迭代中更新其下一个节点。

如何:

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;
}
您需要保留对上一个节点的引用,以便在下一次迭代中更新其下一个节点。

如何:

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;
}

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

只需更改这些行的顺序即可

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


只需更改这些行的顺序

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


只需更改这些行的顺序

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


只需更改这些行的顺序

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


把它分成三部分

// 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.

把它分成三部分

// 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.

把它分成三部分

// 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.

把它分成三部分

// 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.


不,事实上你错了。因为他有p的第一个元素地址,保存在newlist上,并在while之外分配,所以他可以使用p本身来分配下一个元素。它只需要改变事情的顺序:p->next=malloc(sizeof(Node));p=p->next@好吧,从技术上来说,答案并没有错。OP的代码是。如前所述,这两句话毫无意义。不,事实上你错了。因为他有p的第一个元素地址,保存在newlist上,并在while之外分配,所以他可以使用p本身来分配下一个元素。它只需要改变事情的顺序:p->next=malloc(sizeof(Node));p=p->next@好吧,从技术上来说,答案并没有错。OP的代码是。如前所述,这两句话毫无意义。不,事实上你错了。因为他有p的第一个元素地址,保存在newlist上,并在while之外分配,所以他可以使用p本身来分配下一个元素。它只需要改变事情的顺序:p->next=malloc(sizeof(Node));p=p->next@好吧,从技术上来说,答案并没有错。OP的代码是。如前所述,这两句话毫无意义。不,事实上你错了。因为他有p的第一个元素地址,保存在newlist上,并在while之外分配,所以他可以使用p本身来分配下一个元素。它只需要改变事情的顺序:p->next=malloc(sizeof(Node));p=p->next@好吧,从技术上来说,答案并没有错。OP的代码是。如前所述,这两行毫无意义。这已经是今天关于复制链表的第三个问题了。甚至符号名称也是相同的。此网站的名称不是www.domyhomework.com!!这已经是今天关于复制链接列表的第三个问题。甚至符号名称也是相同的。此网站的名称不是www.domyhomework.com!!这已经是今天关于复制链接列表的第三个问题。甚至符号名称也是相同的。此网站的名称不是www.domyhomework.com!!这已经是今天关于复制链接列表的第三个问题。甚至符号名称也是相同的。此网站的名称不是www.domyhomework.com!!其他答案与这个答案相比非常混乱。其他答案与这个答案相比非常混乱。其他答案与这个答案相比非常混乱。其他答案与这个答案相比非常混乱。你是在误导。他将为头部节点分配两次内存,这是不必要的。实际上不是@lekroif,我要求他更改指令顺序。你是在误导。他将为头部节点分配两次内存,这是不必要的。实际上不是@lekroif,我要求他更改指令顺序。你是在误导。他将为头部节点分配两次内存,这是不必要的。实际上不是@lekroif,我要求他更改指令顺序。你是在误导。他将为头部节点分配两次内存,这是不必要的。实际上不是@lekroif,我要求他更改指令顺序。