SIGSEGV(分段错误)c ++对列表的pushBack()有用

问题描述 投票:-1回答:1

运行此代码时我遇到了段错误,无法理解原因。如果首先我使用一次push(&head,3);则无法捕获segfault,但对于true来说效果不好

#include <iostream>
using namespace std;
struct Node
{
    int data;
    Node *next;
};

void push(Node **head,int data)
{
    Node *tmp = new Node;
    tmp->data = data;
    tmp->next = (*head);
    (*head) = tmp;
}
Node *getLast(Node *head)
{
    if(head == nullptr)
    {
        return nullptr;
    }
    while(head->next)
    {
        head=head->next;
    }
    return head;
}
void show(const Node *head)
{
    while(head!=nullptr)
    {
        cout << head->data << endl;
        head = head->next;
    }
}

void pushBack(Node *head,int data)
{
    Node *last = getLast(head);
    Node *tmp = new Node;
    tmp->data = data;
    tmp->next = nullptr;
    last->next = tmp;
}
int main() {
    Node *head=nullptr;
    **//push(&head,2);  /////if I use this then it works! but it not right.**
    pushBack(head,10);
    pushBack(head,2);
    pushBack(head,3);
    show(head);
    return 0;
}

我曾尝试用Google搜索它,但无助。如何解决这个问题?

c++ c++11 visual-c++ c++14 c++-cli
1个回答
0
投票

如果链接列表为空,则必须修改head,这需要传递head的引用。这应该工作:

void pushBack(Node **head,int data)
{
    Node *last = getLast(*head);
    Node *tmp = new Node;
    tmp->data = data;
    tmp->next = nullptr;
    if(last == nullptr)
    {
        *head = tmp;
    }
    else
    {
        last->next = tmp;       
    }
}
int main() {
    Node *head=nullptr;
    pushBack(&head,10);
    pushBack(&head,2);
    pushBack(&head,3);
    show(head);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.