2016-06-15 4 views
-2

Я не понимаю, как этот код может удалить узел, пожалуйста, помогите !!!удалить узел из связанного списка (C++)

Node* del_place(Node* L, int S) 
{ 

     int i=1; 
     Node *p=L; 
     while (p!=NULL&&i!=S-1) 
     { 
      p=p->next; 
      i++; 
     } 
     p->next=p->next->next;//why can this code delete node in L... 
       return L; 
     } 
+1

Это фрагмент случайного кода. Пожалуйста, напишите [mcve] и объясните, что * вы не понимаете. – nvoigt

+1

Вы должны пройти через функцию по строкам и подумать о том, что делает каждая строка. Обратите особое внимание на то, на что указывает каждый указатель. – user2079303

+1

Принесите бумагу и ручку (cil), нарисуйте связанный список и посмотрите, что произойдет, когда вы нарисуете 'p-> next = p-> next-> next;'. – molbdnilo

ответ

1

Давайте посмотрим, что делает функция. Он принимает два аргумента, связанный список и индекс элемента, который нужно удалить.

Сначала он ищет нужный узел: p - это первый элемент связанного списка. Он начинает переходить через список, до тех пор, пока не будет найден нужный индекс (i=S-1) или до конца списка (p=NULL).

, когда он нашел нужный узел, устанавливает ссылку на следующий элемент: p-> next, следующему пункту следующего пункта.

И теперь, вы также можете увидеть проблемы в функции:

  • Когда элемент удаляется, сам элемент все еще находится в списке, то не просто больше не указатель на него, это утечка памяти, как сказал molbdnilo.
  • Когда конец списка достигнут (p = NULL), вы пытаетесь установить p-> рядом с NULL, это заставит программу выкинуть исключение nullpointer.
  • Если p является последним элементом в списке, p-> Next будет null, и поскольку вы пытаетесь вызвать «Next» на этом элементе, вы также получите исключение nullpointerexception.
1

Линия фактически не удаляет Node из памяти. Он удаляет его из связанного списка.

Код делает ваш текущий Node (p) указывает на второй Node справа, а не первый справа.

Несколько проблем с этим кодом:

  • Потенциальная утечка памяти с Node не удаляется из памяти
  • вам нужно сделать некоторые проверки, прежде чем p->next=p->next->next; или вы могли бы иметь некоторое неопределенное поведение, когда p или p->next в конечном итоге есть NULL. например L is NULL, S> Размер связанного списка ...
Смежные вопросы