这是我复制列表的功能。错误是它总是复制第一个元素两次。我究竟做错了什么?
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;
}
答案 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
。