Home / Veri Yapıları / Kuyruk Veri Yapısı – (Bağlı Liste İle)

Kuyruk Veri Yapısı – (Bağlı Liste İle)

Daha önde dizi ile kuyruk veri yapısı işlemlerini görmüştük. Bu yazımızda bağlı liste ile kuyruk oluşturma işlemine bakacağız. Aslında -bunu daha önce söylemiş olsam da, kuyruk veri yapısı tam da bağlı liste mantığına uygun bir biçimdedir. Bağlı liste ile bunu hazırlamak işimizi zorlaştırmamakta, tam aksine işimizi kolaylaştırmaktadır.

Bağlı liste oluşturma işleminde öncelikli olarak bir tane start düğümü oluşturup ardından gelen düğümleri sıra ile birbirlerini “next” pointer’ı ile işaret etmekteydik. Kuyruk işlemi de tıpkı böyle, bir tek kuyruğa eklenen en son elemanı ayrı bir biçimde tutmamız gerekecek, hepsi bu. Yani start düğümünün yanında bir tane de *rear düğümü oluşturacağız.

Şimdi Kuyruğa Eleman ekleme ve kuyruktan eleman çıkarma işlemlerinin mantığına bakacak olursak eklenen her eleman “en arkadaki elemanın” bir arkasına (=>next) eklenir. Başlangıçta ilk eklenen eleman hem öndeki eleman hem de arkadaki eleman olur. Bu mantık üzerinden bağlı liste ile kuyruk yapımızı oluşturmamız mümkündür.

Yine Kuyruktan eleman çıkarma işleminde en arkadaki eleman çıkartılır. Ondan bir önceki eleman da son eleman şeklinde güncellenmelidir. Eğer eleman kalmamışsa “Rear” değerine Null atanmalıdır. Şimdi uzatmadan kodları size vereyim 🙂

Kuyruk Veri Yapısı – Eleman Ekleme Çıkarma C Kodu

Kuyruk veri yapısı C Kodu içerisinde ayrıntılı yorum satırları mevcuttur. Sırf kodlara bakarak bile konuyu anlamanız mümkündür.


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

//Düğümde ad soyad ve yaş değerlerini tutuyoruz.
struct node{
    char name[20];
    char secondName[20];
    int age;
    struct node *next;
};

//Head: Kuyruğun ilk elemanı
//Tail: kuyruğun son elemanı
//temp: fonksiyonlarda kullanabilmemiz için geçici değişken
struct node* head = NULL;
struct node* tail = NULL;
struct node* temp;

//İsim, soyisim ve yaş için global değişkenler
char firstName[20], secondName[20];
int age;

//Bu fonksiyon düğüm oluşturur ve return eder
struct node* createPerson(char name[], char secondName[], int age)
{
    struct node* newPerson = (struct node*)malloc(sizeof(struct node));
    strcpy(newPerson->name, name);
    strcpy(newPerson->secondName, secondName);
    newPerson->age = age;
    newPerson->next = NULL;

    return newPerson;
};

//Kuyruğa eleman ekleme (enqueue)
void enQueuePerson(char name[], char secondName[], int age)
{
    struct node* person = createPerson(name, secondName, age);
    //Eğer ilk eleman ve son eleman boş ise, yeni gelen eleman ilk elemandır
    if(head == NULL && tail == NULL)
    {
        head = person;
        tail = person;
    }
    else
    {
        //Sonuncunun arkasına eleman eklenir
        tail->next = person;
        //Sonuncu eleman yeni eklenen eleman olacak şekilde güncellenir.
        tail = person;
    }
}

//Kuyruktan eleman çıkaran fonksiyon
void deQueue()
{
    temp = head;
    //Eğer kuyruğun ilk elemanı yoksa kuyruk zaten boştur.
    if(head == NULL)
    {
        printf("\nQueue is empty, pls Enqueue");
        return;
    }

    //Eğer kuyruğun en arkasındaki kişi aynı zamanda en önündeki kişi ise kuyrukta 1 kişi var demektir
    //Bu yüzden o kişi de kuyruktan çıktığında kuyruğun hiçbir elemanı kalmaz.
    if(head == tail)
    {
        head = NULL;
        tail = NULL;
        return;
    }

    //Eğer yukarıdaki iki ihtimalde sağlanmazsa aşağıdaki kısım çalışır.
    //Mantık kuyruğun ikinci sırasındaki kişi artık birinci (head) sırasına gelmiş olur
    head = temp->next;
    //Free komutu ile düğümü yok ediyoruz
    free(temp);
}

//Sırada kimin olduğunu gösteren fonksiyon
struct node* whoNext()
{
    if(head == NULL)
    {
        printf("\nThere is no item in queue...");
        return 0;
    }

    return head;
}

//Kuyruğu yazdıran fonksiyon
void printQueue()
{
    int i = 1;
    if(head == NULL)
    {
        return;
    }
    temp = head;
    while(temp->next != NULL)
    {
        printf("\n%d. Position => %s %s %d ", i, temp->name, temp->secondName, temp->age);
        temp = temp->next;
        i++;
    }
    printf("\n%d. Position => %s %s %d ", i, temp->name, temp->secondName, temp->age);
}

//menu fonksiyon
void menu()
{
    int choise;
    while( 1 == 1 )
    {
        printf("\n 1- Enqueue ... ");
        printf("\n 2- Dequeue ... ");
        printf("\n 3- Who's next? ");
        printf("\nmake your choise ");
        scanf("%d", &choise);
        selection(choise);
    }
}

//Menu secimi
void selection(int chosen)
{
    switch(chosen)
    {
        case 1:
            printf("\n Enter First Name ... ");
            scanf("%s", &firstName);
            printf("\n Enter Second Name ... ");
            scanf("%s", &secondName);
            printf("\n Enter Age ... ");
            scanf("%d", &age);
            enQueuePerson(firstName, secondName, age);
            printQueue();
            break;
        case 2:
            deQueue();
            printQueue();
            break;
        case 3:
            temp = whoNext();
            printf("\n ****************** \n");
            if(temp != NULL)
            {
                printf("%s %s %d", temp->name, temp->secondName, temp->age);
            }

            break;

    }
}


//Main fonksiyonu, yalnızca menu fonksiyonunu çağırıyoruz.
int main()
{
    menu();
    return 0;
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir