C Programlamada Bağlı Listeler

Bu yazı faydalı oldu mıı?

  • Evet

    Kullanılan: 1 100.0%
  • Hayır

    Kullanılan: 0 0.0%

  • Kullanılan toplam oy
    1

Bu konuyu okuyanlar

erkankarabulut

Öğrenci
Katılım
18 Mart 2016
Mesajlar
30
Reaksiyon puanı
6
Puanları
8
Yaş
26
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.

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:

Kod:
#include <stdio.h>

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


Ekran%2BG%25C3%25B6r%25C3%25BCnt%25C3%25BCs%25C3%25BC%2B%2528250%2529.png


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:

Kod:
#include <stdio.h>

int main()
{
       static int j,i,boyut,dizi[100],adres[100],x,a;
       printf("Dizinin boyutunu giriniz :"); scanf("%d",&boyut);
       for(i=0;i<boyut;i++)
       {
             printf("Dizinin %d. elemanini giriniz :",i+1); scanf("%d",&dizi[i]);
       }
       for(i=0;i<boyut;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ü:


Ekran%2BG%25C3%25B6r%25C3%25BCnt%25C3%25BCs%25C3%25BC%2B%2528253%2529.png


Ekran%2BG%25C3%25B6r%25C3%25BCnt%25C3%25BCs%25C3%25BC%2B%2528251%2529.png


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
 

erkankarabulut

Öğrenci
Katılım
18 Mart 2016
Mesajlar
30
Reaksiyon puanı
6
Puanları
8
Yaş
26
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.
 

Son mesajlar

Üst