Sto studiando sys/queue.h
da FreeBSD e ho una domanda:Perché la lista doppiamente collegata in sys/queue.h mantiene l'indirizzo del precedente elemento successivo?
In sys/queue.h
, LIST_ENTRY
è definito come segue:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
Perché si mantiene l'indirizzo della precedente prossimo elemento (struct type **le_prev
) piuttosto che semplicemente precedente elemento come struct type *le_prev
?
Intendi dire che questa implementazione serve a prevenire l'attraversamento all'indietro e ad ottenere O (1) inserimento e cancellazione? –
@YanzheChen la complessità delle operazioni di elenco (lineare) non cambierà quando si utilizza un puntatore singolo e il doppio puntatore non impedisce l'attraversamento all'indietro. Penso che la parte importante sia "o una schiera di puntatori in avanti"; quando si dispone di una tale tabella (hash), la rimozione è più economica quando viene memorizzato l'indirizzo del puntatore precedente. – ensc
@ensc Ho letto questo [post] (http://stackoverflow.com/questions/9362896/deleting-any-node-from-a-single-linked-list-when-only-pointer-to-that-node- is-gi) e capire che la cancellazione nell'elenco a collegamento singolo può essere ottenuta in O (1) se non è il nodo di coda. Ma perché il doppio puntatore ** non ** impedisce l'attraversamento all'indietro? Come eseguire l'attraversamento all'indietro? E non capisco ** la parte importante ** che hai menzionato. Potresti spiegarlo in maggiori dettagli? –