C Queue implementation

CyberXhackk

Kıdemli Üye
13 Mar 2016
3,132
10
C/C++ Dev.
Okul ödevim için yazmış olduğum Queue (Kuyruk veri yapısı) implementasyonumu sizinle paylaşmak istedim. Olumlu olumsuz eleştirilerinizi bekliyorum.


Kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _Node {
    voîd q Data;
    struct _Node * Next;
} Node;

typedef struct _Queue {
    Node * Head;
    Node * Tail;
    size_t TypeSize;
} Queue;

voîd initQ(Queue * q, size_t typeSize)
{
    q->Tail = NULL;
    q->Head = NULL;
    q->TypeSize = typeSize;
}

int enqueue(Queue * q, const voîd * data)
{
    Node * iter;

    if (!(iter = malloc(sizeof(Node))))
        return EXIT_FAILURE;

    if (!(iter->Data = malloc(sizeof(q->TypeSize))))
    {
        free(iter);
        return EXIT_FAILURE;
    }

    memcpy(iter->Data, data, q->TypeSize);

    if (q->Tail == NULL)
    {
        q->Head = q->Tail = iter;
    } 
    else
    {
        q->Tail->Next = iter;
        q->Tail = q->Tail->Next;
    }
    
     q->Tail->Next = NULL;

    return EXIT_SUCCESS;
}

int dequeue(Queue * q, voîd * data)
{
    if (q->Head == NULL)
        return EXIT_FAILURE;

    memcpy(data, q->Head->Data, q->TypeSize);
    free(q->Head->Data);

    if (q->Head == q->Tail)
    {
        free(q->Head);
        q->Head = q->Tail = NULL;
    }
    else
    {
        Node * temp;
        temp = q->Head->Next;
        free(q->Head);
        q->Head = temp;
    }
    
    return EXIT_SUCCESS;
}

static voîd clearNodes(Node * i)
{
    if (i == NULL)
        return;
    
    clearNodes(i->Next);
    free(i->Data);
    free(i);
}

voîd clearQ(Queue * q)
{
    clearNodes(q->Head);
    q->Head = q->Tail = NULL;
}

voîd printQ(Queue * q)
{
    Node * iter = q->Head;
    
    while(iter)
    {
        printf("%d\n", *(int *) iter->Data);
        iter = iter->Next;
    }
}

int main()
{
    Queue q;
    int x = 5;

    initQ(&q, sizeof(int));

    while(x--)
        if(enqueue(&q, &x) == EXIT_FAILURE)
            puts("Error");

    printQ(&q);
    /*
    while(dequeue(&q, &x) != EXIT_FAILURE)
        printf("%d\n", x);
    */

    int y;
    for (size_t i = 0; i < 2; i++)
    {
        dequeue(&q, &y);
        printf("%d\n", y);
    }
    
    clearQ(&q);
}

GitHub Linki:

https://github.com/alkalemir/QueueWithLL/blob/master/queue.c

Optimizasyon önerilerinizi konu altında belirtirseniz sevinirim.
 
Son düzenleme:

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
390
Ankara
Tabii ki "yapılmışı var", hazırları var ama elle queue, stack, linked list yapmayı beceremeden programcı olmaya çalışanlar, önlerine orjinal ilk problem gelince katılıp kalırlar.

Kontroller süper. Profesyonel bir yazılımdaki gibi olabilecek her hususu, milyarda bir ihtimal de olsa kontrol etmişsin.

Eline sağlık.
 

CyberXhackk

Kıdemli Üye
13 Mar 2016
3,132
10
C/C++ Dev.
Tabii ki "yapılmışı var", hazırları var ama elle queue, stack, linked list yapmayı beceremeden programcı olmaya çalışanlar, önlerine orjinal ilk problem gelince katılıp kalırlar.

Kontroller süper. Profesyonel bir yazılımdaki gibi olabilecek her hususu, milyarda bir ihtimal de olsa kontrol etmişsin.

Eline sağlık.

Aynı şekil diğer veri yapılarımı da geliştirmeye çalışıyorum. Onlar biraz sönük kaldı Queue'nin yanında. Github hesabınız var mıdır hocam sizin? Konularınızı gerçekten takip eden birisiyim ve sizin gibi birinden övgü almak beni sevindirdi açıkçası. Github hesabınızı paylaşabilirseniz çalışmalarınızı oradan daha sık takip etmek isterim. C'ye büyük ilgim var ve henüz 1. sınıfım önümde hayli zaman var.
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
390
Ankara
Aynı şekil diğer veri yapılarımı da geliştirmeye çalışıyorum. Onlar biraz sönük kaldı Queue'nin yanında. Github hesabınız var mıdır hocam sizin? Konularınızı gerçekten takip eden birisiyim ve sizin gibi birinden övgü almak beni sevindirdi açıkçası. Github hesabınızı paylaşabilirseniz çalışmalarınızı oradan daha sık takip etmek isterim. C'ye büyük ilgim var ve henüz 1. sınıfım önümde hayli zaman var.

Üstad benim yazdığım her satır kod şirketime ait. Hani burada devamlı derim; "trollemenin karşılığında soru cevaplıyorum" diye, open source bir cevap bulduğumda, fork edip mükemmelleştirdiğim olur, onda da private fork açar asıl kodu yazan elemana izin veririm, o kendi kodunu düzeltip övgüyü o alır. Public repom olmamalı github'da...

Övgün için teşekkürler. Mutlu oldum.
 

qRp

Yeni üye
10 May 2020
32
0
~qRp/
Hocam elinize sağlık fakat clearNodes fonksiyonu recursive olmasa daha iyi olmaz mı? Github hesabınızı takipteyim, projelerinizi bekliyorum :))
 

CyberXhackk

Kıdemli Üye
13 Mar 2016
3,132
10
C/C++ Dev.
Hocam elinize sağlık fakat clearNodes fonksiyonu recursive olmasa daha iyi olmaz mı? Github hesabınızı takipteyim, projelerinizi bekliyorum :))

Teşekkür ederim, Recursive yapma sebebim bağlı listenin tek yönlü olmasıydı. Kendim başka çözüm üretemedim. Performansı etkiliyor tabi fonksiyon pushlama maliyeti var. Çift yönlü bağlı liste olsaydı ->prev'ler ile geri dönebilirdim. Sizin var mı öneriniz tek yönlü bağlı liste üzerinde Recursive olmadan clear etmek üzerine? Paylaşırsanız sevinirim.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.