Yazan: Şadi Evren ŞEKER

Gelen bir soru üzerine (Ayşenur Doğan sormuş), iki farklı dosya okuyup, okunan dosyalardaki verileri iki farklı bağlı listeye koyan kodu yazmaya çalışalım.

Öncelikle bağlı listemizin düğüm yapısını tanımlayalım. Tek yönlü bir bağlı liste işimizi çözecektir. Dolayısıyla sadece next isimli bir gösterici (pointer) koyarak her düğümün (node) bir sonraki düğüme bağlanmasını sağlıyoruz.

Ayrıca her düğümde en fazla 100 karakter uzunluğunda bir dizgi (string) tutuyoruz. Dosyadaki her kelime bu dizginin içerisine yerleştirilecek.

Ardından klasik olarak dosya aşma işlemini yapıyoruz:

Yukarıdaki kodda görüldüğü üzere, iki dosya göstericisi (file pointer) tanımlanmıştır. Ayrıca dosyaların isimlerinin kullanıcıdan okunması için dosya1 ve dosya2 isimli iki dizgi (string) tanımlanarak kullanıcıdan dosya isimleri okunmuştur.

Okunan dosyaların açılamaması halinde hata mesajı verilerek çıkılmıştır.

Sıra bağlı listelerin (linked list) tanımlanmasında:

Yukarıdaki kodda, iki adet bağlı liste, daha önceden tanımladığımız dugum yapısı(struct) uygun olarak birer düğümü gösterecek şekilde hafızaya yerleştiriliyor. Ayrıca bağlı listemiz tek yönlü olduğu için (singular) listenin ilk elemanını kaybedemeyiz. Bu yüzden listenin üzerinde hareket edecek olan bir iter değişkeni tanımlıyoruz (literatürde iterator olarak geçer). Yani listenin son elemanını sürekli olarak iter, ilk elemanını ise liste ile başlayan değişkenler tutuyor. Şimdilik hafızadaki bağlı liste görüntüsü aşağıdaki şekildedir:

Yukarıdaki şekilde görüldüğü üzere, hafızada (RAM) iki adet liste, bu iki listenin içinde de birer adet boş düğüm (node) ve her düğümü gösteren ilave birer iter değişkeni bulunmaktadır.

Gelelim dosyadan okuyup listenin içerisine değerleri atan koda:

Kodumuz basitçe, dosyanın sonuna gelinip gelinmediğini kontrol eden bir while döngüsü içerisinde çalışıyor. Yani kodun 31 ve 41 numaralı satırlarında yapılan kontrol, ilgili dosya göstericisinin, dosya sonuna ulaşıp ulaşmadığını kontrol etmekte ve ulaşmadığı sürece döngü devam etmektedir.

Her iki döngü için de geçerli olmak üzere, bir geçici isimli dizgi (string) tanımlanarak dosyadan geçici olarak bu dizgiye okuma işlemi yapılmıştır. Ardından strcpy isimli string.h kütüphanesinde bulunan fonksiyon ile, okunan bu dizgi, o anda iter tarafından gösterilen düğüme konulur. İter göstericisinin sonraki düğümünde yer açılır ve iter bu yeni boş düğümü gösterir.

Örneğin dosyadan okunan ilk kelime “bilgisayar” olsun. Bu durumda bağlı liste yapısı aşağıdaki şekilde olacaktır:

Görüldüğü üzere, iter göstericisi tarafından gösterilen kutuya bir değer eklenip, yeni boş bir kutu, next ile gösterilen boş alanda açılmakta ardından iter bu boş kutuyu göstermektedir. Örneğin anlaşılması açısından bir de “kavramları” kelimesini okuduğumuzu düşünelim:

Yukarıda görüldüğü üzere her seferinde, iter tarafından gösterilen düğüme, okunan dizgi (string) yerleştirilmekte ve yeni iter tarafından gösterilen düğümün sonrasına (next) boş bir düğüm konulmakta ve iter bu yeni düğümü gösterilecek şekilde ilerletilmektedir.

Her şey bittikten sonra, bağlı listelere okunan değerleri ekrana bastırıyoruz:

Listelerin başını tutan liste1 ve liste2 isimli değişkenleri gösterecek şekilde iter değişkenlerini başa çekiyoruz. Buradaki amaç yine listenin ilk elemanını kaybetmeden bastırma işlemini yaptırmaktır. İter değişkenleri, listenin ilk elemanlarını gösterdikten sonra, gösterdikleri düğümlerin değerlerini ekrana basıp sonraki düğüme (next node) ilerletilmektedir.

Kodun ekran çıktısı aşağıdaki şekildedir:

Kodun tamamı ve yukarıdaki örnek çıktıda kullanılan iki dosyayı indirmek için taıklayınız.

Yorumlar

  1. Selin Güvenç

    Merhaba hocam, öncelikle böyle faydalı bir site yaptığınız için çok teşekkür ederim, çok işimize yarıyor.
    Benim bir sorum olacaktı. Bana bir dosyanın (.txt) adresi verilecek ve ben de bu dosyayı açıp okuyacağım. Bu dosyada makalelerin başlığı ve makalelerin içeriği (body kısmı) yer alacak. Daha sonra makaledeki bütün kelimeleri alıp alfabetik olarak bağlı liste oluşturacağım. Kelimeler alfabetik olarak birbirine bağlı olacak.
    Ayrıca her kelimenin bulunduğu dökümanlar da birbirine ve kelimeye bağlı olacak. Kısaca liste yapısı bu linkteki gibi olacak:

    (Fotoğraftaki her bir term kelimeleri temsil ediyor)
    Bir kelime arandığında bu kelimenin bulunduğu dökümanlar listelenecek, bir dökümanı sildiğimizde, kelimelerin yer aldığı dökümanlarda o dökümanı sileceğiz(eğer kelime sadece o dökümanda yer alıyorsa kelimeyi de listeden sileceğiz.). “Clear” komutuyla da listenin tamamını sileceğiz. Özellikle aldığımız alanları free yapmak önemli bir nokta. Arkadaşlarım vektör kullanarak da bağlı listeye gerek kalmadan yapabileceğimi söylediler ama ben işin içinden bir türlü çıkamadım.
    (Bu arada program C++ dilinde yazılıyor)
    Hangisi daha karlı olur karar veremedim. Eğer biraz yardımcı olursanız çok sevinirim hocam, kolay gelsin iyi günler.

  2. Selin Güvenç

    Hocam ayrıca yeni yeni farkettim ki eğer vektör kullanırsak alfabetik listede araya öge eklemek çok maliyetli oluyor anladığım kadarıyla. Ama list kullandığımda da ögeyi araya eklemek için arama algoritmasını hızlı bir şekilde yapmanın yolunu bulamıyorum, uygun konumu bulmak için listenin tüm elemanlarını aramak gerekiyor, en azından geleceği konuma kadar ki elemanları.. Eğer fikir verirseniz çok sevinirim, kolay gelsin.

  3. Şadi Evren ŞEKER Article Author

    Bahsettiğiniz konu, list of lists (listeler listesi olarak geçer) Yani bir bağlı listenin (linked list) her elamnını yine bir bağlı liste olması durumudur. Bu ara biraz yoğunluğum bulunuyor. Müsait bir vakitte istediğiniz kodu yazar sitede yayınlarım.

    ikinci yorumunuza gelince. yani bağlı listedeki ardışık erişim (sequential access) en büyük dezavantajdır. (örneğin sonuncu elemana erişmek için bütün listedeki elemanlara erişmeniz gerekir).

    Dizilerde ise bahsettiğiniz üzere araya ekleme problemi bulunur. Ayrıca dizilerde hafızada kaplanan yer sabit olarak belirtilmelidir. Dizinin boyutunun büyümesi RAM açısından tam bir kabustur.

    Vektörler nesne yönelimli ortamlarda bulunur (C++ veya JAVA gibi) ve C dilinde yoktur. Yapı olarak dinamik hafıza kullandıklarından bu problem yaşanmaz ve ayrıca indexer ismi verilen [] operatörü ile erişime de müsaittir. Dolayısıyla ardışık erişim gerekmez doğrudan erişilebilir (direct access). Bu açıdan vektörler hem bağlı listelerden (linked list) hem de dizilerden (Array) daha başarılı kabul edilebilir.

    Ancak sorunuzun tam cevabı için size ağaç kullanmanızı tavsiye ederim. Yani bağlı listenin her elemanını gösteren ve bağlı liste üzerinde çalışan bir ağaç en başarılı çözüm olacaktır.

    Benzer bir soruyu, bir sınavda sormuştum. Aşağıdaki sınav sorularından soru 2’nin çözümüne bakarsanız orada bulunan ağacın, yığını nasıl indekslediği bir fikir verebilir. Sizde benzer şekilde yığın yerine bağlı listeyi indeksleyeceksiniz. (http://www.bilgisayarkavramlari.com/2010/06/11/veriyapilari-ve-algoritmalar-final-imtihani-cozumu/ )

    Tekrar ediyorum, vakit bulunca kod ve konuyu anlatan bir yazı eklemeye çalışırım.

    başarılar

  4. Selin Güvenç

    Cevabınız için teşekkür ederim hocam. Peki vektörlerde kaydırma yapmadan listedeki gibi araya bir öge eklememiz mümkün mü acaba? Şundan dolayı soruyorum. Bir sitede aradan ögeyi siliyor erase işlemi sildiği ögeden sonraki göstericiyi çevirdiği için normal iteratore onu atıyor. Bunun benzerini araya eklemek için kullanabilir miyiz? Mesela tek elemanlı bir vektör oluşturup göstericiye bunun elamanının adresini atarız sonra da tek elemanlı göstericiye de asıl dizide sonraki elemanın adresini atarız.. Böyle düşündüm ama koda dökemedim.. Yanıtlarsanız çok sevinirim, kolay gelsin.

  5. ebru gürer

    soru: Aşağıdaki tablo, bir bağlı listenin hafızadaki yapısını temsil etmektedir. Bu tabloyu dikkate alarak;
    a). Bu tablonun hangi çeşit bağlı listeye örnek olabileceğini belirtiniz.
    b). Bu bağlı listeyi düğüm adreslerini ve bağlantı adreslerini göz önüne alarak grafiksel olarak gösteriniz.
    c). Bu bağlı listeye ilişkin düğüm yapısını C dili ile kodlayınız.

    Hafıza Adresi Deger Bağlantı Hafıza Adresi
    1007 Ali 1063
    ……. …….. ……….
    1024 Cem 1007
    ………. …….. ……….
    1062 Bora 1024
    1063 Ayşe 1062

    bu soru ile ilgili yardımcı oluesanız çok sevinirimmm….

  6. kenan

    hocam iyi akşamlar acaba struct içinde “biricik” bir değer oluşturup bunun içine veritabanı gibi birden fazla değişken atayıp bunu dosyaya nasıl işleyebiliriz acaba teşekkürler kolay gelsin..

  7. Şadi Evren ŞEKER Article Author

    Sorunuzu tam anlayamadım? biricik ile kast ettiğiniz unique mi? yani eşit iki değerin bulunmamasını mı kastediyorsunuz? bu durumda oluşumlar (structs) içerisinde böyle bir tanımlama yapamazsınız. Yani aynı veri değerine sahip iki oluşum (struct) bulunabilir bunu engelleyen bir durum C veya C++ dillerinde bulunmaz. Ancak kod ile bu tip kontrolleri yapabilirsiniz. Yani kodunuz en basit anlamda yeni bir değer aldığınızda (Dosyadan veya kullanıcıdan) bu değerin daha önce alınmamış bir değer olduğunu kontrol edebilir.

    başarılar

  8. kenan

    evet unique bir id numarası kullanıp bunun içine şarkı şarkıcı gibi değerler atayarak müzik store otomasyonu tarzında birşey yapıcam c dilinde, ama double list içinde tıkılıp kaldım hocam

  9. Şadi Evren ŞEKER Article Author

    cevabımda söylediğim üzere C dilinde oluşumlar (Structs) herhangi bir şekilde unique desteği bulundurmaz. Sizin bu kontrolü kodlayarak yapmanız gerekir. Yeni bir değer eklenirken daha önceden eklenmemiş olduğundan emin olmanız gerekir.

    başarılar

  10. malik

    hocam biz de Tc kimlik ile aldığımız kodları dosyaya kaydediyoruz daha sonra exe dosyasını kapatıp tekrar açtığımızda yazdığımız tc kimlik numaralarının aynısının dosyada olmaması gerekiyor. bunun için bize yol gösterebilir misiniz (tc yi alıyoruz 11 haneli olduğunu kontrol ediyoruz dosyaya da ekliyoruz fakat exe.yi tekrar çalıştırdığımızda aynı tc gerekli hatayı vermiyor )

  11. Şadi Evren ŞEKER Article Author

    Sorunuzu doğru anladıysam, tckimlik numaralarını dosyadan silmek istiyorsunuz ve programınız çalışmadığı zamanlarda dosyada tckimlik no bulunmasın istiyorsunuz?
    Eksik olan kısım diğer bilgiler? dosyada diğer bilgiler durucak ve sadece tckimlik no mu silinecek yoksa bütün bilgileri mi silmek istiyorsunuz?
    Şayet bütün bilgileri silmek istiyorsanız, basitçe dosyayı w modunda açıp, kaydetmeniz halinde dosya içeriği silinir.
    Şayet dosyadaki diğer bilgiler kalsın, yanlız tckimlik no silinsin istiyorsanız:
    İki yolla bunu yapabilirsiniz:
    1. dosyayı binary dosya olarak tutarsınız ve sadece ilgili tckimlikno yazılı olan karakterlerin üzerine gidip başka bir karakter (örneğin boşluk) basarak silersiniz.
    2. programınızı kapatmadan önce, dosyayı son bir kere işleyerek tckimlik no haricindeki verileri dosyada tutarsınız.

    Şayet sorunuzu doğru anladıysam aklıma ilk gelen yollar bunlar.

    başarılar

  12. Derin Aydın

    Çift yönlü bağlantılı liste ve yığın kullanarak iki soyut veri yapısı tanımlayıp ve programlarını yazan;listenin ve yığının her bir düğümünde öğrencinin numarası, adı, soyadı ve bölümü bilgileri tutulan programın kodunu nasıl olusturabilirz acaba? Yardımcı olursanız çok sevinirim.İLginize teşekkürler.

  13. Şadi Evren ŞEKER Article Author

    Sorunuza cevap olan örnek kodları zaten ilgili yazılarda yayınlamıştım:
    http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/
    http://www.bilgisayarkavramlari.com/2007/05/04/stack-yigin/
    yazılarından faydalanabilirsiniz. Tek yapmanız gereken sorunuzdaki şekilde öğrenci detaylarını tutan bir yapı (struct) oluşturmanız. Bunun için aşağıdaki adresten faydalanabilirsiniz:
    http://www.bilgisayarkavramlari.com/2007/11/08/olusum-composition-ve-struct-yapilar/
    Bu yazıda hem C gibi dillerdeki struct yapısını hem de nesne yönelimli yaklaşımları açıklamaya çalışmıştım.
    Umarım yardımcı olur.

    Başarılar

  14. yasemin bükeler

    çitf yonlu baglantılı liste ve yıgın kullanarak soyut veriyapısıtasarlayıp bunularal birer sınıf listesi olusturmam gerekiyor.ve bu yapı liste ve yığın temel işlemlerini içermeli.(ör:ekleme,listeletme,silme vb.)yardımcı olursanız cok sevininirim…

  15. Derin Aydın

    Değerli bilgileriniz için teşekkür ederim ama; ben o yapıyı struct kullanarak değil class kullanarak oluşturmak istiyorum.Ve aşağıdaki ödevimi ordaki bilgiler dahilinde tamamlayamadım.yardımcı olursanız çok teşekkür ederim.
    saygılar…

    Çift yönlü bağlantılı liste ve yığın kullanarak iki soyut veri yapısı tanımlayınız ve programlarını yapınız? Listenin ve yığının her bir düğümünde öğrencinin numarası, adı, soyadı ve bölümü bilgileri tutulacaktır.
    Tasarlamış olduğunuz liste kullanarak Veritabanı dersinin sınıf listesi oluşturulacaktır ve yığın kullanılarak Programlama dersinin sınıf listesi tutulacaktır. Yazacağınız program liste ve yığın temel işlemlerini içerecektir ve ek olarak aşağıda istenen fonksiyonlar olacaktır. Ana programda temel işlemleri içeren ve aşağıdaki istenenlere ulaşmak için kullanılabilecek bir menü oluşturunuz
    a. Her iki dersi de alan öğrencileri listeleyiniz?
    b. Sadece Programlama dersini alan öğrencileri listeleyiniz? (Bu öğrenciler Veritabanı dersini alıyor olmayacaklar.)
    c. Veritabanı dersi A ve B grubu olarak ikiye ayrılacaktır. A grubunda tek numaralı öğrenciler ve B grubunda çift numaralı öğrenciler olacaktır. Veritabanı dersini iki gruba ayırmak için gerekli listeleri oluşturunuz ve ayrı ayrı tutunuz?
    d. Programlama ve Veritabanı derslerinin en az birini alan ve bilgisayar mühendisliği bölümü öğrencisi olan öğrencileri listeleyiniz (Derslerde yandal ve çift anadal ile ders alan farklı bölüm öğrencileri bulunabilmektedir. )
    e. Programlama dersini alan öğrencilerin sayısını bulan fonksiyonu yazınız?

  16. Şadi Evren ŞEKER Article Author

    Yazdıklarınızdan anladığım kadarıyla, bir veri yapısında (çift yönlü bağlı liste veya stack) kullanmak ile ilgili sıkıntılarınız var. Sizinle paylaştığım bağlantıda oluşum (composition) kavramını sadece C dili için anlatmıştım.
    http://www.bilgisayarkavramlari.com/2007/11/08/olusum-composition-ve-struct-yapilar/
    İlgili yazıya, nesne yönelimli olarak oluşum kavramının nasıl yapılacağını açıklayan bir bölüm ekledim ve umarım yardımcı olur.

    başarılar

  17. deniz denizer

    Merhaba hocam böyle faydalı bir site yaptığınız için çok teşekkür ederim. Hocam bir struct yapı içerisinde adsoy,tcno,ögrno,sınıfı bulunup 20 ögrencili bir liste olusturup bu bilgiler sınıf.txt dosayasına atılacaktır.Girilen tc ye gore sıralama, tc ye gore arama ve farklı sınıflar bulunan listedeki secilen sınıftaki ogrencileri silen fonksiyonlar oluşturulacaktır.Bu soru ile ilgili yardımcı olursanız çok sevinirim şimdiden teşekkürler hocam…

  18. esad

    Hocam site için çok teşekkür ederim. Hocam deniz arkadaşımızın sorduğu sorudaki gibi bir struct yapı içerisindeki bilgiler dosyadan okunup visual studio da form ekranı ile nasıl yapılabilir.şimdiden teşekkürler…

  19. esad

    Hocam dosya işlemi olarak değilde listelerle visual studioda form ekranı üzerinden işlemler yapmak için ne yapmak gerekir?

  20. au

    hocam dosya organizasyonu ile ilgili bir sorum olucaktı sayısı belli olmayan ogrencileri dosyaya kayıt ekle ile alicaz degisken degiskenli olucak bu veriler ve bır veri silcez sil dedigimiz verinin yerini link list ile tutan ve tekrar kayıt ekle dedigimizde bu yerlere uygunsa kayıt yapmamızı saglayan bır kod sorucaktım.

  21. feyyaz

    merhaba benımde baglantılı lısteyle ılgılı bır sorum olacaktı sormek ıstedım.benım elımde aynı satırda ingilizce kelıme obeklerı var ve bunların karsısında da bıraz bosluk bıraktıktan sonra turkçe karsılıgı var benım amacım sadece ıngılızce kelıme yada kelıme gruplarını alıp bunları ascı kodunu hesaplamak ama ben bu ıngılızce kelıme guruplerını tek basına almaıyorum nasıl bır yol ızleye bılırım sımdıden tesekkurler.ornek
    access control key erişim denetim anahtarı(IBM)
    access control list erişim denetim listesi(IBM)
    access control lock erişim denetim kilidi(IBM)
    access list erişim listesi(IBM)
    access lock erişim kilidi(IBM)
    access number erişim numarsı(MAC)
    access privileges erişim ayrıcalıkları(MAC)
    access time erişim süresi(MAC)
    accessory donatı(MAC)(MS) aksesuvar(IBM)
    account file hesap kütüğü(IBM)
    accounting muhasebe(IBM)
    accumulate biriktirmek(IBM)
    accumulator biriktirici(IBM)
    accuracy doğruluk(IBM)
    acknowledge alındı, alındılama(MAC) alındı-(IBM)
    acknowledgement alındı bildirimi(IBM)
    acoustic akustik(MAC)(IBM)
    acoustic coupler akustik bağlayıcı(MAC)
    acoustic coupling akustik bağlama(MAC)
    acquire edinmek(IBM)
    acronym kısaltma(MAC) kısaad(IBM) kısa ad(MS)
    action işlem(IBM)
    action bar menü çubuğu(IBM)
    action bar pull-down çekmenü(IBM)

    gibi bunları txtden formatlı okuma yapmam lazım beceremedım

  22. Şadi Evren ŞEKER Article Author

    Anlayamadığım bir nokta, bu bahsettiğiniz yapıda, bağlı liste (linked list) nerede kullandığınızdır? Sorunuzun başında bağlı liste ile ilgili bir sorum var demişsiniz ama yazdıklarınızdan ve örneklerden bağlı liste ile ilgili bir durum göremedim, tam olarak kullandığınız yeri ve probleminizi açıklarsanız yardımcı olmaya çalışayım.

    Başarılar

  23. Tolga

    Meraba 🙂 dosyadan okuttuğum kelimeleri bir insert fonksiyonuyla bağlı listeye atıyorum ama bunu yaparken sözlük sırasına göre sıralamak istiyorum nasıl bir algoritma düzenlemeliyim?

  24. Şadi Evren ŞEKER Article Author

    bağlı listeye ekleme yaparken sıralı ekleme yapmanız yeterli. Dizgi (string) karşılaştırması için de, lexiconically (sözlük sırasına göre) karşılaştırma yapan strcmp fonksiyonunu kullanabilirsiniz.

    Sayılar için karşılaştırma yaparak sıralı bir şekilde bağlı listeye (linked list) ekleyen kod zaten yayınlanmış durumda, bunu dizgi karşılaştırmasına göre değiştirmeniz yeterli olacaktır. ilgili yazıya aşağıdaki bağlantıdan erişebilirsiniz:

    http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/

    Ayrıca strcmp fonksiyonu için aşağıdaki iki yazıya bakabilirsiniz:

    http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/
    http://www.bilgisayarkavramlari.com/2008/12/27/dizgi-karsilastirma-string-comparison/

    Başarılar

  25. hayriye sultan

    Rastgele verilerden oluşan bir bağlı listede kabarcık sıralama algoritması ile sıralama işlemi gerçekleştiren programı yazınız şeklinde bir ödevim var ben uğraştım netten de araştırdım parça parça programları buldum fakat bir bütün hale getiremedim. programlama derslerinde zorlanıyorum. açıkçası çok fazlada anlamıyorum. yardımcı olursanız sevinirim. şimdiden teşekkürler

  26. Ozan

    Hocam merhabalar size bir soru sormak isterim.şimdi c dili dizgi dizilerinde örneğin diyorki 5 tane isim giriniz ve bunlardan baş harfi ‘B’ ile başlayanları yazdırınız.bu soruyu nasıl yapmam gerekiyor hocam yani göstericileri de kullanarak anlatırsanız cok sevinirim.Şimdiden teşekkürler.

  27. Ozan

    hocam tekrar merhabalar ayrıca bir şey daha sormak isterim.şimdi siz şunu demek mi istiyorsunuz: bağlı listelerde(tek bağlı liste için bu soruda) iterator bir elemanı listeye yazdırdıktan sonra, bir tane boş bir liste daha olusturup ona gecer.
    yani soruda su kısımdan bahsedıyorum:
    srtcpy(iter1->kelime,gecici);
    iter1->next=(dugum*)malloc(sizeof(dugum));
    iter1=iter1->next;

  28. Ozan

    HOCAM BİR DE BU SORUDA
    iter1->next=NULL derken yani tum veri eklendi ve son dugume gelindi anlamını veriyorsak nicin iter2->next=NULL demedik ikincisinde.

  29. Şadi Evren ŞEKER Article Author

    Evet bahsettiğiniz kodu alıntılıyorum:

    srtcpy(iter1->kelime,gecici);
    iter1->next=(dugum*)malloc(sizeof(dugum));
    iter1=iter1->next;
    

    Burada ilk satırda iteratör tarafından gösterilen elemanın değeri, gecici isimli bir değişkene kopyalanmış (string kopyalaması)
    ardından ikinci satırda boş bir düğüm oluşturulmuş ve iteratörün next elemanına atanmış.
    son satırda da iteratör bu yeni düğümü gösterecek şekilde ayarlanmış.

    Burada, yeni bir liste oluşuyor ifadesinden çok yeni bir düğüm oluşturuyor demek daha doğru. Bu düğümler birleşerek de listeyi oluşturuyor. Düğümlerin birbirine bağlı olması gerekiyor buradaki next göstericisi de düğümler arasındaki bu bağlantıyı sağlıyor.

  30. Şadi Evren ŞEKER Article Author

    Dizgi sorunuzda geçen ifade dizgi dizisi (string array) bu yazı ile ilgili değil.

    Sorunuza cevap olması açısından hızlıca burada bir kod verebilirim ancak sorunuzu aşağıdaki yazıda sorarsanız daha güzel olur:

    http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/

    Koda gelince 5 dizgi istendiğine göre

    char *a[5];
    

    şeklinde bir dizi hazırlayacaksınız. Ardından döngü içerisinde bu diziye 5 dizgi okuyacaksınız.

    for(int i =0 ; i<5;i++)
      scanf("%s",a[5]);
    

    sonrada bunlardan "B" harfi ile başlayanları ekrana basacaksınız:

    for(int i = 0;i<5;i++)
       if(a[i][0] == 'B')
          printf("%s",a[i]);
    

    Başarılar

  31. Ozan

    hocam cok cok teşekkurler sayenizde normal sayı bile olsa nasıl bağlı listeye eklemem gerektiğini dediğiniz yere baktım ve oğrendim.bu arada kusura bakmayın cok soru soruyorum ancak ben daha 1.sınıfa yenı baslıcam ve c dilini bağlı listelere kadar calıstım ancak oraya gelene kadar bazı anlamadığım yerler ve soru tipleri oluyor onun için boyle soruyorum sureklı.

  32. Ozan

    hocam son yazdıımı kendım anladım onun yerıne baska bır sormak ıstıyorum iznininizle peki silme islemini nasıl yapıcaz yanı mantığı ne.bu cok kucuk bır ornekle acıklayablır misiniz?

  33. AHMET

    merhabalar hocam ben bi dosyadan en fazla 3 karakterli aratma yapıp o arattığım hecenin kac tane olduğunu bulmamı sğlıcak bi yapı oluşturmaya calışıyorum.bunun için her harften sonra gelen heceleri tutmam gerekio nasıl bi sistem kuracağımı bulamadım yardımcı olursunuz sevinirim

  34. ahmet

    merhaba hocam veri yapılarında klavyeden isimler girip isim sırasına göre sıralayıp dosyaya yazacak olan program nasıl bı yol ızlemelıyım tesekurler..

  35. Şadi Evren ŞEKER Article Author

    Sanırım en kolay yol, sıralı bir bağlı liste tutup sonra dosyay dökmek olacaktır. Bağlı listelerin anlatıldığı yazıda buna benzer bir kod da bulunuyordu sanırım oradan faydalanabilirsiniz.

  36. Emre A.

    Öncelikle sitenizi severek takip ediyorum,iyi ki varsınız hocam.Sitenizden baya bir şey öğrendiğimi belirtmek isterim.Benim sorum şu olacak.Ben .txt dosyasından isimleri okutup kendi oluşturduğum bağlı liste yapısına attım.Bağlı listeye attığım bilgileri int main() içinde değilde fonksiyon aracılığı ile yazdırmak istiyorum.Nedense, kaybetmemem gereken ve liste için tanımladığım ilk isimli değişkenim NULL oluyor.Fonksiyonum şöyle;

          void listele(){
          son=ilk;//örneğinizdeki liste1 yerine ilk,iter1 yerine son değişkenlerini kullandım.
          while(son!=NULL){
               printf("%sn",son->isim); // kelime değişkeninin ismi yerine isim değişkenini kullandım.
               son=son->sonra;           
                          }
          getch();
         }
    

    Nedense listedeki bilgileri fonksiyon ile yazdıramıyorum.int main() içinde yazdırabiliyorum,sorun yok onda.Yardım ederseniz sevinirim.Teşekkürler şimdiden.

  37. Şadi Evren ŞEKER Article Author

    Bahsettiğiniz durum, bağlı listenin fonksiyona doğru olarak geçirilmediğinde yaşanan emareleri gösteriyor.

    İki alternatif çözüm önerilebilir. Birincisi bağlı listenin ilk elemanını gösteren değişkenin bütün kodda geçerli kılınmasıdır (global variable) diğeri ise bu değişkenin fonksiyona parametre olarak geçirilmesidir.

    typedef dugum ...
    
    dugum liste;
    
    void listele()...
    
    int main()...
    

    şeklinde bütün kodda geçerli bir liste değişkeni tanımlanabilir.

    typedef dugum ...
    
    void listele(dugum &liste){
      dugum *ilk = liste;
      . ..
    }
    
    int main(){
    ...
      listele(iter1);
    ...
    }
    

    Şeklinde de parametre geçirme işlemini yapabilirsiniz.

  38. xoxo_jo

    merhaba hocam bağlı listeye sıralı ve char dizi olarak eleman eklemeye çalışıyorum

    void Ekle(Listele *gecici){ 
     
         if(ilk->ad == NULL){//ilk isim eklenmesi ise;
            ilk = gecici;
            son = gecici;
            son->sonraki = NULL;
            onceki = NULL;
            digeri = NULL;
         }
         else{
               if(strcmp(gecici->ad,ilk->ad)sonraki=onceki;
               }
               if(strcmp(gecici->ad,son->ad)>0){//sondakinden buyukse;
                       onceki = son;                             
                       son = gecici; 
                       son->sonraki = NULL;
                       onceki->sonraki = son;    //**Bu kısma kadar sorunsuz çalışıyor fakat diğer karşılaştrmaları yapmadığı için hepsini sıramayamıyor**\                             
               }
               if((strcmp(gecici->;ad,ilk->ad)&>0)&&(strcmp(gecici->ad,son->ad)ad,onceki->ad)>0) && (strcmp(gecici->ad,digeri->ad)sonraki = gecici;
                               gecici->sonraki = digeri;
                               break; 
                       }
                       onceki = onceki->sonraki;
                       digeri = digeri->sonraki;
                   }
               }
         }              
    }
    

    lütfen yardım eder misiniz?

  39. mehmet

    hocam merhaba,dosyadan verileri dizi olarak okuyabilir miyiz?(dosyadaki ifadeler dizi olarak tutulur mu?),yardımcı olabilir misiniz?

  40. Deniz

    Dosya örneğiniz için teşekkürler hocam ama ben benzer bir soruda iki farklı dosyayı tek bir bağlı listede tutarak işlem yapmak istiyorum örneğinizden yola çıkarak yapmaya çalıştım ama olmadı.Dosyalarımda verilerim 1#Ayşe#can şeklinde kayıtlı ve numaraya göre de bağlı listede listeleme yapması isteniyor.Sıralama kısmında da sıkıntı var.Yardımcı olursanız çok sevinirim.Teşekkürler.

  41. Şadi Evren ŞEKER Article Author

    Tam olarak sorunuzu anlayamadım ama mesela iki dosya üzerinde sıralama istiyorsanız ya ikisi için ayrı ayrı kodu çalıştırın (birini açıp çalıştırıp kapatıp diğerini açmak şekilnde) ya da iki dosyayı birleştirerek yapın (iki dosyayı tek dosya haline de getirebilirsiniz).

    1. seda aktan

      iyi günler hocam. Benimde size bir sorum olacaktı.
      örneğin elimizde bir txt dosyası var. dosyanın her satırında arada boşluklarla önce komut sonra girdiler yazıyor. klavyeden hiç bir komut ve girdi almıyoruz. Ve dosyadan satır satır sırayla alınan komut ve girdileri bağlı listeye aktaran, komutlara göre başa sona belirlenen sıraya ekleme yapan program kodu konusunda yardımcı olabilir misiniz?

  42. Asude

    Hocam iyi akşamlar çok basit bi soru ama uğraşıp yapamadım yardım ederseniz sevinirim Elemanları Personel isimlerinden oluşan dairesel bağlı liste üzerinde aşağıdaki işlemleri gerçekleştiren bir program yazınız. Gerçekleştirilecek işlemler;
    a)Personel ismi ekleme,
    b)Personel ismi silme.

  43. Zeynep Büşra

    Merhaba Hocam. Rica etsem aşağıda ki soruyu cevaplayabilir misiniz? Çok önemli benim için.

    Birisi bağlantılı liste ve diğeri ise bağlantılı liste kullanılarak yapılan yığını kullanarak iki soyut veri yapısı tanımlayınız ve programlarını (temel işlemler dahil) yapınız? Bağlantılı listenin ve yığının her bir düğümünde öğrencinin numarası, adı, soyadı ve bölümü bilgileri tutulacaktır.

  44. elif

    Merhaba,
    veri dosyasından okunan komutlara göre çıkış dosyası oluşturan bir program yapmak istiyorum C dilinde.
    Örneğin :
    giriş.dat dosyasında aşağıdaki komutlar yer alıcak.
    yaz: 10 a 1 \b 8 k 4 r 6 u // yaz komutu ile 10 tane a yazılacak mesela.
    sil: 4 a
    sonagit:
    yaz: 3 b 4 c 1 \n
    yaz: 2 s
    sonagit:
    dur:

    yazılan program ile aşağıdaki çıkış.dat dosyası olluşturulması gerekiyor.

    aaaaaa kkkkkkkk rrrr uuuuuubbbcccc
    ss

    Rica etsem yardımcı olabilir misiniz ? libdfr kütüphanesi ile yapmam gerekiyor .Ancak yaptığım işlemlerde hata aldım..Bilginiz varsa aktarırsanız sevirinim.

    ..

  45. İbrahim Halil

    Merhaba Hocam ;
    Link list ile kullanıcıdan aldığım bilgileri bir txt dosyasına yazdırmıştım.Kendime göre çok basit bir veri tabanı gibi bişi oluşturdum.Yazdığım kod sıralama bilgi alma bilgi silme gibi birçok şey yapabiliyorum.Şimdi yapmak istediğim ise veri kaydettiğim txt dosyalarını link listteki mantık gibi birbirine bağlamak.Bunu nasıl yapabilirm hocam ? Yardımcı olursanız çok sevinirim.

Bir cevap yazın

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