Nesta entrevista ao Slashdot, Linus Torvalds é citado como tendo dito:
Eu já vi muitas pessoas que excluem uma entrada de lista vinculada individualmente acompanhando a entrada "anterior" e, em seguida, para excluir a entrada, fazendo algo como
se (anterior) anterior-
> próxima = entrada-> próxima;
else
list_head = entry-> next;e sempre que vejo código assim, simplesmente digo "Essa pessoa não entende ponteiros". E, infelizmente, é bastante comum.
As pessoas que entendem ponteiros simplesmente usam um "ponteiro para o ponteiro de entrada" e inicializam isso com o endereço do list_head. E então, ao percorrer a lista, eles podem remover a entrada sem usar condicionais, apenas executando "* pp = entry-> next".
Como desenvolvedor de PHP, não toquei em indicadores desde a introdução ao C na universidade há uma década. No entanto, sinto que este é um tipo de situação com a qual devo pelo menos estar familiarizado. Sobre o que Linus está falando? Para ser sincero, se me pedissem para implementar uma lista vinculada e remover um item, a maneira 'errada' acima é a maneira que eu faria. O que preciso saber para codificar como Linus diz melhor?
Estou perguntando aqui, e não no Stack Overflow, pois não estou tendo um problema com isso no código de produção.
prev
, em vez de armazenar o nó inteiro, pode simplesmente armazenar a localizaçãoprev.next
, já que essa é a única coisa na qual você está interessado. Um ponteiro para um ponteiro. E se você fizer isso, evite o toloif
, já que agora não tem o caso estranho delist_head
ser um ponteiro de fora de um nó. O ponteiro para o início da lista é semanticamente o mesmo que o ponteiro para o próximo nó.