Linked List (Linkli Liste veya Bağlı Liste)

Yazan:Şadi Evren ŞEKER

Bağlı liste herhangi bir tipten node’ların (düğümlerin) yine kendi tiplerinden düğümlere işaret etmesi (point) ile oluşan zincire verilen isimdir. Buna göre her düğümde kendi tipinden bir pointer olacak ve bu pointerlar ile düğümler birbirine aşağıdaki şekilde bağlanacaktır.

bagli liste
Linked List’in avantajı, hafızayı dinamik olarak kullanmasıdır. Buna göre hafızadan silinen bir bilgi için hafıza alanı boşaltılacak veya yeni eklenen bir bilgi için sadece o bilgiyi tutmaya yetecek kadar hafıza alanı ayrılacaktır.

Yukarıdaki figürde görülen bağlı listeye çok benzeyen ve yine çok kullanılan bir bağlı liste uygulaması da çift bağlı liste (doubly linked list) uygulamasıdır.
Çift bağlı liste

Buna göre her düğüm, hem kendinden öncekine hem de kendinden sonrakine bağlanır, bu sayede liste üzerinde ileri ve geri ilerlemek mümkündür.

Yukarıdaki şekilde, sırasıyla, Tek bağlı liste (singular linked list), çift uçlu bağlı liste (double ended linked list), çift bağlı liste (doubly linked list) ve dairesel bağlı liste (circular linked list) görülmektedir.

Listelerin üzerinde işlem yapılırken, dolaşıcı (iterator) şeklinde bir gösterici tanımlanır. Bu dolaşıcı veri aranması, ekleme veya silme gibi işlemler sırasında listenin ilgili elemanına kadar gidilmesini sağlar. Listenin ilgili elemanına gidildikten sonra silme veya ekleme gibi işlemler yapılırken göstericilerde (pointers) yapılan değişikliklerin, listeyi etkilememesini sağlar.

Örneğin bir bağlı listeye yeni bir eleman eklenmesi sırasında aşağıdaki adımlar izlenir:

  1. Ekleme işlemini yapılacağı aralıktan önceki düğüme dolaşıcı tarafından gidilir.
  2. Yeni düğüm oluşturularak, sonrasına, dolaşıcının sonrası atanır.
  3. Dolaşıcının sonrasına ise yeni düğüm atanır.

Yukarıdaki şekilde bu ekleme işlemi sırasıyla gösterilmiştir. İlk şekilde dolaşıcı ilgili düğüme gelmiş, ikinci şekilde yeni bir düğüm eklenmiş ve sonrasına, dolaşıcının sonrası atanmış ve son şekilde ise dolaşıcı ile gösterilen düğümün sonrasına yeni düğüm eklenmiştir.

Aynı durumu çift bağlı listeler için ele alacak olursak:

Yukarıdaki şekilde öncelikle ekleme yapılacak aralığa dolaşıcı tarafından gidilir. İkinci adımda yeni düğüm eklenir. Arından göstericiler, yukarıdaki şekilde anlatıldığı gibi sırayla atanır.

Bağlı listeden bir düğümün silinmesi

Bağlı listeden eleman silinmesi sırasında, listede silinecek olan elemandan önceki düğüme kadar dolaşıcı ile gidilir. Dolaşıcının sonrasına, sonrasının sonrası atanır. Bu sayede ilk başta dolaşıcının sonrasında olan düğüm listeden kaldırılmış ve ulaşılamaz hale gelmiş olur. Ardından bu eleman istenirse hafızadan da kaldırılır.

Bağlı listelerin nesne yönelimli programlama dillerinde pointer tipi bulunmamasından dolayı kodlanması biraz farklıdır. Bilindiği gibi C++ gibi melez (hem C hem de nesne yönelimli programlamayı destekler) diller dışında JAVA, C# gibi dillerde gösterici (pointer) bulunmaz. Bunun yerine nesne göstericisi (object referrer) bulunur. Bu değişken tipleri esas olarak bir sınıf(Class)‘dan türetilmiş bir nesneyi(object) gösterebilen değişkenlerdir. Bu değişkenlerin aslında birer göstericiden farkı yoktur.

Bağlı listenin kullanıldığı yazılar


Örnek Bağlı liste kodları:

