Veri Yapıları ve Programlama

5 - Bağlı Listeler (Linked Lists)

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2026

Neden Bağlı Listeye İhtiyaç Duyarız?

Bir dizide ortadaki bir konuma yeni bir eleman eklemek istediğinizde ne olur?

  • sonraki elemanların yeri kaydırılır,
  • bu işlem maliyet oluşturur,
  • dizi yapısı, verilerin ardışık bellekte tutulmasına dayanır.

Bağlı listeler bu probleme farklı bir yaklaşım sunar:

Veriler ardışık durmak zorunda değildir; düğümler birbirine işaretçilerle bağlanır.

Bu Derste Ne Öğreneceğiz?

Bu dersin sonunda şunları yapabiliyor olmanız beklenir:

  • Dizi ile bağlı liste arasındaki temel farkı yorumlamak
  • node, head ve next kavramlarını açıklamak
  • Bağlı listelerde neden doğrudan indeks erişimi olmadığını açıklamak
  • Tek, çift ve dairesel bağlı listeyi ayırt etmek
  • C dilinde temel bir bağlı liste yapısını okuyup anlamlandırmak

Önce Büyük Resim

Yapı Veriler bellekte nasıl durur? Erişim mantığı
Dizi Ardışık İndeks ile doğrudan
Bağlı liste Dağınık olabilir Bağlantıları takip ederek

Bu yapıyı anlamanın ana fikri şudur:

Bağlı listede veriye indeksle değil, bağlantıyı izleyerek ulaşırız.

Bağlı Liste ve Düğüm Mantığı

Bağlı liste, düğümlerin bağlantılarla bir araya geldiği bir veri yapısıdır.

Bir düğüm genellikle iki parçadan oluşur:

  1. veri
  2. bir sonraki düğümü gösteren işaretçi (next)

Bağlı Liste Nedir?

Her düğümün:

  • bir veri alanı,
  • bir sonraki düğümü gösteren bir işaretçi alanı

olduğu veri yapısına bağlı liste denir.

head Ne İşe Yarar?

  • head, listenin ilk düğümünü gösterir.
  • Listeye erişim genellikle head üzerinden başlar.
  • Eğer head == NULL ise liste boştur.
struct node *head = NULL;

Note

Bazı uygulamalarda son düğümü ayrıca göstermek için tail de tutulabilir. Ancak her bağlı listede tail olması zorunlu değildir.

En Kritik Fikir: Doğrudan Erişim Yok

Bağlı listede 5. elemana ulaşmak için:

  • ilk düğümden başlanır,
  • next alanı takip edilir,
  • adım adım ilerlenir.

Bu yüzden dizi gibi şunu yapamayız:

liste[4]

Çünkü bağlı liste, indeks tabanlı bir yapı değildir.

C Dilinde Düğüm Temsili

struct node {
  int data;
  struct node *next;
};

Burada:

  • data → saklanan veri
  • next → bir sonraki düğümü gösteren işaretçi

Sık hata

struct tanımının sonunda ; unutulmamalıdır.

Tek Yönlü Liste: Üç Düğümlü Kurulum

struct node *head = NULL;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;

one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));

Note

Gerçek programlarda malloc sonucunun NULL olup olmadığı kontrol edilmelidir.

Tek Yönlü Liste: Bağlantıları Kurma

one->data = 1;
two->data = 2;
three->data = 3;

one->next = two;
two->next = three;
three->next = NULL;

head = one;

Okunuşu:

head -> one -> two -> three -> NULL

Geçiş (Traversal) Nasıl Yapılır?

struct node *temp = head;

while (temp != NULL) {
  printf("%d\n", temp->data);
  temp = temp->next;
}

Bu kodun mantığı:

  • head’den başla
  • veriyi işle
  • next ile ilerle
  • NULL görünce dur

Tam dolaşım işlemi, düğümler tek tek ziyaret edildiği için genellikle \(O(n)\) maliyetlidir.

Neden Bazı Ekleme İşlemleri Hızlıdır?

Bağlı listede çoğu zaman verileri taşımayız; bağlantıları değiştiririz.

Başa ekleme mantığı şöyledir:

  1. yeni düğüm oluşturulur
  2. yeni->next = head yapılır
  3. head = yeni yapılır

Araya Ekleme Mantığı

Araya ekleme için doğru düğüm bulunduğunda:

  1. yeni->next = onceki->next
  2. onceki->next = yeni

