struct Node
{
int data;
struct Node *next;
};
Node *AppendNode(Node *head, int data) {
Node *ptr = head;
struct Node node = {data, ptr->next};
head->next = &node;
return head;
}
void PrintNode(Node *head) {
Node *ptr = head;
while (ptr != 0) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
}
int main() {
Node node = {1 , 0};
Node* head = &node;
head = AppendNode(head, 2);
PrintNode(head);
return 0;
}
输出是(1,3830)而不是(1,2)。检查调试器我在此步骤ptr = ptr->next
中看到节点值从2变为3830;在PrintNode中。对不起,我是C ++的新手。
答案 0 :(得分:2)
这是错误的:
Node *AppendNode(Node *head, int data) {
Node *ptr = head;
struct Node node = {data, ptr->next};
head->next = &node;
return head;
}
您正在将指向本地堆栈变量的指针插入到链接列表中。一旦函数返回,&node
引用的内存很快就会被破坏。
此外,在作业被泄露(并丢失)之前,head->next
之前指向的是什么。
更好:
Node* AppendNode(Node *head, int data)
{
Node* newNode = new Node;
newNode->data = data;
newNode->next = head;
head = newNode;
return head;
}
但从技术上讲,上面是“预先”到列表中,而不是像你的功能签名所暗示的那样“附加”。也许这就是你想要的,但如果不是,那就是我要留给你的练习。 :)
正如Bo提到的另一个答案,当你完成列表以避免内存泄漏时,不要忘记在节点上调用“delete”。
答案 1 :(得分:2)
Node
中有一个本地AppendNode
。离开函数后,该节点就消失了。
如果必须动态创建节点,则使用new Node
执行此操作。暂时不要忘记delete
节点。