C++ 打印链接列表错误。什么';怎么了?
输出为(13830)而不是(1,2)。检查调试器我在这一步中看到节点值从2变为3830C++ 打印链接列表错误。什么';怎么了?,c++,C++,输出为(13830)而不是(1,2)。检查调试器我在这一步中看到节点值从2变为3830ptr=ptr->next;在PrintNode内部。对不起,我是C++新手。p> 这是错误的: struct Node { int data; struct Node *next; }; Node *AppendNode(Node *head, int data) { Node *ptr = head; struct Node node = {data, ptr->n
ptr=ptr->next
;在PrintNode内部。对不起,我是C++新手。p> 这是错误的:
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;
}
您正在将指向本地堆栈变量的指针插入到链接列表中。一旦函数返回,&node
引用的内存很快就会被阻塞
此外,在分配被泄露(和丢失)之前,先前指向的head->next
更好:
Node *AppendNode(Node *head, int data) {
Node *ptr = head;
struct Node node = {data, ptr->next};
head->next = &node;
return head;
}
但从技术上讲,上述内容是列表的“前置”,而不是函数签名所暗示的“附加”。也许这就是你想要的,但如果不是,那我就留给你做练习。:)
正如Bo的另一个答案所提到的,当您处理完列表时,不要忘记在节点上调用“delete”,以避免内存泄漏。您在
AppendNode
中有一个本地节点。一旦离开函数,该节点就消失了
如果必须动态创建节点,则可以使用新建节点
。只是不要忘记以后删除节点。您的AppendNode函数错误。您正在获取局部变量的地址。node变量应该是指向通过new在堆上创建的节点的指针。
Node* AppendNode(Node *head, int data)
{
Node* newNode = new Node;
newNode->data = data;
newNode->next = head;
head = newNode;
return head;
}