Я попытался напечатать функцию, чтобы добавить узел в конце односвязного списка, но это не работает - PullRequest
0 голосов
/ 26 июня 2019

Я набрал функцию для добавления узла в конец односвязного списка. Но это не работает.

Я пытался использовать if else для отображения 1-го узла, когда список пуст (по условию head = NULL). Как-то похоже на работу.

void insert(int x)
 {
    node* temp=new node;
    node* n=head;
    temp->data=x;
    temp->next=NULL;

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

Программа показывает ошибку сегментации.

1 Ответ

4 голосов
/ 26 июня 2019

Это просто назначает ваш новый узел локальной переменной n. Это ничего не меняет в вашем списке:

n=temp; 

Эффективным способом сделать это было бы что-то вроде этого:

void insert(int x)
{
    node** pp = &head;
    while (*pp)
        pp = &(*pp)->next;

    *pp = new node;
    (*pp)->data = x;
    (*pp)->next = nullptr;
}

Это просто обходит указатели в списке, используя указатель на указатель. После нахождения указателя завершения (который может быть head, если список пуст и значение head было nullptr в случае, если это не было очевидно), новый узел выделяется и подвешивается на месте. Это также устраняет проблему в исходном сообщении (повешение первого узла в пустом списке с нулевым значением head).

...