C Programlamada Bağlı Listeler

C programlama dili dersleri serisinin bu dersinde c dilinde bağlı listelerin kullanımından bahsedip, birkaç bağlı liste örneğinin c kodunu sizlerle paylaşacağız.

Bağlı listeleri "Linked List (Bağlı Liste)" adlı algoritma dersimizde anlatmıştık. Kısaca tekrar açıklayalım. Bağlı liste nedir? Bağlı Liste C Kodu. Bağlı liste, bellekte istediğimiz gibi hareket etmemize olanak sağlayan bir tür veri saklama çeşididir. Verileri diziler veya matrisler gibi bellekte sıralı yer kaplamadan istediğimiz gibi dağıtıp belleği daha kullanışlı hale getirmemize yarar.

Not: Belleğe dinamiklik kazandıran asıl bağlı liste yapısı pointerlarla elemanların bellekteki yerlerini kullanarak ilişkilendirme yoluyla yapılır. Pointerları anlatmadığımız için şu anda bağlı listenin temel mantığını diziler üzerinden anlatmaktayız.

Bu dersimizde c dilinde dizileri kullanarak bağlı liste oluşturacağız. Verileri ve adresleri farklı birer dizide saklayarak, bağlı liste algoritmasını anlattığımız dersteki gibi bağlı liste üzerinde işlemler yapmayı öğreneceğiz. Bir örnekle başlayalım.

Örnek: Bağlı listeyi ekrana yazdıran c programı.

Kaynak Kod:


#include

int main()
{
static int temp,j,i,boyut,dizi[100],adres[100];
printf("Dizinin boyutunu giriniz :"); scanf("%d",&boyut);
for(i=0;i {
printf("Dizinin %d. elemanini giriniz :",i+1); scanf("%d",&dizi[i]);
}
for(i=0;i {
printf("Adres dizisinin %d. elemanini giriniz :",i+1); scanf("%d",&adres[i]);
}
printf("\nGirdiginiz dizi : ");
for(i=0;i {
printf("%d\t",dizi[i]);
}
printf("\n\nGirdiginiz adres dizisi : ");
for(i=0;i {
printf("%d\t",adres[i]);
}
i=0;
printf("\n\n");
while(j>=0)
{
printf("%d\t",dizi[j]);
j=adres[j];
}
return 0;
}


Kod Analiz:

- İlk önce kullanıcıdan değer dizisini ve adres dizisini aldık. Adres dizisinin rastgele oluşturulmadığına dikkat ediniz!
- Değer dizisinin ilk elemanı bağlı listenin ilk elemanı olur. 1. elemandan sonra adres dizisinin 1. elemanının gösterdiği sayının değer dizisindeki karşılığı bağlı listenin ikinci elemanı olur.
- Oluşturduğumuz değer ve adres dizilerini ekrana yazdırdık.
- Daha sonra while döngüsü ile bağlı listemizi ekrana yazdırdık.
- Burada j ile değer dizisinin ve aynı zamanda bağlı listenin ilk elemanını ekrana yazdıktan sonra j değişkenini adres dizisinin ilk elemanına eşitledik.
- J nin 4 olduğunu varsayalım. Değer dizisinin 4. elemanını ekrana yazdırdıktan sonra bağlı listenin 3. elemanını ekrana yazdırmak için j yi adres dizisinin 4. elemanına eşitledik.
- Bu şekilde eksi değer görene kadar yani bağlı liste bitene kadar ekrana yazdırmış olacağız.

Ekran Görüntüsü:




Yukarıdaki ekran görüntüsünde de gördüğümüz gibi değer dizisinin ilk elemanından sonra adres dizisini takip ederek ekrana yazdırdığımızda bağlı listeyi elde ediyoruz.

Örnek 2:
C programlama dilinde bağlı listeden eleman silme

Kaynak Kod:



#include

int main()
{
static int j,i,boyut,dizi[100],adres[100],x,a;
printf("Dizinin boyutunu giriniz :"); scanf("%d",&boyut);
for(i=0;i {
printf("Dizinin %d. elemanini giriniz :",i+1); scanf("%d",&dizi[i]);
}
for(i=0;i {
printf("Adres dizisinin %d. elemanini giriniz :",i+1); scanf("%d",&adres[i]);
}
printf("Girdiginiz bagli liste : ");
printf("\n\n");
while(j>=0)
{
printf("%d\t",dizi[j]);
j=adres[j];
}
printf("\n\nSilmek istediğiniz elemani giriniz :"); scanf("%d",&x);
j=0;
while(x!=dizi[j] && j>=0)
{
a=j;
j=adres[j];
}
if(dizi[j]==x)
{
if(adres[j]>=0)
{
adres[a]=adres[j];
}
else
{
adres[a]=-1;
}
}
else
{
printf("Silmek istediginiz eleman bagli listede yok.\n");
}
printf("\nBagli listenin son hali : ");
j=0;
printf("\n\n");
while(j>=0)
{
printf("%d\t",dizi[j]);
j=adres[j];
}
return 0;
}


Kod Analiz:


- Bir önceki örnek gibi kullanıcıdan değer dizimizi ve adres dizimizi aldık.
- Bağlı listeyi ekrana yazdırdık ve kullanıcıdan silmek istediği elemanı aldık.
- While döngüsü içerisinde aranılan elemanı bağlı listede aradık. Bu işlemi yaparken baktığımız bölgeyi saklamak için bir a değerine kaydettik.
- Böylece elemanı bulduğumuzda bu elemandan bir önceki elemanın değerini ve kendisinden sonra hangi elemanın geldiğini biliyor olduk.
- While döngüsünden çıktıktan sonra if ile elemanın bulunup bulunmadığını kontrol ettik.
- Eğer bulunmuşsa son eleman olup olmadığının kontrolünü başka bir if ile yaptık. Son eleman ise bağlı listenin kendisinden önce gelen elemanının adres dizisindeki karşılığını -1 yaptık.
- Son eleman değilse de kendisinden önce gelen elemanın artık kendisini değil kendisinden sonra gelen elemanı göstermesini sağladık. (adres[a]=adres[j])
- Daha sonra yeni bağlı listeyi ekrana yazdırdık.

Ekran Görüntüsü:






Ayrıca "Linked List (Bağlı Liste)" adlı algoritma dersi için buraya tıklayın.

"C Programlamada Bağlı Listeler" adlı bu makaleyi beğendiyseniz lütfen yorum yapmayı ve paylaşmayı unutmayın.

Kaynak: Pubtekno