08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

Bir göstericinin tür uzunluğu neyi gösterdiğinden bağımsız olarak, belirli olduğundan<br />

yukarıdaki bildirimde derleyicinin struct Node türünün sizeof değerini saptamasına engel<br />

bir durum yoktur.<br />

Bu tür yapılar özellikle bağlı liste ve ağaç yapılarını (algoritmalarını) gerçekleştirmek<br />

amacıyla kullanılabilir.<br />

Bağlı Liste Nedir<br />

Bağlı listenin ne olduğunu anlayabilmek için önce "dizi" veri yapısını hatırlayın.<br />

Aynı türden nesnelerin bellekte tutulmak istendiğini düşünün. Bu nesneler bellekte<br />

birbirini izleyecek biçimde yani aralarında hiçbir boşluk olmayacak biçimde tutulabilir. C<br />

dilinin dizi aracında da dizinin elemanlarının bellekte bu şekilde tutulduğunu biliyorsunuz.<br />

Ancak nesneleri bellekte bitişik olarak yerleştirmek her zaman istene bir durum değildir.<br />

Bellekte nesnelerin bitişik yerleştirilmesi drumunda, nesnelerden herhangi birine ulaşım<br />

değişmez zamanda yapılabilir. Yani dizinin ya da dinamik dizinin herhangi bir elemanına<br />

ulaşma maliyeti, dizide tutuklan eleman sıyısı ile doğru orantılı değildir. Dizide 100<br />

eleman da olsa dizide 1000 eleman da olsa herhangi bir elemana ulaşım maliyeti<br />

değişmez bir zaman olur. Neden? Zira dizinin elemanına aslında bir adres işlemiyle ulaşılır<br />

değil mi? Örneğin pd bir dizinin başlangıç adresini tutan bir gösterici ise<br />

pd[n] gibi bir işlem<br />

*(pd + n)<br />

işlemine karşılık gelir. Bu işlemin de maliyetinin değişmez olduğu açıktır.<br />

Bellekte elemanları ardışıl olarak bulunmayan listelere bağlı liste denir. Bağlı listelerde<br />

her eleman kendinden sonraki elemanın nerede olduğu bilgisini de tutar. İlk elemanın<br />

yeri ise ayrı bir göstericide tutulur. Böylece, bağlı listenin ilk elemanının adresi ile, bağlı<br />

listenin tüm elemanlarına ulaşılabilir. Bağlı liste dizisinin her elemanı bir yapı nesnesidir.<br />

Bu yapı nesnesinin bazı üyeleri bağlı liste elemanlarının değerlerini veya taşıyacakları<br />

diğer bilgileri tutarken, bir üyesi ise kendinden sonraki bağlı liste elemanı olan yapı<br />

nesnesinin adres bilgisini tutar. Bu şekilde elde edilen bir elemana "düğüm" ("node")<br />

denir. Örnek:<br />

struct Node {<br />

int val;<br />

struct Node *next;<br />

};<br />

Amacımız int türden değerleri bellekte bir liste şeklinde tutmak olsun. Yukarıda struct<br />

Node isimli bir yapının bildirimini görüyorsunuz. Tutulacak int türden değerler yapımızın<br />

val isimli elemanının değeri olarak bellekte yer alacak. Yapının yine struct Node türünden<br />

olan gösterici elemanı ise kendisinden bir sonra gelen yapı nesnesinin adresini tutacak.<br />

Böylece bir struct Node nesnesinin adresi elimizdeyken, bu nesnenin içinde tutulan int<br />

türden veriye ulaşabileceğimiz gibi, nesnenin içinde yer alan next göstericisi yardımıyla<br />

da bir sonraki elemana ulaşabiliriz.<br />

Bağlı Listelerle Dizilerin Karşılaştırılması<br />

Bir dizinin herhangi bir elemanına değişmez bir zamanda erişilebilir. Zira bir elemana<br />

ulaşma bir adres bilgisine bir tamsayının toplanmasıyla olur. Oysa bağlı listelerde bir<br />

elemana erişebilmek için, bağlı listede ondan önce yer alan bütün elemanları dolaşmak<br />

gerekir. Bu durumda bir elemana ulaşmanın ortalama maliyeti ortadaki elemana<br />

ulaşmanın maliyetidir. Bu da bağlı listedeki eleman sayısının artmasıyla bir elemana<br />

ulaşma maliyetinin doğrusal biçimde artacağı anlamına gelir.<br />

Dizilerde araya eleman ekleme ya da eleman silme işlemleri için blok kaydırması yapmak<br />

gerekir. Oysa bağlı listelerde bu işlemler çok kolay yapılabilir.<br />

385

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!