Bu yüzden bağlı listede asıl maliyet çoğu zaman bağlantıyı kurmak değil, doğru yeri bulmaktır.

Avantajlar ve Dezavantajlar

Avantajlar

  • Boyutu çalışma anında büyüyüp küçülebilir.
  • Özellikle listenin başında ekleme ve silme işlemleri verimli olabilir.
  • Elemanlar bellekte ardışık olmak zorunda değildir.

Dezavantajlar

  • Doğrudan indeks erişimi yoktur.
  • Arama çoğunlukla sıralı ilerleme gerektirir.
  • Her düğüm ek bir işaretçi alanı tuttuğu için bellek maliyeti artar.

Zaman Karmaşıklığına Sezgisel Bakış

İşlem Dizi Tek bağlı liste
i. elemana erişim \(O(1)\) \(O(n)\)
Baştan ekleme \(O(n)\) \(O(1)\)
Baştan silme \(O(n)\) \(O(1)\)
Sonda ekleme Uygulamaya göre değişir tail yoksa \(O(n)\)
Arama \(O(n)\) \(O(n)\)

Note

Bu tablo, bağlı listenin neden bazı durumlarda diziye göre daha uygun olduğunu anlamak için önemlidir.

Tek Yönlü, Çift Yönlü, Dairesel

Bağlı listeler yalnızca tek bir biçimde bulunmaz.

  • Tek yönlü bağlı liste: her düğüm yalnızca sonraki düğümü bilir
  • Çift yönlü bağlı liste: her düğüm hem önceki hem sonraki düğümü bilir
  • Dairesel bağlı liste: son düğüm NULL yerine tekrar başlangıca bağlanır

Çift Yönlü Bağlı Liste

Her düğüm hem sonraki hem de önceki düğümü bilir.

Avantajı:

  • ileri ve geri dolaşım mümkündür

Bedeli:

  • her düğüm daha fazla bellek kullanır
  • bağlantıları güncellemek daha dikkat ister

Çift Yönlü Liste Düğümü

struct node {
  int data;
  struct node *next;
  struct node *prev;
};

Burada artık her düğüm iki bağlantı bilgisini birlikte taşır:

  • next
  • prev

Dairesel Bağlı Liste

Bu yapıda son düğüm NULL’ı değil, yeniden ilk düğümü gösterir.

Bu nedenle dolaşımda bitiş koşulu farklı düşünülmelidir.

Dairesel Yapıda Kritik Fark

Doğrusal listede:

... -> son -> NULL

Dairesel listede:

... -> son -> head

Kritik nokta

Bu yüzden “son düğüm her zaman NULL gösterir” ifadesi genel olarak doğru değildir. Bu ifade yalnızca doğrusal listeler için geçerlidir.

Bellek Yönetimi ve Sık Hatalar

  • malloc ile alınan bellek iş bittikten sonra free edilmelidir.
  • Aksi halde memory leak oluşur.
  • head işaretçisi kaybedilirse listenin geri kalanına erişim kaybolabilir.
  • Dairesel liste, doğrusal liste gibi dolaşılırsa sonsuz döngü oluşabilir.

Sık yapılan hatalar:

  1. struct tanımının sonundaki ; karakterini unutmak
  2. Son düğümün bağlantısını yanlış kurmak
  3. malloc sonrası kontrol yapmamak
  4. free etmeyi unutmak

Özet

  • Bağlı liste, düğümlerin bağlantılarla bir araya gelmesidir.
  • Her düğüm veri ve bağlantı bilgisi taşır.
  • Listeye erişim çoğunlukla head üzerinden başlar.
  • Bağlı listede doğrudan indeks erişimi yoktur.
  • Tek yönlü, çift yönlü ve dairesel türleri vardır.
  • Güçlü yanı esnek ekleme/silme, zayıf yanı sıralı erişimdir.

Çalışma Soruları

  • Neden bağlı listede liste[4] benzeri doğrudan erişim yapılamaz?
  • Tek bağlı liste ile çift bağlı liste arasında hangi işlemler açısından fark vardır?
  • tail tutulursa hangi işlemler hızlanabilir?
  • Dairesel bağlı listede sonsuz döngü oluşmaması için nasıl bir koşul yazılmalıdır?
  • Boş bir bağlı listeye ilk düğüm eklenirken head nasıl güncellenir?