Şimdi Ara

C Bağlantılı Liste Konusu (Yardım)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
666
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • #include <stdio.h> 
    #include <stdlib.h>


    typedef struct personel {
    int numara;
    char ad[25];
    int yas;
    struct personel *sonraki;
    }dugum;



    dugum *listeOlustur()
    {
    int k,n;
    dugum *p, *head;
    printf("kac eleman girieceksiniz:");
    scanf("%d",&n);
    for(k=0;k<n;k++)
    {
    if(k==0)
    {
    head=(dugum *) malloc (sizeof(dugum));
    p=head;

    }
    else
    {
    p->sonraki=(dugum *)malloc(sizeof(dugum));
    p=p->sonraki;
    }
    scanf("%d %s %d",&p->numara,p->ad,&p->yas);


    }
    p->sonraki=NULL;
    return head;

    }





    Bağlantılı Liste konusunu çalışıyorum ve internette bu konuyu güzelce açıklayarak anlatan bir yer bulamadım.Hocanın verdiği kodlarda aklıma taklan bir kaç yer var onları sormak istiyorum.

    1.Neden her seferinde ,&p->numara,p->ad,&p->yas gibi adreselere atama yapıyoruz.Tamam bir sefer atama yaptık.Diğer atamaları başka adreslere yapmamız gerekmiyor mu.Şu p->sonraki olayını pek kavrayamadım.

    2.Neden sonda return head; demiş.

    Birde bu konuyu güzelce anlatan bir link atabilirmisiniz.

    ya da direk şöyle soruyim daha açıklayıcı olması için.
    void listeDolas(dugum *head) 
    {
    int sayac=1;
    dugum *p;
    p=head;
    while (p!=NULL)
    {
    printf("Dugum %d:%d %s %d",sayac,p->numara,p->ad,p->yas);
    sayac++;
    p=p->sonraki;
    printf("\n");

    }


    Burdaki kodda p sürekli p->sonraki ye eşitleniyor.Ama örneğin dizilerde olsa (*ptr+sayac) yazılırdı.
    Yani anlamadığım kısım her döngüde p=p->sonraki yazarak nasıl bir sonraki adrese geçiliyor.
    İnşallah demek istediğimi anlatabilmişimdir :)



    < Bu mesaj bu kişi tarafından değiştirildi Kahlamir -- 28 Mart 2016; 1:43:53 >







  • p = p->sonraki

    Dediğinizde p değeri o struct'ın instance'ına bir pointerdır, yani p->degerler şeklinde içindeki değerlere erişilebilir. Ve her struct kendi türünden bir pointer daha taşır, bu da bir sonraki struct instance'ına işaret eder. Yani p->sonraki bir sonraki struct'a bir pointerdır.
    Siz p'yi buna eşitlerseniz, p pointer'ı bir sonraki struct instance'ını göstermeye başlar. Böylelikle liste üzerinde gezebilirsiniz.
    Ve de şöyle birşey yapabilirsiniz mesela içinde bir sayı tutsun.
    p->sayi = 5;
    p = p->sonraki;
    p->sayi = 10;
    p = p->sonraki;
    p->sayi = 15;

    Öncelikle ilk gösterdiğimiz yerdekine 5 yazar, sonra gösterge bir sonrakini göstermeye başlar, oraya 10 yazarız, bir sonrakine 15 yazarız. İfade aynı olduğu için karıştırmışsınız anladığım kadarıyla ama pointer mantığı olduğu için ve p'nin değeri değiştiği için başka değerlere erişiyoruz aslında.

    (ingilizce tanımlarda hata yaptıysam affola, epeydir uğraşmadım C/C++'da bu konularla :D)




  • quote:

    Orijinalden alıntı: darcula

    p = p->sonraki

    Dediğinizde p değeri o struct'ın instance'ına bir pointerdır, yani p->degerler şeklinde içindeki değerlere erişilebilir. Ve her struct kendi türünden bir pointer daha taşır, bu da bir sonraki struct instance'ına işaret eder. Yani p->sonraki bir sonraki struct'a bir pointerdır.
    Siz p'yi buna eşitlerseniz, p pointer'ı bir sonraki struct instance'ını göstermeye başlar. Böylelikle liste üzerinde gezebilirsiniz.
    Ve de şöyle birşey yapabilirsiniz mesela içinde bir sayı tutsun.
    p->sayi = 5;
    p = p->sonraki;
    p->sayi = 10;
    p = p->sonraki;
    p->sayi = 15;

    Öncelikle ilk gösterdiğimiz yerdekine 5 yazar, sonra gösterge bir sonrakini göstermeye başlar, oraya 10 yazarız, bir sonrakine 15 yazarız. İfade aynı olduğu için karıştırmışsınız anladığım kadarıyla ama pointer mantığı olduğu için ve p'nin değeri değiştiği için başka değerlere erişiyoruz aslında.

    (ingilizce tanımlarda hata yaptıysam affola, epeydir uğraşmadım C/C++'da bu konularla :D)

    allah senden razı olsun hocam anladım çok şükür.

    Bir sorum daha olucak sonda neden return head; demiş.




  • quote:

    Orijinalden alıntı: Kahlamir

    quote:

    Orijinalden alıntı: darcula

    p = p->sonraki

    Dediğinizde p değeri o struct'ın instance'ına bir pointerdır, yani p->degerler şeklinde içindeki değerlere erişilebilir. Ve her struct kendi türünden bir pointer daha taşır, bu da bir sonraki struct instance'ına işaret eder. Yani p->sonraki bir sonraki struct'a bir pointerdır.
    Siz p'yi buna eşitlerseniz, p pointer'ı bir sonraki struct instance'ını göstermeye başlar. Böylelikle liste üzerinde gezebilirsiniz.
    Ve de şöyle birşey yapabilirsiniz mesela içinde bir sayı tutsun.
    p->sayi = 5;
    p = p->sonraki;
    p->sayi = 10;
    p = p->sonraki;
    p->sayi = 15;

    Öncelikle ilk gösterdiğimiz yerdekine 5 yazar, sonra gösterge bir sonrakini göstermeye başlar, oraya 10 yazarız, bir sonrakine 15 yazarız. İfade aynı olduğu için karıştırmışsınız anladığım kadarıyla ama pointer mantığı olduğu için ve p'nin değeri değiştiği için başka değerlere erişiyoruz aslında.

    (ingilizce tanımlarda hata yaptıysam affola, epeydir uğraşmadım C/C++'da bu konularla :D)

    allah senden razı olsun hocam anladım çok şükür.

    Bir sorum daha olucak sonda neden return head; demiş.

    Rica ederim.

    head dediği ilk başta yarattığınız node, yani sizin başlangıç noktanız. k==0 ise bu node'u head'e atıyor, yani ilk eleman için, gerisinde ise bunun üzerinde ekleme yapıyor.
    head her zaman ilk elemanı gösterirken, p ile eklemeye devam ettikçe p pointerı önce 2 sonra 3 sonra 4. elemanı gösterir şekilde devam ediyor.

    Ve böylelikle listenizi oluşturuyorsunuz, head'i return etmesinin sebebi ise size listeye bağlanmak için bir pointer sağlamak içindir.
    Eğer head pointerı main'in dışında mesela tanımlanmış olsaydı bir return değeri vermenize gerek yoktu, oradan erişirdiniz, ama burada fonksiyonun içinde tanımlanmış bir değer, o yüzden dışarıdan erişemez ve listeye bağlantınızı kaybedersiniz eğer vermeseydi. Bence dışarıda tanımlamak daha doğru tabi, çünkü üzerinde başka fonksiyonlar çalıştıracaksanız, sürekli oradan oraya return etmek yerine pointer tutmak daha karlı, ki zaten pointer ne kadar yer tutuyor ki, objenin kendisini tutmuyoruz sonuçta :)




  • quote:

    Orijinalden alıntı: darcula

    quote:

    Orijinalden alıntı: Kahlamir

    quote:

    Orijinalden alıntı: darcula

    p = p->sonraki

    Dediğinizde p değeri o struct'ın instance'ına bir pointerdır, yani p->degerler şeklinde içindeki değerlere erişilebilir. Ve her struct kendi türünden bir pointer daha taşır, bu da bir sonraki struct instance'ına işaret eder. Yani p->sonraki bir sonraki struct'a bir pointerdır.
    Siz p'yi buna eşitlerseniz, p pointer'ı bir sonraki struct instance'ını göstermeye başlar. Böylelikle liste üzerinde gezebilirsiniz.
    Ve de şöyle birşey yapabilirsiniz mesela içinde bir sayı tutsun.
    p->sayi = 5;
    p = p->sonraki;
    p->sayi = 10;
    p = p->sonraki;
    p->sayi = 15;

    Öncelikle ilk gösterdiğimiz yerdekine 5 yazar, sonra gösterge bir sonrakini göstermeye başlar, oraya 10 yazarız, bir sonrakine 15 yazarız. İfade aynı olduğu için karıştırmışsınız anladığım kadarıyla ama pointer mantığı olduğu için ve p'nin değeri değiştiği için başka değerlere erişiyoruz aslında.

    (ingilizce tanımlarda hata yaptıysam affola, epeydir uğraşmadım C/C++'da bu konularla :D)

    allah senden razı olsun hocam anladım çok şükür.

    Bir sorum daha olucak sonda neden return head; demiş.

    Rica ederim.

    head dediği ilk başta yarattığınız node, yani sizin başlangıç noktanız. k==0 ise bu node'u head'e atıyor, yani ilk eleman için, gerisinde ise bunun üzerinde ekleme yapıyor.
    head her zaman ilk elemanı gösterirken, p ile eklemeye devam ettikçe p pointerı önce 2 sonra 3 sonra 4. elemanı gösterir şekilde devam ediyor.

    Ve böylelikle listenizi oluşturuyorsunuz, head'i return etmesinin sebebi ise size listeye bağlanmak için bir pointer sağlamak içindir.
    Eğer head pointerı main'in dışında mesela tanımlanmış olsaydı bir return değeri vermenize gerek yoktu, oradan erişirdiniz, ama burada fonksiyonun içinde tanımlanmış bir değer, o yüzden dışarıdan erişemez ve listeye bağlantınızı kaybedersiniz eğer vermeseydi. Bence dışarıda tanımlamak daha doğru tabi, çünkü üzerinde başka fonksiyonlar çalıştıracaksanız, sürekli oradan oraya return etmek yerine pointer tutmak daha karlı, ki zaten pointer ne kadar yer tutuyor ki, objenin kendisini tutmuyoruz sonuçta :)

    cevabın için tekrardan teşekkürler.
    Bir sorum daha olucak:)

    void listeDolas(dugum *head) 
    {
    int sayac=1;
    dugum *p;
    p=head;
    while (p!=NULL)
    {
    printf("Dugum %d:%d %s %d",sayac,p->numara,p->ad,p->yas);
    sayac++;
    p=p->sonraki;
    printf("\n");

    }
    }

    void dugumEkle(dugum **head)
    {
    int kayitNo;
    dugum *p,*q,*yeni;
    yeni=(dugum *) malloc(sizeof(dugum));
    printf("\nEklenecek veriyi gir.Numara?Ad?Yas?\n");
    scanf("%d %s %d",&yeni->numara,yeni->ad,&yeni->yas);

    printf("Hangi kayit no dan once eklenecek");
    scanf("%d",&kayitNo);

    p=*head;
    if(p->numara==kayitNo)//başa eklenecekse
    {
    yeni->sonraki=p;
    *head=yeni;
    }
    else
    {
    while(p->sonraki!=NULL && p->numara!=kayitNo)
    {
    q=p;
    p=p->sonraki;

    }
    if(p==NULL)//Sona eklenecekse
    {
    q->sonraki=yeni;
    yeni->sonraki=NULL;


    }
    else if(p->numara==kayitNo)//Araya eklenecekse
    {
    yeni->sonraki=p;
    q->sonraki=yeni;


    }
    }
    }


    Burda ilk fonkisiyonda dugum *head yazılımış ama ikincisinde dugum **head yazılmış.Neden ikincisinde çift pointer var?




  • quote:

    Orijinalden alıntı: Kahlamir

    quote:

    Orijinalden alıntı: darcula

    quote:

    Orijinalden alıntı: Kahlamir

    quote:

    Orijinalden alıntı: darcula

    p = p->sonraki

    Dediğinizde p değeri o struct'ın instance'ına bir pointerdır, yani p->degerler şeklinde içindeki değerlere erişilebilir. Ve her struct kendi türünden bir pointer daha taşır, bu da bir sonraki struct instance'ına işaret eder. Yani p->sonraki bir sonraki struct'a bir pointerdır.
    Siz p'yi buna eşitlerseniz, p pointer'ı bir sonraki struct instance'ını göstermeye başlar. Böylelikle liste üzerinde gezebilirsiniz.
    Ve de şöyle birşey yapabilirsiniz mesela içinde bir sayı tutsun.
    p->sayi = 5;
    p = p->sonraki;
    p->sayi = 10;
    p = p->sonraki;
    p->sayi = 15;

    Öncelikle ilk gösterdiğimiz yerdekine 5 yazar, sonra gösterge bir sonrakini göstermeye başlar, oraya 10 yazarız, bir sonrakine 15 yazarız. İfade aynı olduğu için karıştırmışsınız anladığım kadarıyla ama pointer mantığı olduğu için ve p'nin değeri değiştiği için başka değerlere erişiyoruz aslında.

    (ingilizce tanımlarda hata yaptıysam affola, epeydir uğraşmadım C/C++'da bu konularla :D)

    allah senden razı olsun hocam anladım çok şükür.

    Bir sorum daha olucak sonda neden return head; demiş.

    Rica ederim.

    head dediği ilk başta yarattığınız node, yani sizin başlangıç noktanız. k==0 ise bu node'u head'e atıyor, yani ilk eleman için, gerisinde ise bunun üzerinde ekleme yapıyor.
    head her zaman ilk elemanı gösterirken, p ile eklemeye devam ettikçe p pointerı önce 2 sonra 3 sonra 4. elemanı gösterir şekilde devam ediyor.

    Ve böylelikle listenizi oluşturuyorsunuz, head'i return etmesinin sebebi ise size listeye bağlanmak için bir pointer sağlamak içindir.
    Eğer head pointerı main'in dışında mesela tanımlanmış olsaydı bir return değeri vermenize gerek yoktu, oradan erişirdiniz, ama burada fonksiyonun içinde tanımlanmış bir değer, o yüzden dışarıdan erişemez ve listeye bağlantınızı kaybedersiniz eğer vermeseydi. Bence dışarıda tanımlamak daha doğru tabi, çünkü üzerinde başka fonksiyonlar çalıştıracaksanız, sürekli oradan oraya return etmek yerine pointer tutmak daha karlı, ki zaten pointer ne kadar yer tutuyor ki, objenin kendisini tutmuyoruz sonuçta :)

    cevabın için tekrardan teşekkürler.
    Bir sorum daha olucak:)

    void listeDolas(dugum *head) 
    {
    int sayac=1;
    dugum *p;
    p=head;
    while (p!=NULL)
    {
    printf("Dugum %d:%d %s %d",sayac,p->numara,p->ad,p->yas);
    sayac++;
    p=p->sonraki;
    printf("\n");

    }
    }

    void dugumEkle(dugum **head)
    {
    int kayitNo;
    dugum *p,*q,*yeni;
    yeni=(dugum *) malloc(sizeof(dugum));
    printf("\nEklenecek veriyi gir.Numara?Ad?Yas?\n");
    scanf("%d %s %d",¥i->numara,yeni->ad,¥i->yas);

    printf("Hangi kayit no dan once eklenecek");
    scanf("%d",&kayitNo);

    p=*head;
    if(p->numara==kayitNo)//başa eklenecekse
    {
    yeni->sonraki=p;
    *head=yeni;
    }
    else
    {
    while(p->sonraki!=NULL && p->numara!=kayitNo)
    {
    q=p;
    p=p->sonraki;

    }
    if(p==NULL)//Sona eklenecekse
    {
    q->sonraki=yeni;
    yeni->sonraki=NULL;


    }
    else if(p->numara==kayitNo)//Araya eklenecekse
    {
    yeni->sonraki=p;
    q->sonraki=yeni;


    }
    }
    }


    Burda ilk fonkisiyonda dugum *head yazılımış ama ikincisinde dugum **head yazılmış.Neden ikincisinde çift pointer var?



    Head'i gösteren pointerın olduğu adresi point ediyor **head diyince, ama neden yaptığını anlamadım şuan. Epeydir uğraşmadım pointerlarla bide yoğun bir gündü.




  • Yapay Zeka’dan İlgili Konular
    c'de yardım
    14 yıl önce açıldı
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.