打印链表错误。怎么了?

print linked list error. What's wrong?

本文关键字:怎么了 错误 链表 打印      更新时间:2023-10-16
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(。检查调试器 在此步骤中,我看到节点值从 2 更改为 3830 ptr = ptr->next ;在 PrintNode 中。对不起,我是C++新手。

这是

错误的:

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的另一个答案所提到的,当你完成列表时,不要忘记在你的节点上调用"删除",以避免内存泄漏。

您在AppendNode有一个本地Node。一旦您离开函数,该节点就消失了。

如果必须动态创建节点,请使用 new Node .只是不要忘记稍后delete节点。