Post on 10-Mar-2020
BAĞLAÇLI LİSTELERLINKED LISTSLINKED LISTS
Liste
Günlük yaşamda listeler pek çok yerde kullanılmaktadır. Alışveriş listeleri, adres listeleri, davetli listeleri gibi. Bilgisayar programlarında da listeler yararlı ve yaygın olarak kullanılan veri yapılarındandırlar.
Veri Yapıları : 07 Bağlaçlı Listeler 2
Programlama açısından liste, aralarında doğrusal ilişki olan veriler topluluğu olarak görülebilir. Yığıt ve kuyrukların genişletilmesi yani üzerlerindeki sınırlamaların kaldırılması ile liste yapısına ulaşılır. Veri yapılarında değişik biçimlerde listeler kullanılmakta ve üzerlerinde değişik işlemler yapılmaktadır.
Listeler Üzerindeki Bazı İşlemler ve Tanımları
1. EmptyList(List) : returns Boolean
Listenin boş olup olmadığını belirleyen fonksiyon. 2. FullList(List) : returns Boolean
Listenin dolu olup olmadığını belirleyen fonksiyon. 3. LengthList(List) : returns integer
Listedeki eleman sayısını bulan fonksiyon.4. InsertElement(List, NewElement)
Veri Yapıları : 07 Bağlaçlı Listeler 3
4. InsertElement(List, NewElement)
Listeye yeni bir eleman ekleyen fonksiyon.5. DeleteElement(List, Element)
Listeden bir elemanı arayarak çıkartan fonksiyon.6. DestroyList(List)
Listedeki tüm elemanları silerek boş liste bırakan fonksiyon.7. GetNextItem(List, Element)
Etkin elemandan bir sonrakini döndüren fonksiyon8. RetrieveElement(List, Element, Found)
Elemanın listede olup olmadığını bulan ve döndüren fonksiyon
Bağlaçlı (Bağlı) Listeler
Kendi tipindeki bir yapıyı gösteren bir işaretçi üyesine sahipyapılara self-referential structures adı verilir.
Örnek olarak :struct node {
char info;
Veri Yapıları : 07 Bağlaçlı Listeler 4
char info;struct node *next; };
yapısı, info adlı karakter tipli bilgi elemanının yanında, birdüğüm yapısında bir bellek bölgesine işaret eden next işaretçisinesahiptir. Bu tür yapıların arka arkaya birbirine bağlanmasımantığı listelerde, yığıtlarda, kuyruklarda ve ağaçlarda oldukçayararlıdır.
Doğrusal Bağlaçlı Liste
Listedeki her düğümde bir sonraki düğümün adresinin tutulduğu veri yapısı(doğrusal) bağlı liste olarak adlandırılır. Listenin her bir elemanına düğüm(node) adı verilir. Düğümler, bilgi ve bağ (adres) sahalarından oluşmaktadırlar.Bağ sahalarında işaretçiler kullanılmaktadır. Listenin ilk elemanına dışarıdanbir işaretçi (list) ile erişilmektedir. Diğer düğümlere de bağlar yardımı ileulaşılabilmektedir. Son düğümün sonraki adres (next) sahası NULL değeriniiçerir. NULL bağı, liste sonunu belirtir. Elemanı olmayan liste boş liste olarakadlandırılır. Herhangi bir boyuta dinamik olarak genişletilip daraltılabilen yığıt
Veri Yapıları : 07 Bağlaçlı Listeler 5
adlandırılır. Herhangi bir boyuta dinamik olarak genişletilip daraltılabilen yığıtve kuyrukların gerçekleştirimi bağlı listeler üzerinde yapılmaktadır.
Yığıt ve Kuyruk Gerçekleştiriminde Bağlaçlı Listeler
Yığıtlarda ve kuyrukların gerçekleştiriminde sıralıbellek kullanımının (dizi) en büyük dezavantajı, hiçkullanılmasa veya az kullanılsa bile sabit miktardakibelleğin bu yapılara ayrılmış olarak tutulmasıdır. Ayrıcasabit bellek miktarı aşıldığında da taşma oluşması ve
Veri Yapıları : 07 Bağlaçlı Listeler 6
sabit bellek miktarı aşıldığında da taşma oluşması veeleman ekleme işleminin yapılamamasıdır. Bağlı listelerüzerinde gerçekleştirildiklerinde ise bu problemlerortadan kalkmaktadır. Bellekten sadece gerektiği kadaryer ayrılmakta ve bellek boyutu bitene kadar bu yapılaraekleme işlemi yapılabilmektedir.
Bağlaçlı Liste Veri Yapısı ve Avantajı
Bağlı listeler, başka veri yapılarının gerçekleştiriminde kullanılabildikleri gibikendileri de veri yapısıdırlar. Bağlı listelerde elemanların eklenme veçıkarılmasında bir sınırlama yoktur. Başa ve sona olduğu gibi araya da elemaneklenebilir; baştan ve sondan olduğu gibi ortadan da eleman çıkarılabilir. Bağlıliste dolaşılarak herhangi bir elemanına erişilebilir. Bir bağlı listenin n.elemanına erişmek için n tane işlem yapmak yani kendinden önceki (n-1)eleman üzerinden geçmek gerekmektedir. Elemanların bellekteki yerleridizilerdeki gibi sıralı olmadığından elemanlar ve sıraları ile yerleştikleri bellek
Veri Yapıları : 07 Bağlaçlı Listeler 7
dizilerdeki gibi sıralı olmadığından elemanlar ve sıraları ile yerleştikleri bellekbölgeleri arasında bir ilişki yoktur.
Bağlı listelerin diziler üzerine avantajı, bir grup eleman arasına elemaneklemede ve bir grup eleman arasından eleman çıkarmada ortaya çıkar.Dizilerde bir eleman silerken arada boşluk kalmasını engellemek içinilerisindeki (sağındaki) tüm elemanları bir geriye (sola) kaydırmak gerekir.Eleman eklemede de yer açmak için konulacağı yerdeki ve ilerisindekielemanları bir ileriye (sağa) kaydırmak gerekecektir. Kaç tane elemanın yerdeğiştireceği (birer kaydırılacağı) dizi boyutuna bağlı olarak ve eklenecekelemanın yerine bağlı olarak değişecektir. Bağlı listelerde ise eleman eklemeve çıkarma için yapılan iş liste boyutundan bağımsızdır.
Yığıtın Bağlaçlı Liste GösterimiEleman Ekleme ve Çıkarma
Veri Yapıları : 07 Bağlaçlı Listeler 8
Kuyrukların Bağlaçlı Liste GösterimiEleman Ekleme ve Çıkarma
Veri Yapıları : 07 Bağlaçlı Listeler 9
Öncelik Kuyruklarının Bağlaçlı Liste Gerçekleştirimi
• Yöntem 1 : (Sıralı liste tutularak) (Artan sıralı öncelik kuyruğunda)Eleman ekleme, eklenecek elemanın listeyi sıralı tutacak şekilde liste üzerinde
dolaşılarak araya eklenmesi şeklinde gerçekleştirilir. Eleman çıkarma da,listenin ilk elemanının (en küçük değer) çıkarılması ile gerçekleştirilir.
• Yöntem 2 : (Sıralı olmayan liste) (Artan sıralı öncelik kuyruğunda)
Veri Yapıları : 07 Bağlaçlı Listeler 10
• Yöntem 2 : (Sıralı olmayan liste) (Artan sıralı öncelik kuyruğunda)Eleman ekleme kuyruğun herhangi bir yerine yapılabilir. Eleman çıkarma ise
eleman bulunana kadar tüm kuyruk boyunca dolaşılması ve elemanınlisteden çıkarılması ile gerçekleştirilir.
Öncelik kuyruklarında listelerin sıralanarak kullanımı sıralanmadankullanımına göre daha etkindir.
Diğer Bazı Liste Yapıları
• Dairesel Bağlaçlı ListelerCircular Linked Lists
• Çift Bağlaçlı Listeler
Veri Yapıları : 07 Bağlaçlı Listeler 11
• Çift Bağlaçlı ListelerDoubly Linked Lists
• Dairesel Çift Bağlaçlı ListelerCircular Doubly Linked Lists
Dairesel Bağlaçlı Listeler
Tüm düğümlerin bir sonraki düğümü gösterdiği bağlılistelerdir. Son elemanın bağı NULL değildir; ilkelemanı gösterir. Böylece dairesel bir yapı oluşur.
Veri Yapıları : 07 Bağlaçlı Listeler 12
elemanı gösterir. Böylece dairesel bir yapı oluşur.
Çift Bağlaçlı Listeler
Her düğümü iki bağ içerdiği bağlı listelerdir. İlkbağ kendinden önceki düğümü gösterirkenikincisi de kendinden sonraki düğümü gösterir.Çift bağlı listelerde, tek bağlı listelerdeki geriye
Veri Yapıları : 07 Bağlaçlı Listeler 13
Çift bağlı listelerde, tek bağlı listelerdeki geriyedoğru listeleme ve dolaşmadaki zorluklarortadan kalkar.
Dairesel Çift Bağlaçlı Listeler
Hem dairesellik hem de çift bağlılık özelliklerinesahip listelerdir. İlk düğümden önceki düğümson, son düğümden sonraki düğüm de ilkdüğümdür.
Veri Yapıları : 07 Bağlaçlı Listeler 14
düğümdür.
Java Programlama Dilinde Bağlaçlı Liste Örneği ve Kullanımı
Bağlaçlı Liste Düğüm Yapısı ve Sınıfı
class Dugum
{
public int veri; // değişik tiplerde çoğaltılabilir
public Dugum sonraki; // sonraki düğümün referansı (adresi)
Veri Yapıları : 07 Bağlaçlı Listeler 15
public Dugum sonraki; // sonraki düğümün referansı (adresi)
public Dugum(int gelenVeri) // Yapıcı metot
{ veri = gelenVeri; } // Düğüm yaratılırken değerini
// aktarır
public void yazdir() // Düğümün verisini yazdırır
{ System.out.print(" "+veri); }
}
Bağlaçlı Liste Yapısı ve Sınıfı
class BListe{// Listenin ilk düğümünün adresini tutar
public void listele(){ // Bağlı Listeyi Baştan Sona
Listeler
Veri Yapıları : 07 Bağlaçlı Listeler 16
// Listenin ilk düğümünün adresini tutarprivate Dugum bas;
public BListe() // Bir BListe nesnesi{ bas = null; } // boş liste olarak açılır.
ListelerSystem.out.println();System.out.print("Bastan Sona Liste : ");
Dugum etkin = bas;while(etkin!=null){ etkin.yazdir(); etkin=etkin.sonraki; }
}
Bağlaçlı Liste Metotları//Listede anahtar değerini bulurpublic Dugum bul(int anahtar){
Dugum etkin = bas;while(etkin.veri != anahtar){if(etkin.sonraki==null)
return null;
public Dugum sil(int anahtar){ // Verilen anahtar değerindeki düğümü siler
Dugum etkin = bas;Dugum onceki = bas;
while(etkin.veri!=anahtar){if(etkin.sonraki==null)
Veri Yapıları : 07 Bağlaçlı Listeler 17
return null;else
etkin = etkin.sonraki; };return etkin;
}
public void basaEkle(int yeniEleman){ // Liste başına eleman ekler
Dugum yeniDugum = new Dugum(yeniEleman);
yeniDugum.sonraki = bas;bas = yeniDugum;
}
if(etkin.sonraki==null)return null;
else{ onceki = etkin; etkin = etkin.sonraki; }
}
if(etkin==bas)bas = bas.sonraki;
elseonceki.sonraki = etkin.sonraki;
return etkin;}
}
BListe sınıfını kullanarak bir bağlaçlı liste oluşturan ve test eden sınıf
class BListeTest
{
public static void main(String args[])
{
// liste adlı bir bağlı liste nesnesi yaratır
BListe liste = new BListe();
liste.basaEkle(9);
Ekran Çıktısı : // Bastan Sona Liste : 1 2 3 4 5 6 7 8 9// 5 Bulundu// Bastan Sona Liste : 1 2 3 4 6 7 8 9
Ekran Çıktısı : // Bastan Sona Liste : 1 2 3 4 5 6 7 8 9// 5 Bulundu// Bastan Sona Liste : 1 2 3 4 6 7 8 9
Veri Yapıları : 07 Bağlaçlı Listeler 18
for(int i=8; i>=1; --i) liste.basaEkle(i);
liste.listele();
int deger = 5;
Dugum d = liste.bul(deger);
if(d==null)
System.out.println("\n"+deger+" Listede Yok");
else
System.out.println("\n"+deger+" Bulundu");
Dugum s = liste.sil(5);
liste.listele();
}
}
Alıştırmalar
• Tamsayı elemanlardan oluşan bir bağlaçlı liste sınıfına,elemanları küçükten büyüğe sıralı tutacak şekilde elemanekleyen “ekle” metodunu yazınız.
• Aynı metodun listeyi büyükten küçüğe sıralı tutacak sürümünüyazınız.
Veri Yapıları : 07 Bağlaçlı Listeler 19
yazınız.
• Tamsayı elemanlardan oluşan bir çift bağlaçlı liste sınıfı ilemetotlarını (listele, ara, ekle, sil, güncelle) yazınız.
• Yolcu (ad, soyad, yas) nesnelerinden oluşan, ada göre sıralı birtek bağlaçlı liste sınıfını ve listele, ara (ada göre), ekle, sil vegüncelle metotlarını yazınız.
Java’daki Hazır LinkedList sınıfının kullanımı
import java.util.*;
public class LinkedListExample{
public static void main(String args[]){
LinkedList <Integer> liste = new LinkedList<Integer>();
// İlk eleman olarak 15 değerini eklemeliste.addFirst(15); listele(liste); // Üçüncü Konuma (2. indise) 25 değerinin eklenmesiliste.add(2,25); listele(liste);
}
public static void listele(LinkedList<Integer> liste){
Veri Yapıları : 07 Bağlaçlı Listeler 20
int size;Iterator iterator;
// Listeye Eleman Eklemeliste.add(5);liste.add(7);liste.add(3);liste.add(4);size = liste.size();// Listenin dolaşılmasıSystem.out.print( "Elemanlar: "); iterator = liste.iterator(); while (iterator.hasNext()){
System.out.print(iterator.next()+" "); }System.out.println();
{Iterator iterator;iterator = liste.iterator(); while (iterator.hasNext()){ System.out.print(iterator.next()+" "); }System.out.println();
}
}
Elemanlar: 5 7 3 4
15 5 7 3 4
15 5 25 7 3 4
Java’daki Hazır LinkedList sınıfının kullanımı - Eleman Silme (Devam)
int sonEleman = liste.removeLast(); listele(liste);
System.out.println("Son Eleman : " + sonEleman);
int ikinci = liste.remove(1);
Veri Yapıları : 07 Bağlaçlı Listeler 21
System.out.println("İkinci konumdan silinen eleman : " + ikinci);
Son Eleman : 4¦kinci konumdan silinen eleman : 5