5

Basit veri yapıları, örneğin 'ileri' işaretçisinin akıllı bir işaretçi olduğu bağlantılı listeler. Kafa düğümü silindiğinde, 'sonraki' için akıllı işaretçi devreye girer ve yinelemeli bir silme yapar. Uzun bir liste için, bu hızlı bir şekilde yığını uçurur.Akıllı işaretçi, yinelemeli silme nedeniyle yığını darbeler

Bu akıllı işaretçileri basit, ham işaretçilerle değiştirmek için geri dönmek zorunda kaldım. Burada bir şey mi eksik? Bağlantılı bir liste sınıfının iç donanım üzerinde

+0

'Yığını esiyor'? lütfen detaylandırır mısın lütfen. – Flexo

+2

Neredeyse kesinlikle bu akıllı göstericinin hatası değildir. Bize biraz kod göster, uygulamada bir hata olması gerekiyor. Her halükarda, tam liste silme işlemi yineleme değil yineleme ile olmalıdır, bu yüzden sabit yığın alanı almalıdır. –

+1

@Kerrek: muhtemelen, akıllı göstericinin yıkıcısı, pointee başka bir akıllı işaretçi içeriyorsa, yineleme verecek olan pointeeyi siler. Bunu önlemek için akıllı göstericinin nasıl uygulanabileceğini anlamıyorum. –

cevap

5

. 'Eski' başınız silinecek ve eski ikinci yer eşyası başa yükseltilecek. Derin bir tekrarlama olmaksızın hepsi tutarlı bir değişimle. Bunun tek ön koşulu, başlığın NULL ile başlaması değildir. Amaç o zaman bir döngü içinde tekrar edebilir tüm listeyi silmek için ise Mike yorumunda belirttiği gibi

.

+3

Evet, tüm listeyi yinelemeli olarak "while (head) head = head-> next;" –

+1

ile birlikte silebilirsiniz.) Birisi gelip WTF'ye gideceği için yorum yapmayı unutmayın :) – UncleBens

+0

"Your 'old 'kafa silinecek ve eski ikinci yer maddesi başa terfi ettirilecek.' - Bu ifade, ne olduğuyla ilgili yansıtıcı olsa da, inanılmaz bir sadeleştirmedir. Gündelik okuyucu, hem dil mekaniğinde hem de akıllı işaretçi işlevselliğinde * çok * iyi öğrenilmiş olmadıkça, bu çözüm çalışırken, diğer her şeyden daha fazla sihirdir. Ve eğer bu kadar tanıdık geldiyse, muhtemelen ilk etapta buna ihtiyaç duymazlar. Bu basit 'kafa = kafa-> sonraki' atama sırasında gerçekleşen şeyin tam olarak bir adımı, bunu * büyük ölçüde * daha açık hale getirecektir. – WhozCraig

2

Akıllı işaretçiler Seni çok satın görünmüyor. Ham işaretçiler bana göre mükemmel görünüyor. Bence akıllı işaretçiler daha iyi kontrol edilen durumlar için en iyi şekilde kullanılır.

Zihin, böylece yığını darbe için büyük bir liste olmalı, size kodunda bir hata yoktu emin misin?

head = head->next; 

Veya eşdeğeri: Haklı anladığını ve her iki head ve next Eğer yaparak bu sorunun üstesinden gelebilirsiniz akıllı işaretçileri varsayarsak

+0

İnternetteki akıllı işaretçiler, daha yüksek istisna güvenliği garantileri alabilirsiniz. Emek açısından ücretsiz ve çok az ekstra sabit depolama maliyeti. Bu tek başına bana değer gibi görünüyor. – Flexo

+0

Evet, bu adil bir nokta. – john

+0

Eh, yeni oluşturulmuş bir düğümü listeye eklenmeden önce tutmak için akıllı bir işaretçi kullanıyorum. Ancak, eklendikten sonra liste düğümünün yıkıcısının sorumluluğundadır. Sizin de belirttiğiniz gibi, otomatik akıllı işaret tekrarını el ile kodlanmış yinelemeyle değiştirmek için elimde imha makinesinde manuel işlem yapmak zorundayım. İstisna güvenliği konularında ayrıntılı bilgi verir misiniz? Akıllı göstericilerden bağımsız olarak, bir yıkıcıdaki işlenmemiş bir istisnanın programı yine de öldüreceğini düşündüm. – Jay