Queue (Kuyruk)

İstersen buraya tıklayarak açıklamalı queue kodlarını indirebilirsin.

#include <stdio.h>
#include <stdlib.h>

/**
* Kuyruk yapısı
* @author Yunus Emre AK
*/


typedef struct kuy{
int veri;

struct kuy *arkasindaki;

}Dugum;

/*
* Kuyruk yapısı FIFO (ilk giren, ilk çıkar) mantığıyla çalıştığı için;
* -> Veriler silinirken "en önden" silinir.
* -> Veriler eklenirken "en arkaya" eklenir.
*
* Pide kuyruğu şeklinde ifade edilebilir.
*
* (en arka) (en ön)
* |--------------->
*
* Başlangıçta en ön ve en arka birbirine eşit ve NULL(boşluk / hiç) olur.
*/

Dugum *enOn = NULL;
Dugum *enArka = NULL;

/*
* Kuyruğa eleman ekleme
* Hatırlatma: Veriler eklenirken "en arkaya" eklenir.
* Not: Fonksiyon ismi "insert" olduğunda, kütüphanelerde kayılı olan insert fonksiyonları ile
* karışmakta, bu sebele adı "myInsert" olarak tanımlanmıştır.
*/

void myInsert(int veri){
// Öncelikle alınan veri için yeni bir düğüm oluşturuyoruz.
Dugum *yeni = (Dugum*)malloc(sizeof(Dugum));

yeni->veri = veri;

/**
* Eğer kuyrukda dugum yoksa en ön ve en arka yeni oluşturulan düğüme
* eşit olur. Bu düğümlerin arkasında düğüm olmadığı için arkasına NULL atanır.
*/

if(enOn == NULL){
enOn = yeni;
enOn->arkasindaki = NULL;

enArka = enOn;
}

// Kuyrukta zaten düğüm varsa.
else{
// Verilere eklenirken en arkaya ekleniyor.
enArka->arkasindaki = yeni;

// Eklenen yeni düğüm, en arkadaki eleman olduğu için en arkaya düğüm atanır.
enArka = yeni;
// En arkanın arkasında eleman olmayacağı için, arkasına NULL atanır.
enArka->arkasindaki = NULL;
}

}

/* Veriler çıkartılırken en baştan çıkartılır.
*
* Not: Fonksiyon ismi "remove" olduğunda, kütüphanelerde kayılı olan remove fonksiyonları ile
* karışmakta, bu sebele adı "myRemove" olarak tanımlanmıştır.
*/

int myRemove(){
/* Öncelikle kuyruğumuzdaki elemanları kontrol ediyoruz, eleman yoksa işlem
* işlem olmaz. */

if(enOn == NULL){
printf("\nVeri olmadigi icin veri silme basarisiz!");

// Hata kodu
return -1;
}

/* En öndeki düğümü tutan pointeri kaybetmemek için gecici bir pointer oluşturuyoruz.
* bu sayede düğüm silindikten sonra, hafızada ayrılan yeri de serbest bırakabileceğiz.
*/

Dugum *gecici = enOn;

// Gecici düğüm, en öndeki (silinen) düğüm olduğu için silinen veriyi saklıyoruz.
int veri = gecici->veri;

/* En öndeki düğümü arkasındakine atadığımız takdirde, son düğüm kuyruktan kopacak
* ve serbest halde kalacak.
*/

enOn = enOn->arkasindaki;

printf("\nSilinen veri: %d", veri);

// Serbest kalan gecici düğüm için ayrılan hafizayı da serbest bırakıyoruz.
free(gecici);

return veri;
}

// Fonksiyon isim sorunu olmamasi adina, "myDisplay" yazılmıştır.
void myDisplay(){
// En öndeki düğüm adresini kaybetmemek için gezici bir düğüm tanımlıyoruz
Dugum *gezici = enOn;

if(gezici == NULL)
printf("\n Veri bulunmamakta!");

// Görsellik amaçlı.
printf("\n-----------");

/* En önden başlayıp, en arkadaki düğüme kadar bakıyoruz. En arka düğüme geldiğimizde
* arkası olmadığı için NULL'a denk geleceğiz ve döngü sona erecek.
*/

while(gezici != NULL){
printf("\nVeriler: %d", gezici->veri);

// Bir arkadaki düğüme geçiyoruz.
gezici = gezici->arkasindaki;
}

// Görsellik amaçlı.
printf("\n-----------");
}

int main(){
int i = 0;

for(i; i < 20; i+=2){
myInsert(i);
myDisplay();
}

for(i = 0; i < 10; i++){
printf("\n%d verisi cikarildi.", myRemove());
myDisplay();
}

}
Veri Yapıları

Yorumlar

Popüler Yayınlar