Почему «new» не используется при создании текущей переменной в списке ссылок? - PullRequest
1 голос
/ 07 апреля 2020

Это решение для печати элементов связанного списка.

Почему не Node *current = new Node;, а затем current = head;?

void printLinkedList(Node* head)
{
    Node *current = head;    
    while(current!=NULL){
        cout << current -> data << endl;
        current = current -> next;
    }
}

Ответы [ 2 ]

6 голосов
/ 07 апреля 2020

Это отличное место для рисования картинок!

Представьте, что у нас есть связанный список, на который указывает head:

 head
   |
   v
+------+    +-----+    +-----+    +-----+
| i'm  | -> | the | -> | bad | -> | guy | -> null
+------+    +-----+    +-----+    +-----+

Если мы используем строку кода

Node *current = new Node;

тогда память выглядит так:

 head                                                current
   |                                                    |
   v                                                    v
+------+    +-----+    +-----+    +-----+            +------+
| i'm  | -> | the | -> | bad | -> | guy | -> null    | duh! | -> ?
+------+    +-----+    +-----+    +-----+            +------+

Цель функции - напечатать существующий список, на который указывает head, но здесь у нас есть указатель на новый ячейка связанного списка, которая не является частью существующего списка. В результате мы совершили два греха программирования:

  • Мы выделили память для ненужного нам объекта.
  • Мы нарушили договор, с которым заключили клиент.

С другой стороны, если мы напишем

Node *current = head;

, то память будет выглядеть так:

 head
   |
   v
+------+    +-----+    +-----+    +-----+
| i'm  | -> | the | -> | bad | -> | guy | -> null
+------+    +-----+    +-----+    +-----+
   ^
   |
current

Здесь current есть теперь указываем на существующий список, чтобы мы могли просмотреть список и найти то, что нам нужно. Здесь не нужно создавать новые узлы, поэтому мы не создаем никаких новых узлов.

Вообще говоря, в C ++ вам следует избегать использования new, если вы действительно не хотите создавать новую ячейку связанного списка. В этом случае мы не хотим этого делать, поэтому мы создаем current и указываем на существующую ячейку связанного списка.

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

1 голос
/ 07 апреля 2020

Поскольку узел уже существует.

new создаст новый.

Вам не нужно или вы не хотите создавать новый.

Вы просто хочу «использовать» указатель на существующий узел.

Вот только аргумент функции, который копируется в переменную с другим именем. На самом деле это совершенно не нужно.

...