lostyazilim
tr.link

C Programlamada Bağlı Listeler

6 Mesajlar 2.082 Okunma
lstbozum
tr.link

    ennrh ennrh WM Aracı Kullanıcı
    • Üyelik 16.03.2016
    • Yaş/Cinsiyet 28 / E
    • Meslek öğrenci
    • Konum İstanbul Avrupa
    • Ad Soyad E** K**
    • Mesajlar 451
    • Beğeniler 38 / 78
    • Ticaret 7, (%100)
    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
     

     

    http://www.pubtekno.com
    wmaraci
    reklam

    ozgurgezen ozgurgezen WM Aracı Kullanıcı
    • Üyelik 17.03.2016
    • Yaş/Cinsiyet 43 / E
    • Meslek Bilgisayar Muhendisi
    • Konum İstanbul Anadolu
    • Ad Soyad Ö** H**
    • Mesajlar 702
    • Beğeniler 224 / 225
    • Ticaret 16, (%100)
    Merhaba,
    elınıze saglık yazmıssınız ama...
    Yapalim yorum.

    Bu anlattiginizin neresi bagli liste anlamadim.
    Asagidaki resim bagli listeyi gosteriyor, yukardaki kodda siradan array tanimi yapilmis. Liste dediginiz sey hic yok, olmasi gereken listeler birbirine pointer ile baglanmamis, dinamik nesne yaratilmamis.


    https://3.bp.blogspot.com/-LvdpDYPyOQI/V0204Fy7IDI/AAAAAAAAA5I/xOAg-mTanQUAevbFhNLyljou3ziMjac-ACK4B/s640/Ads%25C4%25B1z.png
    ennrh

    kişi bu mesajı beğendi.

    ennrh ennrh WM Aracı Kullanıcı
    • Üyelik 16.03.2016
    • Yaş/Cinsiyet 28 / E
    • Meslek öğrenci
    • Konum İstanbul Avrupa
    • Ad Soyad E** K**
    • Mesajlar 451
    • Beğeniler 38 / 78
    • Ticaret 7, (%100)
    Hocam bağlı listede elemanları pointerla bağlamazsak zaten bağlı listenin bellekte kazandırdığı avantajları yok etmiş olduğumuzu biliyorum. Bir önceki yazımda aslen pointerlarla yapıldığını fakat henüz onu anlatmadığımız için diziler üzerinden örnek vererek temel mantığını anlatmaya çalışacağımı söylemiştim. Ben kendi sitemde pointerları anlatmadım henüz. Bu yüzden okulda gördüğüm gibi sadece normal diziler üzerinden bağlı listeye giriş tarzında bir yazı hazırladım.
    burakisci ozgurgezen

    kişi bu mesajı beğendi.

    http://www.pubtekno.com

    Yavuzs Yavuzs WM Aracı Kullanıcı
    • Üyelik 30.10.2015
    • Yaş/Cinsiyet 30 / E
    • Meslek Üniversite Öğrencisi
    • Konum Trabzon
    • Ad Soyad Y** S**
    • Mesajlar 33
    • Beğeniler 12 / 0
    • Ticaret 0, (%0)
    Programlama sınavında geçmiş yıllarda çıkan bir soru var , size zahmet gerekli fonksiyonu yazabilir misiniz? Soruyu olduğu gibi paylaşıyorum :

    /*
    \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
    myCircularLinkedList() fonksiyonuna ait prototip aşağıdaki gibidir:
    void myCircularLinkedList(struct listEntry *param1, struct listEntry *param2, struct listEntry *param3);
    myLinkedList() fonksiyonu, "param1" 'in işaret ettiği m1 üyesinde 1 değerini, "param2" 'in işaret ettiği m1 üyesinde 2 değerini
    ve "param3" 'ün işaret ettiği m1 üyesinde 3 değerini sakladıktan sonra bu yapılar arasında bir dairesel bağlı liste (circular
    linked list) oluşturur ("param1" 'in işaret ettiği yapı, "param2" 'nin işaret ettiği yapıyı; "param2" 'in işaret ettiği yapı, "param3" 'ün
    işaret ettiği yapıyı; "param3" 'ün işaret ettiği yapı ise "param1" 'in işaret ettiği yapıyı işaret eder).
    \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
    :::::::::::::: ÖRNEK :::::::::::::::::::::
    ---------main4.c DOSYASININ İÇERİĞİ:-----------

    */


    #include
    struct listEntry {
    int m1;
    struct listEntry *m2;
    };
    void myCircularLinkedList(struct listEntry *param1, struct listEntry *param2, struct listEntry *param3);

    void myCircularLinkedList(struct listEntry *param1, struct listEntry *param2, struct listEntry *param3){

    KOD BURAYA YAZILACAK

    }

    int main ()
    {
    struct listEntry var1, var2, var3;
    myCircularLinkedList(&var1, &var2, &var3);
    printf("%d\t%d\t%d\t%d", var1.m1, (var1.m2)->m1, ((var1.m2)->m2)->m1, (((var1.m2)->m2)->m2)->m1);
    return 0;
    }

    /*
    --------DOĞRU ÇIKTI:

    1 2 3 1

    */
     

     

    wmaraci
    wmaraci

    ennrh ennrh WM Aracı Kullanıcı
    • Üyelik 16.03.2016
    • Yaş/Cinsiyet 28 / E
    • Meslek öğrenci
    • Konum İstanbul Avrupa
    • Ad Soyad E** K**
    • Mesajlar 451
    • Beğeniler 38 / 78
    • Ticaret 7, (%100)
    struct bilmiyorum hocam malesef. :(
     

     

    http://www.pubtekno.com

    YazilimMimari YazilimMimari Eski adi: Turgay Can Kullanıcı
    • Üyelik 25.06.2012
    • Yaş/Cinsiyet 38 / E
    • Meslek Engineering Director
    • Konum İstanbul Avrupa
    • Ad Soyad T** C**
    • Mesajlar 771
    • Beğeniler 2 / 260
    • Ticaret 0, (%0)
    Kod kalitesi daha iyi olabilir.

    Kullanılan değişken isimleri oldukça afaki ve bir anlam bütünlüğü yok. Anlamlı metodlara bölünmeli.

    Makinenin değilde, insanında okuyacağı kod yazılmalı.

    Düşük seviye diller ile aşırı, haşır neşir olmasamda kod kalitesi ve kendini anlatabilen kod tarafından baktığımda analizim budur.

    İyi çalışmalar,

    Emeğinize sağlık, kod paylaşımı süperdir :)
     

     

    https://www.linkedin.com/in/turgaycan/
    Kaliteli kod yazılır.. (Günlük/Saatlik ücreti ile)
    Site Ayarları
    • Tema Seçeneği
    • Site Sesleri
    • Bildirimler
    • Özel Mesaj Al