Ошибка сегментации (дамп ядра) в C ++ со связанной реализацией List basi c - PullRequest
0 голосов
/ 29 января 2020

Я знаю, что есть много вопросов, которые основаны на ядре ошибки сегментации, сброшенном в C ++, но я не могу решить эту ошибку. Мой код прост, чтобы создать список ссылок и распечатать его. Я хочу знать, почему это неправильно, потому что я новичок в этом топи c и хочу узнать больше и как он работает и что означают ошибки.

Код ниже:


using namespace std;
struct node
{
    int data;
    node *next;
};

node *head =NULL;
void addnode(int x)
{
    node *temp =new node;
    temp->data = x;
    temp ->next = NULL;
    if(head==NULL)
    {
        head = temp;
    }
    else
    {
        node *p =head;
        while(p!=NULL)
        {
            p=p->next;
        }
        p->next =temp;
        temp =NULL;
    }
}

void display(node *head)
{
    node *temp=new node;
    temp = head;
    while(temp!=NULL)
    {
        cout<<temp->data<<" , ";
        temp = temp->next;
    }
    cout<<endl;
}

int main()
{
    cout<<"Hello World";
    node work;
    addnode(12);
    addnode(11);
    addnode(1);
    addnode(22);
    display(head);

    return 0;
}

Скорее всего, я возиться с указателем головы, и поэтому возникает такая ошибка, но я хочу знать, что касается моего кода, что я делаю здесь неправильно.

Спасибо. Очень ценится.

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Для начала это объявление

node work;

не имеет смысла. Вы уже объявили указатель на головной узел.

node *head =NULL;

В функции addnode в этом фрагменте кода

else
{
    node *p =head;
    while(p!=NULL)
    {
        p=p->next;
    }
    p->next =temp;
    temp =NULL;
}

l oop

    while(p!=NULL)
    {
        p=p->next;
    }

выполняется до тех пор, пока p не станет равным NULL. Поэтому использование нулевого указателя в следующем операторе

    p->next =temp;

приводит к неопределенному поведению.

Этот фрагмент кода должен выглядеть следующим образом:

else
{
    node *p = head;
    while( p->next != NULL )
    {
        p = p->next;
    }
    p->next = temp;
}

Дисплей функции имеет утечка памяти, потому что сначала выделяется память, а ее адрес назначается указателю temp, а затем указатель переназначается. Таким образом, выделенная память не будет удалена.

node *temp=new node;
temp = head;

Функция может выглядеть как

void display(node *head)
{
    for( node *temp = head; temp !=NULL; temp = temp->next )
    {
        cout<<temp->data<<" , ";
    }
    cout<<endl;
}

Или даже как

void display( const node *head )
{
    for( const node *temp = head; temp !=NULL; temp = temp->next )
    {
        cout<<temp->data<<" , ";
    }
    cout<<endl;
}

В любом случае интерфейс списка противоречиво Функция addnode имеет дело с глобальной переменной head, а функция display получает параметр. Это плохая идея использовать глобальную переменную, особенно когда функции зависят от такой переменной.

2 голосов
/ 29 января 2020

Использование

while(p!=NULL)
{
    p=p->next;
}
p->next =temp;

является проблемой. Когда l oop разрывается, p является нулевым указателем. После этого p->next не хорошо. Вам необходимо использовать:

while (p->next != NULL)
{
    p = p->next;
}
p->next = temp;
...