Дважды связанный список - - Я указываю на узел2 -> пред = ноль, после удаления узла1? - PullRequest
0 голосов
/ 03 мая 2019

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

Я пытаюсь удалить первый узел в списке. затем указывая головой -> 2-й узел и 2-й узел * previous = NULL (теперь это будет первый узел)

void deleteFirst()
        {
            if(head != NULL)
            {
                node *temp = new node;
                temp = head;
                head -> next -> prev = NULL;
                head = head -> next;
                delete temp;
            }

            else{
                cout << endl << "List is Empty" << endl;
            }

        }

Я получаю правильный ответ, но хочу проверить, правильно ли назначены мои указатели. Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

у вас есть две небольшие проблемы:

  1. Вы создаете новый узел и присваиваете ему temp.После этого вы перезаписываете указатель, чтобы указать на head.При этом вы потеряете ссылку на вновь созданный узел и не сможете удалить его позже.Вы должны опустить первую строку и напрямую присвоить head для temp.

  2. Вы не проверяете, является ли head->next nullptr.Если это так, вы не можете разыменовать его и получить доступ к prev.Вы можете воспроизвести эту ошибку с помощью одноэлементного списка.

Надеюсь, это поможет!

0 голосов
/ 03 мая 2019

Этот код не работает.

1) не создавайте свой собственный связанный список, просто используйте std::list (или обычно лучше; std::vector).

2) не используйте NULL, используйте nullptr.

3) не использовать ручное управление памятью; используйте контейнеры и умные указатели.

4) помните, что delete указатель не волшебным образом устанавливает его на nullptr, вы должны сделать это самостоятельно, если это необходимо.

5) утечка памяти; Вы выделяете новое хранилище и присваиваете его адрес temp, затем немедленно перезаписываете temp с помощью head и забываете все о вновь выделенном хранилище.

6) Тогда вы delete temp, что в этот момент равняется delete head->next. Наверное, не то, что вы хотите.

...