Biraz kod örneği teorik tartışma daha iyi bir açıklama olacağını düşünüyoruz. Aşağıdaki
NULL
iki işaretçiler first
ve last
ilk ve son noktasının adresini tutmak için kullanılır listesinin sonunu ve işaretlemek için kullanılır düğümlerin bir çift bağlı bir listede düğüm silme kodudur:
// Using NULL and pointers for first and last
if (n->prev) n->prev->next = n->next;
else first = n->next;
if (n->next) n->next->prev = n->prev;
else last = n->prev;
ve bu yerine listedeki ilk düğümün adresi özel düğüm ve next
alanında depolanan özel kukla listesinin sonunu işaretlemek için düğüm ve orada aynı koddur listedeki son düğüm özel kukla düğümün prev
alanında depolanır:
// Using the dummy node
n->prev->next = n->next;
n->next->prev = n->prev;
basitleştirme daha da açık düğüm sokulması için mevcuttur; Örnek düğüm x
önce düğümü n
eklemek için kodu olacaktır (son pozisyonda yerleştirilmesini anlamına x == NULL
veya x == &dummy
sahiptir):
// Using NULL and pointers for first and last
n->next = x;
n->prev = x ? x->prev : last;
if (n->prev) n->prev->next = n;
else first = n;
if (n->next) n->next->prev = n;
else last = n;
ve
// Using the dummy node
n->next = x;
n->prev = x->prev;
n->next->prev = n;
n->prev->next = n;
için uzaklaştırıldı kukla düğüm yaklaşımı görüldüğü gibi iki bağlantılı bir liste tüm özel durumlar ve şartlar. şimdi çok daha mantıklı
aşağıdaki resim hafızasında aynı liste için iki yaklaşımı temsil ... örneğin
sayesinde. Sadece yineleme açısından düşünüyordum, bu yüzden gerçekten fayda görmedim. – spbots
Bir şey değil - nöbetçi gerçekten istismar edebilirsiniz algoritmalar için değişmezleri ayarı sadece akıllı bir yoldur! – ltjax
'find()' veri yapısını değiştirmesi gerektiği fikrinden hoşlanmıyorum; Örneğin, hepsi sadece öğeleri arıyor olsa bile, birden fazla iş parçacığı tarafından 'bul 'kullanarak kural dışı bırakılır. – 6502