打印链表错误。怎么了?

时间:2015-10-31 17:17:33

标签: c++

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 ++的新手。

2 个答案:

答案 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节点。