Programlama yaparken, verileri birarada tutmak için genelde diziler kullanılır. Diziler tanımlandığı zaman boyutu belirtilir ve bu boyuta göre hafızada yer ayrılır. İçinde eleman olmasına gerek yok, yani boş bir dizi için bile hafızada yer ayrılır. Bu durumda büyük rakamları bulan boyutlarda bir dizi tanımlandığında hafızada boşa yer kaplar.
Diziler bu yönden dezavantaja sahiptir. Dizilerin bir başka dezavantajı, boyutlarının değişmez olmasıdır. Yani elinizdeki diziye eleman ekleyip doldurduktan sonra, bir eleman daha eklemek isterseniz yeni bir dizi oluşturup tüm elemanları bu yeni diziye aktarmanız gerekecektir. Bu da uğraştırıcıdır ve pek hoş karşılanmaz.
Dizilerde listenin herhangi bir yerine yeni bir eleman eklemek de sıkıntılıdır. Çünkü araya eklenecek herhangi bir eleman için, dizinin geri kalan tüm elemanları kaydırılacaktır.
Bu tür sorunlarla baş etmek için farklı veri tutma modelleri geliştirilmiştir. Bunlardan birisi de bağlı listelerdir. Bağlı listelerdeki her eleman, bir sonraki elemanın yerini tutacak şekilde düzenlenmiştir. Bağlı listelerde boyut yoktur, yani liste dinamik olarak genişler. Araya ekleme işlemleri de kolaydır, sadece ilgili düğümün işaret ettiği düğümü değiştirmek yeterli olacaktır. Bunlarla ilgili örnekler yapacağız, şimdilik bağlı listeleri tanımladığımız için, bazı kavramlar yabancılık çekmeye sebep olabilir. Ancak örneklerle gördüğümüzde gayet kolay olduğunu göreceğiz.
Her bağlı listenin mutlaka bir düğümü olmalıdır. Bu düğümler, dizilerde bildiğimiz elemanları temsil eder. Ancak, bağlı listelerdeki düğümler birer nesnedir, ve iki tip veri tutar. Birincisi kendi içeriği, diğeri ise işaret ettiği düğüm. Bir düğümün olmazsa olmazlarıdır.
Bağlı listelerin de mutlaka root yani kök düğümü olmalıdır. Çünkü bu kök düğüm, diğer düğümlere ulaşmak için gereklidir. Kök düğüm olmadığında diğer düğümlere ulaşmak imkansızdır.
Çok basit bir şekilde bir bağlı liste ve düğümü nasıl oluşturacağımızı hep beraber görelim
Dugum sınıfı, yukarıda belirttiğimiz gibi iki adet niteliğe sahip. Birincisi, düğümün tutacağı veri, diğeri ise kendinden sonraki düğümün işaretçisi. Verinin bir int olması gerekmiyor. Her türlü veri bağlı listeler ile tutulabilir. Örneklerimizde kolaylık olması açısından genelde int veri tipini kullanıyoruz.
Şimdi, bağlı listemize bakalım. Bağlı listemizin bir tane niteliği var, o da listenin en başını işaret eden root(kök) düğüm. Bu bağlı listemizin şimdilik sadece bir tane metodu var. Bu metod, listeye ekleme yapmak için kullanılıyor. Bu metodu şimdi biraz inceleyelim.
Bağlı listemiz, Dugum nesnelerini alan ve bunları listeye ekleyen bir yapıdan oluşmuş. Bu yüzden ekle() metodumuz da bir Dugum nesnesini parametre olarak alıyor.
Daha sonra, bu metodumuzun içerisinde bir tane temp nesnesi oluşturduk ve root(kök) un kendisini aktardık. Böylece, kök düğümümüzü kaybetmemiş olduk. temp üzerinde işlem yapsak dahi root düğümümüz değişmediği için listenin ilk düğümünü kaybetmemiş oluruz.
Eğer, kök düğümümüz null ise demek ki listemizde hiç düğüm yoktur. Bu yüzden yeni gelen düğümü kök düğüm olarak belirtmemiz gerekir.
Ancak null değilse, "ileri" niteliği herhangi bir düğümü göstermeyen bir düğüm bulana kadar ileri gideceğiz. İşaret ettiği bir düğüm olmayan, yani "ileri" niteliği null olan bir düğüme denk gelene kadar while döngüsünü devam ettirdik.
Döngü bittikten sonra, listenin son elemanına ulaştık demektir. Bu son elemanın bir sonra işaret edeceği düğüm, bizim listeye yeni ekleyeceğimiz düğümdür. temp.ileri = yeni diyerek düğümümüzü listenin sonuna eklemiş olduk.
Peki, eklediğimiz bu düğümleri tıpkı bir dizinin elemanlarını ekrana yazdırır gibi nasıl yazdırabiliriz? Çok basit. Kök düğümden başlayarak, son düğüme kadar while döngüsü oluşturarak her aşamada düğümün değerini ekrana yazabiliriz. Hemen görelim
While döngüsünün koşulu olan temp != null koşulu şu anlama geliyor. Listedeki son düğüme ulaştığımızda, bu düğümün ilerisi null olduğu için, döngü içinde temp, null değerini alacaktır. Bu da, artık bu aşamadan sonra düğüm olmadığını gösterir. Döngü bir sonraki aşamada temp değerinin null olduğunu görür ve sona erer.
Yazı biraz uzun oldu, isterseniz burda duralım. Bir sonraki yazıda devam ederiz. Görüşmek üzere..
Diziler bu yönden dezavantaja sahiptir. Dizilerin bir başka dezavantajı, boyutlarının değişmez olmasıdır. Yani elinizdeki diziye eleman ekleyip doldurduktan sonra, bir eleman daha eklemek isterseniz yeni bir dizi oluşturup tüm elemanları bu yeni diziye aktarmanız gerekecektir. Bu da uğraştırıcıdır ve pek hoş karşılanmaz.
Dizilerde listenin herhangi bir yerine yeni bir eleman eklemek de sıkıntılıdır. Çünkü araya eklenecek herhangi bir eleman için, dizinin geri kalan tüm elemanları kaydırılacaktır.
Bu tür sorunlarla baş etmek için farklı veri tutma modelleri geliştirilmiştir. Bunlardan birisi de bağlı listelerdir. Bağlı listelerdeki her eleman, bir sonraki elemanın yerini tutacak şekilde düzenlenmiştir. Bağlı listelerde boyut yoktur, yani liste dinamik olarak genişler. Araya ekleme işlemleri de kolaydır, sadece ilgili düğümün işaret ettiği düğümü değiştirmek yeterli olacaktır. Bunlarla ilgili örnekler yapacağız, şimdilik bağlı listeleri tanımladığımız için, bazı kavramlar yabancılık çekmeye sebep olabilir. Ancak örneklerle gördüğümüzde gayet kolay olduğunu göreceğiz.
Her bağlı listenin mutlaka bir düğümü olmalıdır. Bu düğümler, dizilerde bildiğimiz elemanları temsil eder. Ancak, bağlı listelerdeki düğümler birer nesnedir, ve iki tip veri tutar. Birincisi kendi içeriği, diğeri ise işaret ettiği düğüm. Bir düğümün olmazsa olmazlarıdır.
Bağlı listelerin de mutlaka root yani kök düğümü olmalıdır. Çünkü bu kök düğüm, diğer düğümlere ulaşmak için gereklidir. Kök düğüm olmadığında diğer düğümlere ulaşmak imkansızdır.
Çok basit bir şekilde bir bağlı liste ve düğümü nasıl oluşturacağımızı hep beraber görelim
Dugum sınıfı, yukarıda belirttiğimiz gibi iki adet niteliğe sahip. Birincisi, düğümün tutacağı veri, diğeri ise kendinden sonraki düğümün işaretçisi. Verinin bir int olması gerekmiyor. Her türlü veri bağlı listeler ile tutulabilir. Örneklerimizde kolaylık olması açısından genelde int veri tipini kullanıyoruz.
Şimdi, bağlı listemize bakalım. Bağlı listemizin bir tane niteliği var, o da listenin en başını işaret eden root(kök) düğüm. Bu bağlı listemizin şimdilik sadece bir tane metodu var. Bu metod, listeye ekleme yapmak için kullanılıyor. Bu metodu şimdi biraz inceleyelim.
Bağlı listemiz, Dugum nesnelerini alan ve bunları listeye ekleyen bir yapıdan oluşmuş. Bu yüzden ekle() metodumuz da bir Dugum nesnesini parametre olarak alıyor.
Daha sonra, bu metodumuzun içerisinde bir tane temp nesnesi oluşturduk ve root(kök) un kendisini aktardık. Böylece, kök düğümümüzü kaybetmemiş olduk. temp üzerinde işlem yapsak dahi root düğümümüz değişmediği için listenin ilk düğümünü kaybetmemiş oluruz.
Eğer, kök düğümümüz null ise demek ki listemizde hiç düğüm yoktur. Bu yüzden yeni gelen düğümü kök düğüm olarak belirtmemiz gerekir.
Ancak null değilse, "ileri" niteliği herhangi bir düğümü göstermeyen bir düğüm bulana kadar ileri gideceğiz. İşaret ettiği bir düğüm olmayan, yani "ileri" niteliği null olan bir düğüme denk gelene kadar while döngüsünü devam ettirdik.
Döngü bittikten sonra, listenin son elemanına ulaştık demektir. Bu son elemanın bir sonra işaret edeceği düğüm, bizim listeye yeni ekleyeceğimiz düğümdür. temp.ileri = yeni diyerek düğümümüzü listenin sonuna eklemiş olduk.
Peki, eklediğimiz bu düğümleri tıpkı bir dizinin elemanlarını ekrana yazdırır gibi nasıl yazdırabiliriz? Çok basit. Kök düğümden başlayarak, son düğüme kadar while döngüsü oluşturarak her aşamada düğümün değerini ekrana yazabiliriz. Hemen görelim
While döngüsünün koşulu olan temp != null koşulu şu anlama geliyor. Listedeki son düğüme ulaştığımızda, bu düğümün ilerisi null olduğu için, döngü içinde temp, null değerini alacaktır. Bu da, artık bu aşamadan sonra düğüm olmadığını gösterir. Döngü bir sonraki aşamada temp değerinin null olduğunu görür ve sona erer.
Yazı biraz uzun oldu, isterseniz burda duralım. Bir sonraki yazıda devam ederiz. Görüşmek üzere..
Yorumlar
Yorum Gönder