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