Ana içeriğe atla

Bağlı Listeler

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..

Yorumlar

Bu blogdaki popüler yayınlar

Python Soket Programlama

Merhaba arkadaşlar. Bugün sizlerle birlikte Python'da socket programlama yapacağız. Bunun için Python da socket kütüphanesini kullanacağız. Peki nedir bu socket programlama? Soket programlama, sizin iki program arası yada iki bilgisayar arası iletişim kurmanızı sağlar. İşte bizde bugün iki programımızı birbiri ile haberleştireceğiz. Bunun için elimizde iki program olacak. Birinci program,mesaj bekleyen program olacak, diğeri ise mesaj gönderen program.

Infix to postfix dönüşümü

Infix to postfix dönüşümü, operatorün ortada olduğu a+b yazım şeklini operatorün sonda olduğu ab+ yazım şekline dönüştürme işlemidir.  Infix gösterimi, bizler için kolay bir gösterim olsa da makineler için öyle değildir. İfadeyi soldan sağa doğru okurken a + b * c işleminde önce b ile c yi çarpıp sonra da a ile toplamayı kolay bir şekilde yapabiliriz çünkü bizim ifadeyi sıra ile soldan sağa adım adım giderek okuma zorunluluğumuz yok. Önce b*c nin öncelikle olduğunu görerek oradan başlar, sonra a ile kolayca toplarız.

Python Subprocess

subprocess modülü, yeni bir process oluşturmayı sağlayan, bunların girdi-çıktılarını ele alma imkânı veren ve dönüş kodlarını almayı sağlayan bir modüldür. Yani daha basit bir şekilde, program içinde program çalıştırmaya imkan veren bir modüldür. Subprocess Modülünün Kullanımı subprocess basit bazı process'leri kullanmak için birkaç tane fonksiyon sunuyor. Daha karmaşık bir process çalıştırmak isterseniz, Popen sınıfını kullanabilirsiniz. Bunlara detaylı bir şekilde değinmeye çalışacağız. Şimdi basit fonksiyonları inceleyelim