Öncelikle kodu veriyorum:
import std.array, std.conv, std.stdio, std.string;
struct AĞAÇ {
int yaprak;
AĞAÇ* sonrakiDal;
this(int yaprak, AĞAÇ* sonrakiDal) {
this.yaprak = yaprak;
this.sonrakiDal = sonrakiDal;
}
void başınaEkle(int değeri, ref AĞAÇ* boğumu) {
boğumu = new AĞAÇ(değeri, boğumu);
}
void ekle(int değeri, ref AĞAÇ* boğumu) {
auto ekle = new AĞAÇ(değeri, null);
boğumu.sonrakiDal = ekle;
boğumu = ekle;
}
string toString() const {
string tamamı = format("%d\t@%X", yaprak, &yaprak);
if (sonrakiDal) tamamı ~= "\n" ~ to!string(*sonrakiDal);
return tamamı;
}
}
void main (){
AĞAÇ* yedek, soy = new AĞAÇ(0, null);
yedek = soy;
foreach(r; 1..4) soy.ekle(r, yedek);
writeln("AĞAÇdakiler~~~~~v\n", to!string(*soy));
soy.başınaEkle(5, soy);
writeln("AĞAÇdakiler~~~~~v\n", to!string(*soy));
}
Konu hakkında başka başlıkta tartışmıştık. Orada yazanları aynen ekliyorum. Tek yaptığım değişiklik, gereksiz şeyleri yansıtmayıp (ama sonuç adres değerleri dışında yine aynı!) ubyte yerine int'e geçmem. Tabi bellek değerleri arasında mesafe ne hikmetse yine aynı kalıyor. Yakında şu bağlı liste olayını anlayacağım ama hala şaşırıyorum ki taaa 1955'de ortaya atılan bir şeymiş...:)
Şu şekilde listemi oluşturuyorum: foreach(r; rakamlar) soy.ekle(r, yedek);
Çıktısı:
'AĞAÇdakiler~~~~~v
0 @BFB4E214
1 @BFB4E174
2 @BFB4E0D4
3 @BFB4E034'
ve bir güzel başına ekleme yapıyorum: soy.başınaEkle(5, soy); Kodu ise basit, şu:
void başınaEkle(ubyte değeri, ref AĞAÇ* boğumu)
{
boğumu = new AĞAÇ(değeri, boğumu);
}
Bu durumda aynı çalışma anında bunun gibi ilginç bir sonuç çıkıyor:
'AĞAÇdakiler~~~~~v
5 @BFB4E214
0 @BFB4E174
1 @BFB4E0D4
2 @BFB4E034
3 @BFB4DF94'
Tamam, öngördüğümüz gibi başına ekliyor ama dikkat E214 ile biten 0 değerli eleman yerine başına eklediğim geliyor ve diğerleri aynı bellek değerleri ile aşağıya kayıyor! Allah Allah, bu nasıl bağlı liste? Eğer bütün dillerde böyle çalışıyorsa herhalde yavaş olur diye düşünmeden edemiyorum... :rolleyes:
Teşekkürler...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]