C++ 打印链接列表错误。什么';怎么了?

C++ 打印链接列表错误。什么';怎么了?,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

输出为(13830)而不是(1,2)。检查调试器我在这一步中看到节点值从2变为3830
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;
}