Merhaba,
Bugün, geçen hafta sonundan beri (sizler sayesinde) öğrendiğim bağlı liste (aslında 1978'de C'nin 2. sürümüne eklenen struct kavramının birbirlerine bağlı haliymiş: Linked List) olayını pekiştirmeye çalışıyorum...
Zafer'in, önceki sayfada yer alan temiz çözümü (clear~simple~solution) beni bir adım daha ileriye götürdü. Kendisine özellikle teşekkür ederim. Bu konuları araştırdıkça, aslında 1955'e değil benim ana karnında olduğum (1978-1979) zamana denk geldiğini öğrendim. Bu da benimle yaşıt olması anlamına geliyor ki manevi açıdan adeta gazlıyor! Düşünsenize, 30'lu yaşlarımdayım ve henüz yeni öğreniyorum: aaa çok büyük ayıp!...:)
Şaka bir yana, sormak değil öğrenmemek ayıpmış. Ancak şimdi tek bir soru dışında (-bknz. sondaki yıldızlı parantez) sorular ile daha çok başınızı şişirmek istemiyorum. Adım adım, öğrendiklerimi pekiştirmek için yaptığım son denemeleri aşağıda izleniminize sunmalıyım:
- İlk olarak anlayışı kolaylaştırmak için herkesin bildiği atom modelini temel aldım. Her şeyi en basit şekilde anlamam gerektiği için yapıyı da olabildiğince basit (sadece 3 satır!) oluşturdum:
/*
atom.d (23.02.2012)
*/
import std.stdio;
struct Atom {
Atom* element; // Eğer adres değeri F70 ile bitiyorsa,
ubyte proton; // 2. eleman türden bağımsız F74 oluyor
this(Atom* a, ubyte b) { element = a, proton = b; }
}
void main () {
Atom* baştaki, sonraki = new Atom(null, 1); // Hidrojen (en basit element!)
// Yukarıda, kurulum ve ilk değerin (düğümün~node) eşitlenmesi yapılmaktadır,
// sonraki'den kasıt, etkin olan değer(ler)i yani düğümü ifade eder...
foreach(ubyte atomNumarası; 2..4) {
baştaki = new Atom(sonraki, atomNumarası);
sonraki = baştaki;
} do {
writeln(&sonraki.proton, " -> ", sonraki.proton,
"@", &sonraki.element);
sonraki = sonraki.element;
} while(sonraki != null);
}
Çıktısı:
'B7781F74 -> 3@B7781F70
B7781F84 -> 2@B7781F80
B7781F94 -> 1@B7781F90'
- Fakat teknik nedenlerden dolayı veri, tersten (-bknz. yukarıdaki çıktı) birbirlerine bağlanıyordu. Hem bunu düzeltmek, hem de 'main()' içindeki kodlamayı basitleştirmek için yapıyı şöyle oluşturabiliriz:
struct Atom {
Atom* element; // Eğer adres değeri F70 ile bitiyorsa,
ubyte proton; // 2. eleman türden bağımsız F74 oluyor
this(Atom* a, ubyte b) {
this.element = a;
this.proton = b;
}
void atomuEkle(ref Atom* sonraki, ubyte değeri) {
auto ekle = new Atom(null, değeri);
sonraki.element = ekle;
sonraki = ekle;
}
string toString() const {
string tamamı = format("%X -> %d", &proton, proton);
if (element) tamamı ~= "\n" ~ to!string(*element);
return tamamı;
}
}
Satır sayısı arttığı için her şeyi yaydım tabi...:)
Özellikle, 'this{}' kümesi içindeki özdeğişkenlerin başına tekrar this ifadesi kullanmak gerekmediğini bildiğim halde, bunun da olabileceğini göstermek için ifade etmekten kaçınmadım. Aslında satırları katık etmeyi (idareli kullanmayı) severim; böylece tek sayfada görüntüleyebileceğim satır sayısı fazla olduğundan, hakimiyeti (bu bana özel ve standartların dışında!) arttırabiliyorum.
Artık, birini (*) saymazsak sadece iki satır ile sonucu düzgün bir şekilde yansıtabiliyoruz:
import std.stdio, std.conv, std.string; // 2 sınıf daha eklemeliydik!
// main();
: : :
foreach(ubyte atomNumarası; 2..4) sonraki.atomuEkle(baştaki, atomNumarası);
writeln(to!string(*sonraki));
}
Çıktısı:
'BFC4F774 -> 1@BFC4F770
BFC4F6D4 -> 2@BFC4F6D0
BFC4F634 -> 3@BFC4F630'
(*) Eğer 'foreach()' önüne yapının kopyasını birbirine eşitlemezseniz (baştaki = sonraki;) çalışma zamanı hatası verecektir!
Neden?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]