Home / Veri Yapıları / Çift Yönlü Bağlı Listeler Konu Anlatımı – Çift Yönlü Bağlı Liste Oluşturma

Çift Yönlü Bağlı Listeler Konu Anlatımı – Çift Yönlü Bağlı Liste Oluşturma

Daha önce Veri Yapıları Derslerimiz kapsamızda Tek Yönlü Bağlı Listeler konusunu anlatmıştık. Bu dersimiz kapsamında Çift Yönlü Bağlı Liste konusuna değineceğiz.

Çift yönlü bağlı listeler yapısal anlamda tek yönlü bağlı listelere çok benzer, tek farkları ise fazladan işaretçi değişken barındırmalarıdır. Hatırlıyorsanız tek yönlü bağlı listeler yalnızca kendilerinden sonra gelen düğümü işaret etmekteydi. Bu yapısından ötürü Singly Linked List yapılarında geriye doğru hareket etmek imkansızdı, her seferinde baştan başlamak zorundaydık.

Çift yönlü bağlı listelerde ise fazladan bulunan işaretçi kendinden önce gelen düğümü işaret etmektedir. Bu sayede geriye doğru hareket edebilmemiz mümkün olmaktadır. Elbette fazladan bir işaretçi demek, fazladan bir değişken demektir. Bu da ramde ek alan işgal edeceği anlamına gelir.

Yine hatırlarsanız Tek yönlü bağlı listede en sondaki düğüm NULL değerini işaret ederdi. Çift yönlü bağlı listede yine aynı durum sözkonusu, ancak ek olarak, ilk düğümün önceki düğüm işaretçisi de NULL’u işaret eder.

Çift Yönlü Bağlı Liste Örnek Yapısı

Gördüğünüz üzere 4 tane düğümün herbirinden iki tane ok çıkmıştır.  Üzerinde *sonraki yazan işaretler kendisinden sonra gelen düğümü işaret eder, bu durum tek yönlü bağlı listeler ile aynıdır. En sondaki düğümden sonra düğüm gelmediği için NULL’u işaret eder.

Önceki yazan işaretler ise düğümlerin kendilerinden önce gelen düğümleri işaret etmektedir. İlk düğümden önce bir düğüm olmadığı için de önceki düğüm işaretçisine NULL atanır.

 

Çift Yönlü Bağlı Liste Oluşturma – C Kodu

Direkt kod vermektense adım adım anlatalım. Bizim esas amacımız düğüm yapımızı tutmak. Düğüm yapımızda sayı tutacağımızı varsayalım. Bunun dışında bir tane sonraki düğümü işaret eden next pointerı, bir tane de önceki düğümü işaret eden *prev pointerı kullanalım. Ve struct yapımızı inşa edelim.


struct node
{
	int data;
	struct node* prev;
	struct node* next;
};


 

Yukarıda yazdığımız struct, node ismine sahip bir yapıdır. Yalnızca verileri tutmak amaçlı oluşturulmuştur. Hiçbir çıktı vermez. Bunu nesne yönelimli programlamadaki class gibi düşünebilirsiniz. C’deki struct yapısı da buna benzer.

Yukarıdaki yapıyı kullanarak düğüm oluşturmak için de bir tane fonksiyon tanımlayalım.

 


struct node* createNode(int data)
{
	struct node* yeniDugum = (struct node*)malloc(sizeof(struct node));
	yeniDugum->data = data;
	yeniDugum->next = NULL;

	return yeniDugum;
}

Yukarıdaki fonksiyona dikkat ederseniz struct node* türünden bir fonksiyon olduğunu görürsünüz. Fonksiyonu bu tipte oluşturmuş olmamın nedeni yine geriye node türünden bir değişken döndürmesini istememdir. Parametre olarak ise integer yani sayı almaktadır. Yani ben bu fonksiyona bir sayı gönderdiğimde bana direkt düğümümü oluşturup geri döndürecektir. Her şey hazır olacak. Peki ne yapıyor bu fonksiyon?

struct node* yeniDugum isminde bir değişken oluşturuyorum. C ile programlama yapmanın cilvelerinden birisi de biliyorsunuz dinamik olarak alan ayırmaktır. Biz yeniDugum ismindeki node’umuza alan ayırmamız gerekiyor. İlk olarak değişkenin türünü (struct node*) yazıyoruz, daha sonra yazdığımız malloc bizim esas alan ayırma fonksiyonumuz, bu fonksiyon parantez içerisinde yazan boyut kadar alan ayırır. sizeof bir fonksiyondur. parantez içerisinde yazan verinin boyutu kadar boyutun çıktısını integer olarak döndürür. İşte biz de bir node değişkeni kadar alan oluştur diyoruz aslında.

Düğümümüz oluştuktan sonra içine gireceğimiz değeri yeniDugum->data = data satırı ile dolduruyoruz. biz geri döndüreceğimiz düğümüm next ve prev değerlerine NULL atıyoruz ki biz bunları daha sonra düzenleyebilelim. Yani eleman ekleme ya da çıkarma yaparken bu değerleri biz düzenleyeceğiz, şimdilik elimizdeki düğümün öncesi ve sonrası NULL olsun diyoruz.

Bu yazı serimizin ilkiydi. Daha eleman ekleme ve eleman silme konuları gelecek. Şimdilik hoşçakalım.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir