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.
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.
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:
- Ekleme işlemini yapılacağı aralıktan önceki düğüme dolaşıcı tarafından gidilir.
- Yeni düğüm oluşturularak, sonrasına, dolaşıcının sonrası atanır.
- 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 bir öncelik sıralamalı dairesel bağlı liste kodunun açıklaması
- İki ayrı dosyanın içeriğini okuyup bağlı listeye koyan uygulama
- Veri Yapıları dersi sınav çözümü
- Filitreleme tipi fonksiyonlar
- Bindirme tipi fonksiyonlar
- Bağlı liste ile yığın (stack) kodlaması
- Dairesel Bağlı liste ile önceliğe sahip hasta takip kodlaması
Örnek Bağlı liste kodları:
- Basit bir bağlı liste örnek kodu 10 adet sayı ekleyerek ekrana basan kod
- Basit bir bağlantılı liste örnek kodu NULL kontrolü ile 10 adet sayı ekleyerek ekrana basan kod. Liste boyutu bilinmiyorken liste sonuna kadar gider.
- Bir bağlı listede arama yapan kod Arama sonucunda bulunna düğümün işaretcisini döndürür.
- Circular (dairesel) Bağlı liste Dairesel bağlı listeye 10 sayı ekleyerek ekrana basar.
- Çift Bağlı liste Çift yönlü bağlı listeye 10 sayı ekleyerek listenin ters bağlantısı üzerinden listeyi ters basan kod.
- Çift Bağlı Dairesel listeye ekleme ve listeden silme yapan fonksiyon kodları.
- Dairesel Tek yönlü bağlı listeye ekleme yapan, sıralı ekleme yapan ve silen kod.
- “Visual Studio 2008 express edition” ile dairesel tek yönlü bağlı liste kodu
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?
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.
Sadi Bey circular tek yönlü bağlı listeden eleman silen kodu bu bolumde yayinlayabilirmisiniz ?
Ç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
Kodun nasıl derlenip çalıştırılacağı aşağıdaki yazıda açıklanıyor:
http://www.bilgisayarkavramlari.com/2008/10/06/c-ile-kodlama/
Belki karşılaştığınız problem veya hataları yazarsanız daha fazla yardımcı olabiliriz. Kodların tamamı Dev-CPP ile test edilmiş ve çalışan kodlardır.
başarılar
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
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!!! ??
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?
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
merhaba bana circular list ile ilgili bi uygulama lazım ekleme silme arama kodlarınıda içeren yardımcı olabilir misiniz?
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
visual studio 2008 ile çalışıyorum ben
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
dediğiniz gibi ben c# da bu yapıyı oluşturdum, pointer kullanmadım. Açıkçası pointer la bana daha karmaşık gibi geldi…
http://www.serefakyuz.com
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
Çok faydalı bir yazı olmuş teşekkürler…
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
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
İ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
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
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?
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)
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:
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
Hocam int tutan iki ayrı bağıl listedeki elemenları toplamak istiyorum yani şöyle
l1=256397
l2=5463;
l1+l2 toplamlarını nasıl bulabilirim.
java dilinde yazıyorum listedeki elemanları toplamaya çalışıyorum fakat uzun olan listedeki elemanları liste3 e atmıyor bunu nasıl halledeblirim ….?
Anladım, aşağıdaki şekilde deneyin:
çö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
Başarılar
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
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
tamam sağ olun o işimi görür gibi iyi çalışmalar
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…. 🙂
hocam sayenizde dosya icinden bağlı listenin her bir düğümüne eleman eklemeyi anladım ancak
örneğin bu bir dosya değilde:
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.
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.
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.
İlk elemanı kod içerisinden elle ekledikten sonra yeni elemanları döngü ile ekleyebilirdiniz. Boş bir liste oluşturmak için:
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:
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.
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
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.
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
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
hocam herbir düğümde ogrnci numarası adı soyadı bölümü bilgileri bulunacak.
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)
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.
Bakın arama kısmını anlatmaya çalışayım. Arama için aşağıdaki find fonksiyonunu kodlamışsınız:
Ş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:
Ş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
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();
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();
}
}
}
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
Tekrar merhabalar Hocam,
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
İş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
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…
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
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ı…
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.
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
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
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.
Olabilir tabi. Bir final sınavında bir zamanlar böyle bir soru hazırlarken bir çizim yapmıştım. Bir bakarsanız belki fikir verebilir.
http://www.sadievrenseker.com/datastr/final_cozum.htm
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?
//ogr1 no:,,,,
//ogr1isim,,,,
//ogr2 no,,
//ogr2 isim,,,
tek yonlu baglantılı linked list ve stack kullanılması nasıl.
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,
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;
}
Hocam Merhaba benim size bir sorum olacakti bağlı liste kodlarını yazarken fonksiyonlarda neden node * dedik int diyemez miydik yardimci olursaniz sevinirim
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
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
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;
}
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.