8 - Kuyruk İşlemleri ve Örnekleri
2026
struct Node, head, tail)enqueue (sonaEkle) İşlemi ÖrneğiBu dersin sonunda şunları yapabiliyor olmanız beklenir:
dequeue, peek ve isEmpty işlemlerinin ne yaptığını açıklamak,head hem tail güncellenmesi gerektiğini görmek,Geçen hafta kuyruğun mantığını ve enqueue işlemini gördük.
Bu hafta odak noktamız şudur:
Kuyruktan güvenli şekilde eleman çıkarmak ve kuyruğun durumunu doğru takip etmek.
tail değerini unutmak olur#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// Düğüm yapısı
struct Node {
int veri;
struct Node *sonraki;
};
struct Node *head = NULL; // Kuyruğun başı (çıkarılacak eleman)
struct Node *tail = NULL; // Kuyruğun sonu (eklenen eleman)
void enqueue(int sayi) {
struct Node *yeniDugum = malloc(sizeof(struct Node));
if (yeniDugum == NULL) {
printf("Hata: Bellek ayrılamadi!\n");
return;
}
yeniDugum->veri = sayi;
yeniDugum->sonraki = NULL;
if (tail == NULL) {
head = yeniDugum;
tail = yeniDugum;
} else {
tail->sonraki = yeniDugum;
tail = yeniDugum;
}
printf("%d kuyruğa eklendi.\n", sayi);
}head) bir eleman çıkarır.INT_MIN kullanacağız.dequeue Adım AdımBaşlangıç durumu:
dequeue() sonrası:
Çıkan eleman 10 olur. Yani kuyrukta çıkarma işlemi her zaman baştan yapılır.
dequeue Fonksiyonunda Mantıkhead düğümünü geçici işaretçide tut.head işaretçisini bir sonraki düğüme kaydır.tail = NULL yap.free ile serbest bırak.Tek elemanlı kuyrukta hem head hem tail aynı düğümü gösterir:
Bu elemanı dequeue() ile çıkarırsak kuyruk tamamen boşalır.
Bu yüzden yalnızca head = NULL yapmak yetmez; tail = NULL da yapılmalıdır.
head) elemanın verisini, elemanı çıkarmadan döndürür.INT_MIN) veya hata mesajı verir.Bu örneklerde peek() ve dequeue() içinde printf kullandık.
Bu, derste ne olduğunu daha rahat görmek için yararlı.
Ama gerçek programlarda veri yapısı fonksiyonları çoğu zaman sadece işlem yapar ve değer döndürür.
Ekrana yazdırma işi ise genellikle main gibi istemci kodda yapılır.
Bu yapı doğru yönetiliyorsa kuyruk boş olduğunda tail de zaten NULL olur.
Ama boşluk kontrolü için head == NULL yazmak yeterlidir.
INT_MIN Yaklaşımıdequeue() fonksiyonu normalde bir int değer döndürür.
Ama kuyruk boşsa, gerçekte döndürülecek bir eleman yoktur.
Bu durumda örnek olması için özel bir değer seçiyoruz: INT_MIN.
Bu yaklaşımın mantığı şudur:
Bu yöntem derste kullanışlıdır; ama bir sınırı vardır:
Eğer kuyrukta gerçekten INT_MIN değeri varsa, program şunu ayırt edemez:
Yani yöntem basittir; ama kusursuz değildir.
Bu karışıklığı önlemek için bazı programlarda veri ile hata bilgisi ayrı tutulur:
int dequeueSafe(int *sonuc) {
if (head == NULL) {
return 0;
}
struct Node *temp = head;
*sonuc = temp->veri;
head = head->sonraki;
if (head == NULL) {
tail = NULL;
}
free(temp);
return 1;
}Bu örnekte sonuc için geçerli bir adres verildiğini varsayıyoruz.
Burada:
return 1 -> işlem başarılı,return 0 -> kuyruk boş,*sonuc -> gerçekten çıkarılan veri.Böylece hata durumu ile gerçek veri birbirine karışmaz.
İşlemler:
enqueue(10)enqueue(20)enqueue(30)peek()dequeue()peek()dequeue()enqueue(40)Öğrencinin burada takip etmesi gereken şey değerler değil, yapının nasıl değiştiğidir.
main fonksiyonu)int main() {
printf("Başlangıçta kuyruk boş mu? %s\n", isEmpty() ? "Evet" : "Hayır");
enqueue(10);
enqueue(20);
enqueue(30);
printf("Kuyruk boş mu? %s\n", isEmpty() ? "Evet" : "Hayır");
peek();
dequeue();
peek();
dequeue();
enqueue(40);
peek();
dequeue();
dequeue();
printf("Son durumda kuyruk boş mu? %s\n", isEmpty() ? "Evet" : "Hayır");
dequeue();
return 0;
}| İşlem | Kuyruğun durumu |
|---|---|
| başlangıç | boş |
enqueue(10) |
10 |
enqueue(20) |
10 -> 20 |
enqueue(30) |
10 -> 20 -> 30 |
dequeue() |
20 -> 30 |
enqueue(40) |
20 -> 30 -> 40 |
Bu tablo şunu görünür hale getirir:
peek() yapıyı değiştirmez,dequeue() baştaki elemanı çıkarır,dequeue sonrası eski düğümü free etmemek,tail = NULL güncellemesini unutmak,peek ile dequeue işlemini aynı şey sanmak,INT_MIN yaklaşımını her durumda güvenli zannetmek,https://gist.github.com/ecylmz/dd3b7086fc80582ccce7b09034275574
Bu bağlantıda, derste gördüğümüz enqueue, dequeue, peek ve isEmpty fonksiyonlarının tam hali birlikte yer alır.
peek() işlemi hangisini yapar?head = NULLtail = NULLhead = NULL ve tail = NULLhead = tailAşağıdaki işlem sırası uygulandıktan sonra, peek() hangi değeri döndürür?
enqueue(10)
enqueue(20)
dequeue()
enqueue(30)
peek()
102030dequeue fonksiyonu boş kuyruk durumunda INT_MIN döndürmek yerine void olsa ve sadece hata mesajı bassa nasıl olurdu? Avantaj/Dezavantajları nelerdir?