Yorumlar

  1. Fatih Kabakci

    hocam merhabalar,
    while(temp->next!=(node*)0),Arama kodunda bulunan kodun bu parcasinda,dongunun parametresi olarak bu sekil yazilmasinin,
    while(temp->next!=NULL) bu sekilde yazilmasindan islevsel olarak farki varmidir?

  2. Şadi Evren ŞEKER Article Author

    Null, NULL, nil veya null olarak yazılan sabit değer, her dilde tanımlı değildir. Bu yüzden kodda bulunan
    (node *) 0

    ifadesi, sayısal değer olarak 0 tam sayısını node * göstericisine tip inkılabı yapmakta (type casting) ve bu şekilde kullanmaktadır. Yukarıdaki bu tanım, her dilde (null değeri her nasıl tanımlıysa veya hiç tanımlı değilse bile) çalışması için yapılan ufak bir hiledir.

  3. kemal

    Çift Bağlı Dairesel listeyi visual studio 2008 de açtım ama nasıl çalıştıracam arkadaşlar bu konuda acil yardım

  4. Şadi Evren ŞEKER Article Author

    Ahmet beyin isteğine binaen yukarıya diaresel tek yönlü bağlı liste (circular singular linked list) kodu ekledim. Bu kodda insert fonksiyonu sıradan sayı eklerken, insert2 fonksiyonu sıralı bir şekilde listeye sayı ekler (büyükten küçüğe). Ayrıca del fonksiyonu da sizin istediğiniz silme işlemini yapıyor.

    umarım yardımcı olur

    başarılar

  5. gardiann

    merhaba; bu linked listin oncesinde bağlantılı olarak
    files of records
    fixed lenght records
    variavle lenght records file organization başlıklarıda var aslında onlarla ilgili bildiğiniz bir site turkçe olucak ama var mı lütfen!!! ??

  6. Fatih Kabakcı

    node *DoublyListDel(node *kutu,int data) {
    node *iter=kutu;
    while(iter->next!=NULL) {
    if(iter->next->data==data) {
    node *temp=iter->next;
    iter->next=iter->next->next;
    temp->next->prev=iter;
    free(temp);
    }
    iter=iter->next;
    }
    if(kutu->data==data) {
    node *root=kutu->next;
    root->prev=NULL;
    free(kutu);
    return root;
    }
    }
    return kutu;
    }
    Hocam Doubly listte eleman silerken yazmis oldugum bu kodda,son elemani silmek isterken sorun ile karsilasiyorum.yukaridaki while dongusunun cikisina if(iter->data==data)kosulu ekleyerek duzeltmeye calistim ama olmadi.Hatam nerdedir sizce?

  7. Şadi Evren ŞEKER Article Author

    doğrudur, çünkü fonksiyonunuzun içerisinde bir döngü ile iter->next'in null olması durumunu kontrol etmiş ve ancak bundan farklı birdurumda döngünün dönmesini söylemişsiniz.

    Şayet listesnizde tek eleman kaldıysa bu döngüye girmez (tek elemanın next'i null'dır). Bu durumda silme işlemi de gerçekleşmez.

    Bu tip durumlarda döngüden önce veya sonra, bu durumu kapsayan özel bir if koşulu yazmanızı tavsiye edebilirim.

    Başarılar

  8. hayal

    merhaba bana circular list ile ilgili bi uygulama lazım ekleme silme arama kodlarınıda içeren yardımcı olabilir misiniz?

    1. Şadi Evren ŞEKER Article Author

      bahsettiğiniz işlemlerin tamamını yapan kod zaten yukarıdaki yazı içerisinde bulunan bağlantıda var ve bu konuda sizden önce sorulan soruları okursanız oradaki bir ikişini isteği üzerine eklemiştim. Yine de bu kod işinizi görmüyorsa belki tam olarak istediğiniz koddan bahsederseniz yardımcı olmaya çalışabilirim.

      başarılar

  9. Şadi Evren ŞEKER Article Author

    Tekrar ediyorum yukarıdaki yazı içerisinde istediğiniz kod var. Kodlar ayrıca visual studio ile de çalışıyor.

    Kodları visual studio ile açmada sorun yaşadığınızı düşünerek, Visual Studio'da nasıl açaılacağını anlatan bir yazı yazıp yayınladım (ilgili yazıya dev-cpp-projelerinin-visual-studio-ile-acilmasi bağlığına tıklayarak ulaşabilirsiniz). Ayrıca sizin istediğiniz kodun, yani dairesel tek yönlü bağlı listenin (circular linked list) kodunu bir visual studio projesi haline getirip yukarıya bağlantısını ekliyorum.

    Umarım yardımcı olur

    başarılar

  10. gül

    arkadasım bize hocamız c++ de cift yonlu baglantılı lısteler ıle olusturlmus ögrenci otomasyonu verdi proje olarak…otomasyonda duzenle,yenı kayıt ekleme,arama yapmave lısteleme yapma gıbı özellıkler bulunacak lıstele konutu calıstırıldıgında ogrencının vıze ve fınal notları ıle gecıp kalma durumu ıle bırlıkte adı soyadı gıbı ozellıklerı de gozterılecek…b konu da bıraz arastırma yaptım ama ısıme yarayacak bırsey bulamadım 🙁 bana bu konu da yardımcı olursanız sevınırım

  11. hasan galalı

    Düğüm oluşturun
    2) Düğüm listesi oluşturun
    3) Listedeki düğümlerin toplamını hesaplayın , en büyüğünü ya da en küçüğünü bulun

    4) Düğüm listesinde araya düğüm eklemeniz beklenmektedir .

    merhaba hocam ben bilgisayar muh. birinci sınıf ogrencisiyim vizelerimiz dusuk oldugu için hocamız bu sorulsrı getirmemiz karsılıgındsa vizeye ekleme yapacagımızı soyledi ama gercekleyemedim yardımcı olursanız cok sevinirim

  12. Şadi Evren ŞEKER Article Author

    Sorularınızın çözümü zaten yukarıdaki yazıda bulunan kodlarda bulunuyor. Sadece toplam bulunmuyor bunun için de listeyi bastırırken bir değişken içerisinde biriktirme (accumulate) yapmanız yeterlidir.

    Başarılar

  13. Tolga

    İyi akşamlar Sadi Bey. benim sorum da linked list yani bağlı listeler hakkında olucaktı. ' farklı dosyadan 2 farklı metin okuyup kelimelerini karşılaştırmam gerekiyor.Bunları yaparken verimli bir linked list oluşturmam gerekiyor.Bir dosyadaki farklı kelime sayısını bulmam ve aynı olan kelimeleri de saymam gerekiyor.Dosyalardan okuyup kelime kelime yazdırdm ekrana ama karşılaştırmada sorun yaşıyorum sanırım mantığını kuramadım yardımcı olabilirseniz çözmek isterim 🙂 İyi çalışmalar

  14. Şadi Evren ŞEKER Article Author

    Anladığım kadarıyla kelime sayısı belli olmadığı için bağlı liste kullanacaksınız. Kelimeleri okumayı başardığınıza göre en mantıklı yol, kelime okudukça bağlı listeye eklemek (ekrana bastırmak yerine bunu yapmanız yeterli).

    bu işlemi yaparken dizgi karşılaştırma (string comparison) fonksiyonlarına ihtiyacınız olacak. Bunu string.h kütüphanesinden strcmp() fonksiyonu ile çözebilirsiniz. Geriye bağlı listeyi sıralı tutmak kalıyor ki hız açısından bunu tavsiye ederim. Yani eklenen her kelime, alfabetik olarak doğru aralığa sokulmalı. Bunu yapan kod zaten yukarıda var (sıralı bağlı liste kodlarına bakabilirsiniz)

    Son olarak iki listeyi karşılaştırıp aynı olan kelimeleri saymak kalıyor ki burada da iki liste üzerinde dönen iki dolaşıcı (iterator) oluşturup adım adım ilerletmek kalıyor. Algoritma kabaca böyle anlaşılmayan bir kısım olursa ya da kodlamakta takıldığınız bir nokta, sorabilirsiniz daha detaylı bilgi verebilirim.

    Başarılar

  15. ela

    boyutları birbirinden farklı iki bağlı listeyi toplayıp farklı bir bağlı listeye atma işlemi nasıl yapılır yardımcı olur musunuz?

  16. Şadi Evren ŞEKER Article Author

    Soruda açık bir iki nokta var, hangi dilde istenmiş ve toplamak ile istenen nedir? Buradaki toplamak işlemi kritik işlemdir. Şayet toplamak ile kast edilen, listelerin uç uca eklenmesi ise ve kod C dilinde yazılacaksa aşağıdaki şekildeki bir yapıyı ele alalım: (struct)

    1
    2
    3
    4
    
    typedef struct node {
            int data;
            node *next;
            };

    Yukarıdaki yapıda verilen iki listeden ilklistenin ilk elemanını (head) tutan değişken node * l1 ve ikincisi ise node *l2 ise, ekleme işlemi aşağıdaki gibi bir fonksiyon ile yapılabilir:

    1
    2
    3
    4
    5
    6
    7
    
    node * topla(node *l1, node* l2){
       node *iter = l1;
       while (iter->next != NULL)
           iter = iter->next;
       iter->next = l1;
       return l1;
    }

    algoritmada, basitçe bir iter (dolaşıcı) tanımlayıp, ilk listenin sonuna kadar gidiyoruz. Bu listenin sonuna ulaşınca ikinci listenin ilk elemanını (l2) listenin son elemanının next'ine koyuyoruz dolayısıyla l1->l2 şeklinde bir bağlantı oluşturmuş oluyoruz.

    Şayet toplamak ile kast ettiğiniz şey farklı ise bunu belirtin ona göre yazmanız gereken kodu düzenleyelim.

    Başarılar

    1. Btl

      Hocam int tutan iki ayrı bağıl listedeki elemenları toplamak istiyorum yani şöyle
      l1=256397
      l2=5463;
      l1+l2 toplamlarını nasıl bulabilirim.

  17. ela
    void topla(blisteler liste1,blisteler liste2,blisteler liste3){
              bliste gecici1 = liste1.ilk;
              bliste gecici2 = liste2.ilk;
             
             while(gecici1!=null && gecici2!=null){
                  liste3.Ekle(liste3.bilgiAl(gecici1.katsayi+gecici2.katsayi));
                  gecici1 = gecici1.sonraki;
                  gecici2 = gecici2.sonraki;
              }
    

    java dilinde yazıyorum listedeki elemanları toplamaya çalışıyorum fakat uzun olan listedeki elemanları liste3 e atmıyor bunu nasıl halledeblirim ....?

  18. Şadi Evren ŞEKER Article Author

    Anladım, aşağıdaki şekilde deneyin:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    void topla(blisteler liste1,blisteler liste2,blisteler liste3){
              bliste gecici1 = liste1.ilk;
              bliste gecici2 = liste2.ilk;
     
             while(gecici1!=null && gecici2!=null){
                  liste3.Ekle(liste3.bilgiAl(gecici1.katsayi+gecici2.katsayi));
                  gecici1 = gecici1.sonraki;
                  gecici2 = gecici2.sonraki;
              }
             if(gecici1 != null)
                      while(gecici1 != null){
                               liste3.Ekle(gecici1.katsayi);
                      }
             if(gecici2 != null)
                      while(gecici2 != null){
                               liste3.Ekle(gecici2.katsayi);
                      }

    çözümünüzde listelerden birisi bitince döngü bitmiş. Burası doğru ancak listelerden birisi uzunsa bu listeye özel olarak döngünün devam etmesi gerekir. Yeni halinde liste1 erken bittiyse liste2, liste2 erken bittiyse liste1'deki elemanlar kopyalanır.

    Aslında if satırlarına gerek yok sadece while blokları da yeterli ancak anlaşılsın diye iki ihtimali yazdım. Aynı kod aşağıdaki şekilde de çalışır

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    void topla(blisteler liste1,blisteler liste2,blisteler liste3){
              bliste gecici1 = liste1.ilk;
              bliste gecici2 = liste2.ilk;
     
             while(gecici1!=null && gecici2!=null){
                  liste3.Ekle(liste3.bilgiAl(gecici1.katsayi+gecici2.katsayi));
                  gecici1 = gecici1.sonraki;
                  gecici2 = gecici2.sonraki;
              }
                      while(gecici1 != null){
                               liste3.Ekle(gecici1.katsayi);
                      }
                      while(gecici2 != null){
                               liste3.Ekle(gecici2.katsayi);
                      }

    Başarılar

  19. deniz

    boyutları birbirinden farklı iki bağlı listeyi toplayıp farklı bir bağlı listeye atma işlemi nasıl yapılır yardımcı olur musunuz?
    java ile olacak
    liste1 ve liste 2 olacak karşılık lı sıradakiler toplanıp yeni oluşturulan liste3 e eklence
    bana bu konu da yardımcı olursanız sevınırım

  20. Şadi Evren ŞEKER Article Author

    Sanırım bir önceki yorumda yazılan soruya verdiğim cevap sizin de işinizi görüyor. Şayet istediğiniz farklıysa farkını belirtmeniz durumunda yardımcı olmaya çalışayım.

    Başarılar

  21. ela
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    void topla(blisteler liste1,blisteler liste2,blisteler liste3){
              bliste gecici1 = liste1.ilk;
              bliste gecici2 = liste2.ilk;
     
             while(gecici1!=null && gecici2!=null){
                  liste3.Ekle(liste3.bilgiAl(gecici1.katsayi+gecici2.katsayi));
                  gecici1 = gecici1.sonraki;
                  gecici2 = gecici2.sonraki;
              }
     
                 while(gecici1!=null){
                     liste3.Ekle(liste3.bilgiAl(gecici1.katsayi));
                     gecici1 = gecici1.sonraki;
                 }
     
                 while(gecici2!=null){
                     liste3.Ekle(liste3.bilgiAl(gecici2.katsayi));
                      gecici2 = gecici2.sonraki;
                 }
          }

    hocam sağolun yardım ettiğiniz için birkaç düzeltmeden sonra yukarıdaki şekliyle kod çalıştı iyi geceler tekrar teşekkürler.... 🙂

  22. Ozan

    hocam sayenizde dosya icinden bağlı listenin her bir düğümüne eleman eklemeyi anladım ancak
    örneğin bu bir dosya değilde:

    1
    2
    3
    4
    
    typedef struct ozan{
       int yas;
       ozan*ileri;
    };

    simdi burada bağlı listeye bir sürü yas eklemek istiyorum simdi bunu nasıl yapıcam tek bağlı sisteminde bir örnek verirseniz cok iyi olur.

  23. Şadi Evren ŞEKER Article Author

    Yukarıdaki örnek kodlara baktınız mı? Çeşitli durumlar için örnek kodlara bağlantı yazı içerisinden verilmiş. Eklemenin yaş olması veya herhangi bir sayı olması arasında fark yok aynı şekilde ekleme yapabilirsiniz. Yine de sorun yaşar veya anlaşılmayan birşeyler olursa yazın lütfen yardım etmeye çalışayım.

  24. Ozan

    sayın hocam örneği incelediğimde dikkat ettim bu orneklerde mesala hep ilk baştan itibaren eleman ekledik yani biz eklemeye baslamdan once hiç eleman yoktu o int yas içinde .sunu demek istiyorum hane struct içindeki yas bilgisinde onceden bir eleman olsaydı ve biz yeni elemanları eklemek isteseydik bu sefer nasıl bir yol izlememiz gerekirdi.

  25. Şadi Evren ŞEKER Article Author

    İlk elemanı kod içerisinden elle ekledikten sonra yeni elemanları döngü ile ekleyebilirdiniz. Boş bir liste oluşturmak için:

    1
    2
    3
    
    iter = (node *)malloc(sizeof (node));
    root = iter;
    iter->yas = 10;

    yazmanız yeterlidir. Buradaki ilk elemanı ekledikten sonra istediğiniz gibi döngü kurabilirsiniz. Örneğin iter'in gösterdiği ilk eleman boş kalsın istiyorsanız aşağıdaki satırlar da çalıştırılabilir:

    1
    2
    
    iter->next = (node*)malloc(sizeof(node));
    iter = iter->next;

    Bu sayede listemize bir eleman eklenip yaş değeri 10 olarak atanmış ve bu elemandan sonrasına boş bir düğüm daha tanımlanmış ve iter bu yeni boş düğümü göstermiş olur. İlk kod parçasındaki root=iter satırı oldukça önemlidir. Bu satır olmazsa listenin başını gösteren bir elemanımız olmayacağı için listeyi kaybederiz.

  26. serhat

    iyi günler. bir metini okuyup içindeki bizim klavyeden girdiğimiz kelime adedini bulan bir projem var.bu yaptım ancak istenilen proje 2, 2 ve 3 olan harflı kelimelerin aranacğını söyluyor. Bunun sebebi ise ilk hrfi basta olusturdugumuz fptr poıntrı ıle tutmamız , ıkıncı harfler ıcn br link olusturmamız ve 3nncu harf ıcn ise ayrı bir link list olusturmamız istenıyor.bu fptr ponterını kullanark ıkı ayrı link listi nasıl olusturabılız yardımcı olur musunuz

  27. muammer

    hocam bu aşagıda kuyruk class ı nı oluşturdum .fakat enqueue dequeue dislayqueue fonksiyonuyla beraber yazdım ama fonksiyonlar sürekli hata veriyor.fonksiyonların kodunu nasıl yazabilirim?yazıyorum ama sürekli hata veriyor.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    class KuyrukOgrenci {
       public:
          int ogr_no;
          char ogr_adi[25];
          char ogr_soyadi[25];
          char ogr_bolum[25];
          int ogr_ders1,ogr_ders2;
          KuyrukOgrenci *on;
          KuyrukOgrenci *arka;
    };
     
    class Kuyruk{
       public:
          Kuyruk(){
             on=arka=NULL;
             counter=0;
          }
          void Enqueue(KuyrukOgrenci *yeniDugum);
          void Dequeue(int);
          void DisplayKuyruk(KuyrukOgrenci*);
          void TumOgrenciler(YiginOgrenci *suankiPtr);
       private:
          KuyrukOgrenci* ilk;
          KuyrukOgrenci* son;
    };
  28. Şadi Evren ŞEKER Article Author

    Sanıyorum kodunuzu yollamamışsınız, yukarıdaki kod sadece fonksiyon prototiplerini içeriyor. Şayet kodunuzu ve aldığınız hatayı yollarsanız sizin için inceleyerek hatasını bulmaya çalışırım. Bu arada kodunuzu fonksiyonel olarak yazdıysanız, hatalı olan fonksiyonu yollamanız yeterli.

    Başarılar

  29. muammer

    void Yigin::Enqueue(KuyrukOgrenci **ustPtr,int oNo, char ogr_adi[100],
    char ogr_soyadi[100],
    char ogr_bolum[100],
    int ogr_ders1,
    int ogr_ders2)
    {

    KuyrukOgrenci *yeniPtr=new KuyrukOgrenci;
    if(yeniPtr!=NULL)
    {
    yeniPtr->ogr_no=oNo;
    strcpy(yeniPtr->ogr_adi,ogr_adi);
    strcpy(yeniPtr->ogr_soyadi,ogr_soyadi);
    strcpy(yeniPtr->ogr_bolum,ogr_bolum);
    yeniPtr->ogr_ders1=ogr_ders1;
    yeniPtr->ogr_ders2=ogr_ders2;
    yeniPtr->sonraki=*son;
    *son=yeniPtr;
    }
    else
    {
    printf("Veri eklenemdi.n");
    }

    }
    burda enqueue metodunu yapmaya calıştım olmamış hocam

  30. Hilmi Güler

    Merhabalar Hocam rahatsız ediyorum size sorum olacak.. aramak için yapılan toplam ve ortalama hafıza erişim sayısını hesaplamasını nasıl yapmam gerekiyor kodun içinde..Bir türlü işin içinden çıkamadım..Bir yerde takılıyorum ve ilerleyemiyorum..yardımınıza ihtiyacım var..teşekkürler şimdiden..
    soru1:2,45,22,3,2,2,2,6,5,4,5,3,3... formatında verilen değerleri bu bağlı listede aratıp ve bütün bu verileri aramak için yapılan toplam ve ortalama hafıza erişim sayısını hesaplama.(bağlı listenin her düğümüne ulaşmak 1 erişimdir)

    ?View Code CSHARP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    class LinkList where T :IComparable 
    { 
       public bool find(T val) 
       { 
          Node iterator = head; 
          while (iterator != null) 
          { 
             if (iterator.Value.CompareTo(val) == 0) 
                return true; 
             iterator = iterator.Link; 
          } 
          return false; 
       } 
       public void display() 
       { 
          if (head == null) 
             Console.WriteLine("İts null"); 
          else 
          { 
             Node iterator = head; 
             while (iterator != null) 
             { 
                Console.Write(iterator.Value + "-->"); 
                iterator = iterator.Link; 
             } 
             Console.WriteLine("null"); 
             Console.WriteLine(); 
     
     
             public class Node
             {
                T value;
     
                public T Value
                {
                   get { return this.value; }
                   set { this.value = value; }
                }
                Node next;
     
                public Node Next
                {
                   get { return next; }
                   set { next = value; }
                }
                public Node(T val)
                {
                   value = val;
                   next = null;
                }
             }
          }
     
          class Program 
          { 
             static void Main(string[] args) 
             { 
                LinkList list = new LinkList(); 
                Console.WriteLine(list.find(2));

    45,223,2,2,2..

    soru2:2,45,22,3,2,2,2,6,5,4,5,3,3... formatında verilen değerleri bu bağlı listede arayıp. Ama bu aramayı yaparken bağlı listeyi de modifiye etmek gerekiyor Herhangi bir değer arandığı zaman bu değer listenin en başına getirilecek .(2->3->4->5 listesinde 4 aranırsa liste bu aramadan sonra 4->2->3->5 halini alacak) çok aranan değerler listenin ön taraflarına konuçlanacak.

  31. Şadi Evren ŞEKER Article Author

    Bakın arama kısmını anlatmaya çalışayım. Arama için aşağıdaki find fonksiyonunu kodlamışsınız:

    ?View Code CSHARP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
       public bool find(T val) 
       { 
          Node iterator = head; 
          while (iterator != null) 
          { 
             if (iterator.Value.CompareTo(val) == 0) 
                return true; 
             iterator = iterator.Link; 
          } 
          return false; 
       }

    Şimdi bu kodda bağlı listenin ilk elemanı head olarak tutulmuş ve buradan başlayarak bağlı listedeki bağlantı değişkeni olan Link üzerinden hareket edilmiş. Aslında burada iterator her seferinde bağlı listenin bir sonraki elemanına geçiriliyor bunu yapan kod sizin kodunuzda aşağıdaki şekilde geçiyor:

    iterator = iterator.Link;

    Demek ki bağlı listede ilerliyoruz ancak her ilerleme sırasında da veriler kontrol edilyor, bu kontrol de aşağıdaki satırla yapılıyor:

    if (iterator.Value.CompareTo(val) == 0)

    Şimdi işimiz basit, bu kontrol sırasında bir sayaç tutularak bu değeri saymamız yeterli. Bunun için arama yapan kodu aşağıdaki şekilde değiştirebilirsiniz:

    ?View Code CSHARP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
       public int find(T val) 
       { 
          int sayac=0;
          Node iterator = head; 
          while (iterator != null) 
          { 
             sayac++;
             if (iterator.Value.CompareTo(val) == 0) 
                return sayac; 
             iterator = iterator.Link; 
          } 
          return -1; 
       }

    Şimdi artık kodumuz arama sonucunda bulundu veya bulunmadı şeklinde boolean bir değer dödndürmek yerine kaç adımda bulunduğunu döndürüyor. Şayet bulunamazsa da -1 döndürüyor.

    Gelelim aranan değerlere göre listede yapılacak değişikliğe. Bunun için iki yöntem var ancak sizin yazınızda bu ikisi birbirine karışmış. Basitçe anlatacak olursak, birisi en son arananı başa koymak (burada kaç kere arandığının listedeki sırası açısından bir önemi yok) diğer yol ise en çok arananı başa, en çok aranan ikinciyi ikinci sıraya ... koymak.

    Bu konu bilgisayar bilimlerinin çeşitli alanlarında geçmektedir örneğin cache replacement (önbellek değişim) algoritmalarını anlattığım yazıda bu iki farka dikkat çekiliyor.

    http://www.bilgisayarkavramlari.com/2010/05/21/on-hafiza-cache/

    Yani örneğin LFU ile LRU algoritmaları farklıdır. Şayet amacınız her düğüme kaç kere erişildiği ise, bunun için listenizdeki düğüm yapısını da değiştirmeniz gerekir. Şu anda düğüm yapınızda Valu ve Next bilgileri var bunlara ilave bir de sayaç eklemelisiniz.

    Şayet amacınız en son erişileni başa almaksa, basitçe düğümü erişildiği yerden silin ve listenin başına ekleyin (bunu yapan kodlar şu anda yorum yazmakta olduğumuz yazının içerisinde bulunuyor ve detaylıca anlatılmış durumda).

    Başarılar

  32. hilmi güler

    Merhabalar hocam ..bu kodda stackoverflowexception hatası vermekte Teşekkürler Hocam alakanıza ve ilginize ...
    public class Node where T : IComparable
    {
    T value;

    public T Value
    {
    get { return this.value; }
    set { this.value = value; }
    }
    Node next;

    public Node Link
    {
    get { return Link; }
    set { next = value; }
    }
    public Node(T val)
    {
    value = val;
    Link = null;
    return;
    }
    }
    }

    public class Linkedlist where T : IComparable
    {
    Node head;

    public Node createNode(T val)
    {
    return new Node(val);
    }
    public void addToFront(T val)
    {
    Node newNode = new Node(val);
    newNode.Link = head;
    head = newNode;
    }
    public void addtoend(T val)
    {
    if (head == null)
    head = new Node(val);
    else
    {
    Node iterator = head;
    while (iterator.Link != null)
    {
    iterator = iterator.Link;
    }
    iterator.Link = new Node(val);
    }
    }

    public void addSorted(T val)
    {
    if (head == null)
    {
    addToFront(val);
    }
    else if (val.CompareTo(head.Value) == -1)
    {
    addToFront(val);
    }
    else
    {
    Node iterator, previous;
    iterator = previous = head;
    while (iterator != null &&
    iterator.Value.CompareTo(val) == -1)
    {
    previous = iterator;
    iterator = iterator.Link;
    }
    Node temp = new Node(val);
    previous.Link = temp;
    temp.Link = iterator;

    }

    }

    //Count the number of items in the doubly linked list
    public int countitem()
    {

    Node i;

    int t = 0;

    for (i = head; i != null; i = i.Link)
    {

    t = t + 1;

    }

    return t;

    }

    //Searching for an item in the doubly linked list

    public Node find(T val)
    {

    Node t;

    t = head;

    bool f = false;

    while (t != null)
    {

    if (t.ToString().CompareTo(val.ToString()) == 0) { f = true; break; }

    t = t.Link;

    }

    if (f != false) return t;

    else return null;

    }

    //Print all items of the doubly Linked List
    public void printlist()
    {

    Node t;

    if (head != null)
    {

    Console.WriteLine("All items in the list:");

    for (t = head; t != null; t = t.Link)
    {

    Console.WriteLine(t);

    }

    }

    else Console.WriteLine("No item found!");

    }
    public void showall()
    {
    Node t;
    if (countitem() > 0)
    {
    Console.WriteLine("All items in the list:");
    for (t = head; t != null; t = t.Link)
    {

    Console.WriteLine(t);
    }
    }
    else Console.WriteLine("No item found!");
    }

    public void display()
    {
    if (head == null)
    Console.WriteLine("İts null");
    else
    {
    Node iterator = head;
    while (iterator != null)
    {
    Console.Write(iterator.Value + "-->");
    iterator = iterator.Link;
    }
    Console.WriteLine("null");
    Console.WriteLine();
    }
    }
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Linkedlist list = new Linkedlist();
    list.addSorted(2);
    list.addSorted(3);
    list.addSorted(45);
    list.addSorted(6);
    list.addSorted(12);
    list.addSorted(5);
    list.addSorted(3);
    list.display();

    list.addtoend(2);

    list.addtoend(3);
    list.addtoend(45);
    list.addtoend(6);
    list.addtoend(12);
    list.addtoend(5);
    list.addtoend(3);
    list.display();
    Console.WriteLine(list.find(2));
    list.countitem();
    list.showall();
    list.display();
    list.printlist();

  33. hilmi güler

    hocam sizin dediğniz gibi yaptım kodun son hali bu fakat hata:process is to terminated to stack overflow exception hatası vermekte..

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ödev
    {
    public class Linkedlist where T : IComparable
    {
    Node head;

    public Node createNode(T val)
    {
    return new Node(val);
    }
    public void addToFront(T val)
    {
    Node newNode = new Node(val);
    newNode.Link = head;
    head = newNode;
    }
    public void addtoend(T val)
    {
    if (head == null)
    head = new Node(val);
    else
    {
    Node iterator = head;
    while (iterator.Link != null)
    {
    iterator = iterator.Link;
    }
    iterator.Link = new Node(val);
    }
    }

    public void addSorted(T val)
    {
    if (head == null)
    {
    addToFront(val);
    }
    else if (val.CompareTo(head.Value) == -1)
    {
    addToFront(val);
    }
    else
    {
    Node iterator, previous;
    iterator = previous = head;
    while (iterator != null &&
    iterator.Value.CompareTo(val) == -1)
    {
    previous = iterator;
    iterator = iterator.Link;
    }
    Node temp = new Node(val);
    previous.Link = temp;
    temp.Link = iterator;

    }

    }

    //Count the number of items in the doubly linked list
    public int countitem()
    {

    Node i;

    int t = 0;

    for (i = head; i != null; i = i.Link)
    {

    t = t + 1;

    }

    return t;
    }
    public int find(T val)
    {
    int sayac=0;
    Node iterator = head;
    while (iterator != null)
    {
    sayac++;
    if (iterator.Value.CompareTo(val) == 0)
    return sayac;
    iterator = iterator.Link;
    }
    return -1;
    }

    //Searching for an item in the doubly linked list

    //Print all items of the doubly Linked List
    public void printlist()
    {

    Node t;

    if (head != null)
    {

    Console.WriteLine("All items in the list:");

    for (t = head; t != null; t = t.Link)
    {

    Console.WriteLine(t);

    }

    }

    else Console.WriteLine("No item found!");

    }
    public void showall()
    {
    Node t;
    if (countitem() > 0)
    {
    Console.WriteLine("All items in the list:");
    for (t = head; t != null; t = t.Link)
    {

    Console.WriteLine(t);
    }
    }
    else Console.WriteLine("No item found!");
    }

    public void display()
    {
    if (head == null)
    Console.WriteLine("İts null");
    else
    {
    Node iterator = head;
    while (iterator != null)
    {
    Console.Write(iterator.Value + "-->");
    iterator = iterator.Link;
    }
    Console.WriteLine("null");
    Console.WriteLine();
    }
    }
    }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ödev
    {
    public class Node where T : IComparable
    {
    T value;

    public T Value
    {
    get { return this.value; }
    set { this.value = value; }
    }
    Node next;

    public Node Link
    {
    get { return Link; }
    set { next = value; }
    }
    public Node(T val)
    {
    value = val;
    Link = null;
    return;
    }
    }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ödev
    {
    class Program
    {
    static void Main(string[] args)
    {
    Linkedlist list = new Linkedlist();
    list.addSorted(2);
    list.addSorted(3);
    list.addSorted(45);
    list.addSorted(6);
    list.addSorted(12);
    list.addSorted(5);
    list.addSorted(3);
    list.display();

    list.addtoend(2);

    list.addtoend(3);
    list.addtoend(45);
    list.addtoend(6);
    list.addtoend(12);
    list.addtoend(5);
    list.addtoend(3);
    list.display();
    Console.WriteLine(list.find(2));
    list.countitem();
    list.showall();
    list.display();
    list.printlist();
    }
    }
    }

  34. Osman Edip ÇUHADAR

    Merhabalar hocam

    "Basit bir bağlı liste örnek kodu" başlığnda yayınladığınız kodda :

    node *temp=root; ve
    temp=root;

    satırlarındaki işlemlerini anlayamadım.Biraz açıklayabilir misiniz?

    İyi çalışmalar

  35. Osman Edip ÇUHADAR

    Tekrar merhabalar Hocam,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include "stdafx.h"
    #include <stdio.h>
     
    typedef struct node{
     
    	int data;
    	node *next;
    };
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	node *root=(node*)malloc(sizeof(node));------------>(a)
    	node *temp=root;       ---------------------------->(1)
     
    	for(int i=0;idata=i*10;
    		temp->next=(node*)malloc(sizeof(node));
    		temp=temp->next;
    	}
    	printf("insertednn");
    	system("pause");
    	temp=root;             ----------------------------->(2)
    	for(int i=0;idata);
    		temp=temp->next;
    	}
     
    	printf("nn");
    	system("pause");
    	return 0;
    }

    Kodunuzun (1) ve (2) satırları
    oluşturduğunuz listenin başlangıcına dönmeyi sağladığını anladım.
    Ama ben
    (a) node *root=(node*)malloc(sizeof(node)); satırını:
    node *temp=(node*)malloc(sizeof(node)); şeklinde değiştirmek ve
    (2) satırında başlangıca dönmeyi sağlayacak başka bir alternatif rica ediyorum sizden.

    İyi çalışmalar

  36. Şadi Evren ŞEKER Article Author

    İşlem sırası fark etmez. Yani önemli olan bir düğüm (node) oluşturmak ve ardından bu düğüme bağlı diğer düğümler oluşturmak ve bu düğümler üzerinde dolaşan bir iterator oluşturmak.

    Bu amaçla yukarıdaki kodda, root düğümü bağlı listenin ilk elemanını tutuyor. Şayet sizin bahsettiğiniz gibi temp içerisinde bir düğüm oluşturmak istenirse o zaman root yine aynı düğümü gösterebilir:

    node *temp=(node*)malloc(sizeof(node));
    root= temp;

    şeklinde yazmanız aynı sonucu verecektir.

    Bu durumda kodun geri kalanını değiştirmenize gerek kalmaz ve (2) ile işaretlenen yer aynı şekilde kalsa bile kod çalışır. Ancak neden böyle bir değişiklik istediğinizi anlayamadım belki amacınızı yazarsanız daha fazla yardımcı olabilirim.

    Başarılar

  37. mehmet

    hocam merhaba c de bir kelime bir işlem oyunununişlem bolumunu geliştirecek bir oyun yapacagız oyunda rastgele secilecek 6 sayı ile rastegele secilen işlemler hedef sayıyı bulacak ,konumuz bu lakin nasıl yapmamız gerektiğini,nasıl bir yol izlemem gerektiğini bir türlü tam olarak kuramıyorum kafamda en azından bir yol gösterir bir tavsiyede bulunursanız cok sevinirim,tesekkür ederim...

  38. Şadi Evren ŞEKER Article Author

    Bu durumda ikili bir arama ağacı oluşturmak mantıklı olabilir. Aslında problem çok farklı şekillerde çözülebilir. Örneğin algoritma (heuristic) veya genetik algoritmalar ile çözülmesi mümkün ama ben yerinizde olsam ikili bir arama ağacı oluşturup etraflı arama (exhaustive search) kullanmayı denerdim (tabi sayı ve işlemlerin çok sayıda olmayacağını düşünüyorum).

    Basitçe her işlem her sayı ikilisi üzerinde denenir. Çıkan sonuçlar diğer işlemler üzerinde denenir ve böylece devam eder.

    Bu arama işlemine sayıya yaklaştıkça tercih edilme sebebi olacak bir sezgisel puanlama ekleyerek örneğin açgözlü yaklaşımı (Greedy approach) ekleyebilirsiniz. Çok daha hızlı çalışacaktır ancak her zaman doğru sonucu üretmeyebilir.

    Başarılar

  39. mehmet

    hocam tesekkur ederim dediğiniz seyleri yapmaya calıstım lakiin bir turlu agac yapısına uyarlıyamıyorum,elinizde daha ayrıntılı bilgi veya ulasabilecegimiz kod veya kaynak varmı...

  40. mehmet

    hocam aşağıdaki gibi olması gerekir.çok denedim ama bir türlü yapamıyorum hocam bi el atın lütfen.
    Örneğin 5 sayımız, 4 adet işlecimiz(+,/,*,-) olsun. Şu şekildeki tüm kombinasyonlar denenir:

    Sayi1 İşleç1 Sayi2 İşleç2 Sayi3 İşleç3 Sayit4 İşleç4 Sayi5

    Sayıların tüm kombinasyonu 5 * 4 * 3 * 2 * 1 = 5! = 120 (her sayı sadece bir kez kullanılacak)
    İşleçlerin tüm kombinasyonu 4 * 4 * 4 * 4 = 4^4 = 256 (her işleç birden fazla kez kullanılabilir)

    120 * 256 = 30720 adet adım ile en yakın veya eşit sonuç denenerek bulunabilir.

  41. Osman Edip ÇUHADAR

    Merhabalar Hocam,

    Verdiğiniz cevap için teşekkür ederim.
    (a) satırının root başlangıç noduna gerek kalmadan direk temp nodu ile başlasam ve
    (1) - (2) satırlarını silsem diye düşünüyordum ama program hata veriyordu.Sonra
    (2) satırında, tekrar başlangıca dönerek, oluşturulan bağlı listenin elemanlarının
    yazdırılabilmesi için o işlemlerin yapıldığını anladım.
    Farklı bir yol denemeye çalıştım.
    Sanırım dediğim şeyin gerçekleşmesi için yani root diye bir şeye gerek olmaması için
    (a) satırındaki ilk temp düğümünün adresini kendim tayin edip(burda ilk temp değerine NULL başlangıcı vermek geldi aklıma ama o bir adres değil değerdi ve bu yüzden hata verdi sanırım)
    (2) satırında yine o ilk adrese yönlendirmeliyim ki
    (1) satırına da root değişkenine de gerek olmasın.

    Tekrar teşekkür ederim Hocam.
    Kolay gelsin

  42. Şadi Evren ŞEKER Article Author

    Bahsettiğiniz durum tek yönlü açık bağlı liste için mümkün değil yani bu durumda mutlaka root gibi bir değişkene ihtiyaç var. Ancak çift yönlü bağlı liste (doubly linked list) veya dairesel bağlı liste (circluar linked list) gibi yapılar kullanarak root ihtiyacını ortadan kaldırabilirsiniz ki sizin tanımınızda buna benizyor.

    Başarılar

  43. Ozan

    Hocam bağli listeye ait her düğümün de kendi içinde bağli listesi olabilir mi?Yani mesela bir albüm kataloğu var ve her bir albüm yeni bir dugum ama albüm içindeki sarkilar normalde bir string dizisi,ancak string dizisi değil de onları da bir bağlı bir liste seklinde ana dugum içinde barındırabilir miyiz.

  44. merve

    B+ Aağacını bağlantılı liste mantığında nasıl programlayabilirim?Mesela öğrenci numaralarının gerekenleri anahtarlama için kullanılacak ve öğrencinin numarası, adı, soyadı ve bölümü bilgilerine yapraklarden erişilecek yardımcı olur musunuz?

  45. suna

    //ogr1 no:,,,,
    //ogr1isim,,,,
    //ogr2 no,,
    //ogr2 isim,,,
    tek yonlu baglantılı linked list ve stack kullanılması nasıl.

  46. Umut

    Bir sorum var hocam. asagida verecegim kodda yeni bir liste olusturmam gerekli.
    YeniListeOlustur functioni var ve sadece 1 parameter aliyor o da pointer to a linked list. Bu function bu yeni listeyi newList functionuni cagirip olusturmali. sonrasinda parameter listesindeki nodlari traverse yapmaliyim. eger item'lar 10ve katlariysa, yeni listeye eklenmeli. degilse new list return yapmaliyim.

    henuz yeni oldugum icin programlamada kafam karisti. Kod soyleki:

    typedef struct Node{
    infoT info;
    struct Node* next;
    }Node;

    typedef struct{
    Node* head;
    Node* tail;
    }List;

    Node* newNode(infoT infoPar){
    Node* temp = malloc(sizeof(Node));
    temp->info = infoPar;
    temp->next = NULL;
    return temp;
    }

    List* newList(){
    List* tempList = malloc(sizeof(List));
    tempList->head = NULL;
    return tempList;
    }

    Tesekkurler,

  47. Murat

    Merhaba,
    Ben linked list te istenen silinecek data yi silemiyorum. Yardimci olursaniz cok sevinirim.
    Tesekkurler..

    #include
    using namespace std;

    struct Record {
    int id;
    string name;
    };

    struct Node {
    Record *data;
    Node *name;
    Node *prev;
    Node *next;
    };

    const char Enter = 'A';
    const char List = 'L';
    const char Remove = 'R';
    const char Shutdown = 'Q';

    Record *getData()
    {
    string restOfLine;
    Record *data = new Record;
    cout <> data->id;
    getline(cin, restOfLine);
    cout <name);
    cout <prev = ptr->next = ptr;

    return ptr;
    }

    void addToFront(Node *list, Record *data)
    {
    Node *cur = new Node;
    cur->data = data;
    cur->next = list->next;
    cur->prev = list;
    list->next = cur;
    cur->next->prev = cur;
    }

    void addToId(Node *list, Record *data)
    {
    Node *cur = new Node;
    cur->data = data;
    Node *itr = list;
    while (itr->next != list
    && itr->next->data->id id) {
    itr = itr->next;
    }
    cur->next = itr->next;
    cur->prev = itr;
    itr->next = cur;
    cur->next->prev = cur;
    }

    void addToName(Node *list, Record *data)
    {
    Node *cur = new Node;
    cur->data = data;
    Node *itr = list;
    while (itr->next != list
    && itr->next->data->name name) {
    itr = itr->next;
    }
    cur->next = itr->next;
    cur->prev = itr;
    itr->next = cur;
    cur->next->prev = cur;
    }

    // display a data record
    void display(Record *data)
    {
    cout << " " <id << "\t"
    << " | " <name << endl;
    }

    void displayAll(Node *list)
    {
    cout << "\n Library Card Id | Book Call Number\n" << endl
    << "-----------------------------------\n" <next;
    while (itr != list) {
    display(itr->data);
    itr = itr->next;
    }
    cout << "-----------------------------------\n" <prev;
    while (itr != list) {
    display(itr->data);
    itr = itr->prev;
    }
    }

    void removeData(Node *list, Record *data)
    {

    cout <> name;
    Node *victim = list;
    if (victim->name == NULL){
    cout <name == list){
    victim = victim->prev ;
    victim->next->prev = victim->prev;

    }
    delete victim;

    }

    int main()
    {
    Record *data;
    char cmd;

    string i;
    Node *noOrderList = createAnEmptyList();
    Node *orderListwithId = createAnEmptyList();
    Node *orderListwithName = createAnEmptyList();

    cout << "\n*** Welcome to Library Reservation System ***\n" << endl
    << "Please choose from the following commands: " << endl
    << "\t" << Enter << "---to add a new reservation" << endl
    << "\t" << Remove << "---to remove a reservation" << endl
    << "\t" << List << "---to list all reservation" << endl
    << "\t" << Shutdown << "---to shutdown the system" << endl;

    // get user command
    cout <> cmd;
    cmd = toupper(cmd);

    while (cmd != Shutdown) {

    switch (cmd) {
    case Enter:
    // get the data
    data = getData();

    // add data into lists
    addToFront(noOrderList, data);
    addToId(orderListwithId, data);
    addToName(orderListwithName, data);
    break;

    case Remove:
    removeData(orderListwithName, data);
    break;

    case List:
    displayAll(orderListwithId);
    break;

    default:

    cout << "Unknown command." << endl;
    }

    // get next command
    cout <> cmd;
    cmd = toupper(cmd);
    }if(cmd == Shutdown){
    cout <<"\nSystem shutting down ...\n"<< endl;
    }

    return 0;
    }

  48. Aslıhan

    Hocam Merhaba benim size bir sorum olacakti bağlı liste kodlarını yazarken fonksiyonlarda neden node * dedik int diyemez miydik yardimci olursaniz sevinirim

  49. melek

    1. Birisi tek yönlü bağlantılı liste kullanılarak yapılan kuyruk ve diğeri çift yönlü bağlantılı liste olan iki soyut veri yapısı tanımlayınız ve programlarını (temel işlemler dahil) yapınız? Çift yönlü bağlantılı listenin ve kuyruğun her bir düğümünde öğrencinin numarası, adı, soyadı ve bölümü bilgileri tutulacaktır.
    erciyes üniversitesinde yaz okulunda veri yapıları dersi aldım ve kendi üniversitemde java öğrendm. hocam c dilinde bu projeyi yapmamı istiyor yardımcı olursanız sevinirim

  50. ilyas

    hocam merhaba girilen kelimelerin eklendiği iki adet çift bağlı listeyi kaynaştırarak yeni bir çift bağlı liste oluşturan c programı nasıl olabilir yardımcı olursanız sevinirim

  51. Berke

    Hocam merhaba , 2 adet (uzunluğu int veya double ile sınırlı olmayan) tam sayı alıp bunların rakamlarına ayırıp kendinizin yazmış olduğu (Şablon olmayan) Bağıl Listeye her bir rakamı ayrı bir düğüm olacak şekilde eklemeli ve Sayi Sınıfı Dugum Sınıfı BagilListe Sınıfı Islem Sınıfı(sayıların parçalanıp bağlı listeye ekleneceği sınıf) nasıl bir yok izleyebilirim yardımcı olursanız sevinirim.

    class İslem {

    public:
    int a,b,i, j, k = 1, m, sayi1, basamaks;
    İslem(int x , int y) {
    a = x;
    b = y;
    }

    int sayidiziy[20];
    int sayidizix[20];

    do {
    sayi1 = sayi1 / 10;
    basamaks++;
    } while (sayi >= 10);
    sayidizix[0] = a / 10 ^ basamaks;
    basamaks--;
    for (int m = 0; basamaks data = sayidizix[];
    root->next = NULL;
    return root;
    }
    node * iter = root;
    while (iter->next != NULL)
    iter = iter->next;
    node* temp = (node *)malloc(sizeof(node));
    temp->data = sayidizix[m];
    temp->next = NULL;
    iter->next = temp;
    return root;

    node * s = NULL;

    }

  52. Devran

    Bağlı liste kullanarak oluşturmuş olduğum programda. yazmış olduğum bir kopyalama kesme ve yapıştırma işlemlerini nasıl yapabilirim string.h kütüphanesini kullanamıyorum hocam bana yardımcı olabilir misiniz.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


dokuz − 7 =