Почему temp-> next! = NULL работает, а temp! = NULL отсутствует в Связанном списке в C ++

c++ linked-list

5448 просмотра

3 ответа

Почему следующий код не работает? Насколько мне известно, когда temp достигает значения NULL, (новый) он должен создать новый узел с темпом, указывающим на него. Как ни странно, изменение условия while на temp-> next! = NULL работает отлично. Любое объяснение этому?

    #include<iostream>

using namespace std;


class node{
    int data;
    node *next;
public:
    node(){}
    node(int value):data(value),next(NULL){}
    void addNode(node *head,int value){
        node *temp=head;
        while(temp!=NULL){
            temp=temp->next;
        }
        temp=new node(value);
        temp->next=NULL;
    }
    void display(node *head){
        node *temp=head;
        while(temp!=NULL){
            cout << temp->data << endl;
            temp=temp->next;
        }
    }
};


int main(int argc,char** argv){
    node *head=new node(15);
    head->addNode(head,50);
    head->addNode(head,22);
    head->display(head);
    cin.ignore();
    return 0;
}
Автор: Uzair Riaz Источник Размещён: 08.11.2019 11:01

Ответы (3)


1 плюс

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

Сначала мы находим последний узел в списке

node * tmp = head;
while(tmp->next != NULL){
tmp = tmp->next
}

Теперь у нас есть последний узел в списке. мы выделяем новый и заполняем его

tmp->next = new node;
tmp = tmp->next;
tmp->x = data;
tmp->next = NULL;

почему твой цикл не останавливается. может быть, голова не инициализирована, и у вас есть петля в списке (просто место в памяти, в котором вы путешествуете)

добавление с головой может быть нулевым.

if(tmp != null){
    while(tmp->next != NULL){
    tmp = tmp->next
    }
    tmp->next = new node;
    tmp = tmp->next;
} else {
    head = tmp = new node;
}
Автор: roni Размещён: 20.08.2016 01:00

0 плюса

Stackoverflow не позволяет мне публиковать изображения ... как я новый пользователь .XD

Сначала посмотрите это изображение

Итак, когда вы завершили свой цикл с: while(temp!=NULL)вы в конечном итоге, как показано на рисунке.

Теперь, когда вы вводите код:

temp = новый узел (значение); TEMP-> следующая = NULL;

Он выделяет некоторую память для temp в куче и никак не связан с вашим связанным списком. Таким образом, всякий раз, когда вы используете связанный список, рекомендуется размещать только указатели, которые состоят из переменных вашего класса (в данном случае это так next).

В конце концов, tempэто просто временная переменная, просто указывающая на узлы связанного списка и выделяющая ему память, в любом случае не изменит связанного списка. Таким образом, всегда выделяйте как использование temp->next. Не только для распределения, но и для переключения соединений.

По этой причине ваш код не работает ожидаемым образом.

Автор: Nihhaar Размещён: 20.08.2016 10:49

0 плюса

Вы реализуете Queueкак linked listиспользование pointers. Когда вы вставляете новый узел в конце своего, Queue/linked listвам нужно найти последний узел списка, чтобы tempуказатель (который вы используете для перемещения по списку) указывал на последний узел списка и temp->nextуказывал на NULL. Затем вы можете вставить новый узел с помощью temp->next = new node(value);строки «Вам не нужна» temp->next = NULL;после этого, потому что это уже сделано в конструкторе при создании нового узла.

Если вы используете условие, temp!=NULLтогда tempвы пройдете весь список и в конечном итоге будете указывать на nextпоследний узел, а не указывать на последний узел / элемент списка (это то, что вам нужно). tempне будет иметь никакой связи с вашей очередью / связанным списком. Вот почему вам нужно условие

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

в вашей addNodeфункции. Я изменил вашу функцию ниже:

void addNode(node *head,int value){
     node *temp=head;
     while(temp->next!=NULL){
          temp=temp->next;
     }
     temp->next=new node(value);
}
Автор: M. M Размещён: 17.03.2017 07:24
Вопросы из категории :
32x32