İ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
Yorum Gönder