Veri yapılarına giriş – Bağlı Liste

Bağlı liste ( Linked list ) : veri öbekleri arasında oluşturulan bağlantılı liste. Her düğümün kendinden sonraki – duruma göre aynı zamanda önceki – düğümü işaret etmesiyle oluşturulur. Bu yüzden veri yapıları konusu işaretçiler ( pointer ) konusuyla bağlantılıdır.

Bağlı liste, belleği dinamik olarak kullanır. Bunun anlamı, veriyi nereye yazdığınızı bilirsiniz. Ayrıca liste yapısı işaretçileri de kullandığı için liste içerisinden bir veri sildiğinizde bellekten de silinir, gereksiz yer kaplamaz.

Bağlı liste hangi durumlarda kullanılır?

Bir önceki durumun verisini tutmak istediğiniz zaman kullanabilirsiniz. Örnek olarak tarayıcılarda kullandığımız sekmeler. Bir önceki sayfaya gitmek istediğiniz zaman geri tuşuna basarsınız. Önceki sayfaların verisi bağlı listelerde tutulur.

İki farklı bağlı liste türü vardır: tek yönlü bağlı liste ve çift yönlü bağlı liste.

Single linked list -> Tek yönlü bağlı liste
Double linked list -> Çift yönlü bağlı liste

Tek yönlü bağlı listede düğümler tek taraflı bağlıyken yani bir adresten başka bir adrese geçerken geride bıraktığınız adrese tekrar geçebilmek için en başa ( head ) kısmına geri dönmeniz gerekirken çift yönlü bağlı listede düğümler kendi aralarında bağlıdır. Yani “3” verisinden “7”ye geçebilmek için tek yönlü bağlı listede köke, başa ( root ya da head olarak da adlandırılır ) dönmeniz gerekirken çift yönlü bağlı listede direkt olarak tek adımda “7”ye ulaşabilirsiniz.

Çift yönlü bağlı listede veri eklemenin örnek bir C kodu:

typedef struct kisi
 {
 char isim[50];
 struct kisi *sonra; /*Bir sonraki yapıyı gösterecek olan adres atanacak*/
 struct kisi *once; /*Bir onceki yapıyı gösterecek olan adres atanacak*/
 };
 kisi *yeni , *ilk , *son; /* kisi tipinde pointerlar */

if(ilk==NULL) /*Dugumde eleman var mı?*/
 {
 /*Dugumde eleman yoksa ilk=NULL olacaktır.*/
 struct kisi *yeni = ((kisi *) malloc(sizeof(kisi)));
 printf("\n\tLutfen kisinin adini giriniz : ");
 scanf("%s",&yeni->isim);
 yeni->sonra=NULL;
 ilk=yeni;
 son=yeni;
 }
 else
 {
 struct kisi *yeni = ((kisi *) malloc(sizeof(kisi)));
 printf("\n\tLutfen kisinin adini giriniz : ");
 scanf("%s",yeni->isim);
 yeni->sonra=NULL;
 son->sonra=yeni; /* Bi önceki structun sonra adindaki göstericisi yeniye eşitlendi*/
 yeni->once=son; /* Oluşturulmuş olan structun once adindaki gostericisi bir onceki structa eşitlendi*/
 son=yeni;
 }