У цьому інтерв'ю Slashdot цитується Лінус Торвальдс:
Я бачив занадто багато людей, які видаляють запис, пов'язаний окремо у списку, відслідковуючи запис "prev", а потім видаляючи його, роблячи щось подібне
if (prev)
prev-> next = entry-> next;
else
list_head = entry-> наступний;і коли я бачу такий код, я просто переходжу "Ця людина не розуміє покажчиків". І це, на жаль, досить часто.
Люди, які розуміють покажчики, просто використовують "вказівник на вхідний вказівник" та ініціалізують його з адресою list_head. А потім, переходячи список, вони можуть видалити запис, не використовуючи жодних умовних умов, просто виконавши "* pp = entry-> next".
Як розробник PHP, я не торкався покажчиків після вступу до С в університеті десятиліття тому. Однак я відчуваю, що це такий тип ситуацій, з яким я, принаймні, повинен бути знайомий. Про що говорить Лінус? Якщо чесно, якщо мене попросили застосувати пов'язаний список і видалити елемент, вищезгаданий «неправильний» спосіб - це шлях, який я б пройшов. Що мені потрібно знати, щоб кодувати, як найкраще каже Лінус?
Я запитую тут, а не про Stack Overflow, оскільки у мене фактично не виникає проблем із цим у виробничому коді.
prev
, а не зберігати весь вузол, ви можете просто зберігати розташуванняprev.next
, тому що це єдине, що вас цікавить. Вказівник на покажчик. А якщо ви це зробите, то уникаєте дурнихif
, оскільки зараз у вас немає незручного випадкуlist_head
бути вказівником ззовні вузла. Потім вказівник на голову списку семантично такий же, як вказівник на наступний вузол.