我对C相当陌生,我正在复制链表。它在while循环中存在错误,我认为我有一些指针问题。此外,我不确定是否需要malloc每个"下一个"节点。我做了什么?这对我来说是有意义的。
struct node* copyList() {
struct node* walker = head; // starting point to "walk" the list
struct node* temp;
temp = (struct node*)malloc(sizeof(struct node));
temp->data = walker->data;
while( walker != NULL ){ // done when we reach the node pointing to NULL
walker = walker->next; // advance walker to the next node in the list
temp = temp->next;
temp = (struct node*)malloc(sizeof(struct node));
temp->data = walker->data;
}
return walker;
}
节点结构如下
struct node {
int data;
struct node* next;
};
假设到达最后一个节点…
现在在循环中,你增加walker
..所以现在walker = NULL
..
所以这个语句给出了一个错误temp->data = walker->data
..
- 你需要维护新的Head指针在结束时返回
- 保持先前节点的引用,以便您可以将其链接到当前节点
- 更新指针
按以下行修改
struct node* copyList() {
struct node* walker = head; // starting point to "walk" the list
struct node* newHead=NULL,temp,prev=NULL;
while( walker != NULL ){ // done when we reach the node pointing to NULL
temp = (struct node*)malloc(sizeof(struct node)); //create new node
temp->data = walker->data; //copy data
if(prev==NULL) //if its first node
newHead = temp; //new head pointer
else
prev->next = temp; //else link to previous node
prev = temp; //update pointers
walker = walker->next;
}
return newHead;
}
您期望循环中temp->next
的值从哪里来?
同样,为了获得更多的元数据,你最好在c++中使用std::list,而不是像这样实现你自己的数据结构。即使对于经验丰富的工程师来说,这样的努力也是出了名的容易出错。