Queue in C

typedef struct MyNode
{//Diese Struktur beschreibt den Aufbau eines Elements der Queue
    MyNode* next;
    MyNode* prev;
    int value;
} ;
 
typedef struct
{//Diese Struktur enthält den Anfang und das Ende einer Queue
    MyNode* head;
    MyNode* tail;
} MyQueue;
 
void push(int value, MyQueue* queue); //Die Prototypen der Funktionen
void pop(MyQueue* queue);
void showQueue(const MyQueue* queue);
bool isEmpty(const MyQueue* queue);
 
int main() //Beispiel für ein Hauptprogramm
{
    MyQueue queue;
    MyNode* help;
    queue.head = queue.tail = NULL; //WICHTIG!!! da sonst kein push bzw. pop möglich ist
 
    push(1, &queue);
    push(2, &queue);
    push(3, &queue);
    push(4, &queue);
 
    showQueue(&queue);
 
    pop(&queue);
    pop(&queue);
 
    showQueue(&queue);
 
    return 0;
}
 
void push (int value, MyQueue* queue)
{//Mit dieser Funktion fügt man ein Element in die Queue ein
 
    MyNode* help; //Mithilfe des Hilfezeigers legt man zuerst ein neues Element an und
    help = (MyNode*) malloc(sizeof(MyNode)); //weist diesem den übergebenen Wert zu
    help->value = value;
 
    if(queue->head == NULL) //Dann fügt man das neue Element am Ende ein
        queue->head = help;
 
    else
        queue->tail->next = help;
 
    help->prev = queue->tail;
    queue->tail = help;
}
 
void pop(MyQueue* queue)
{//Mit dieser Funktion wird das erste Element entfernt
    MyNode* help;
    help = queue->head; //Den Hilfezeiger auf das erste Element setzten
    queue->head = queue->head->next; //Beginn um 1 nach hinten verschieben
 
    if(queue->head == NULL)
        queue->tail = NULL;
 
    else
        queue->head->prev = NULL;
 
    if(help != NULL)  //Prüfung ob überhaupt noch ein Element zum Löschen da ist
    { //Falls nicht ist "help" ja NULL und es braucht kein Speicher mehr freigegeben werden
        help->next = NULL;
        free(help);
    }
 
}
 
void showQueue(const MyQueue* queue)
{//Mit dieser Funktion lassen wir uns unsere Queue anzeigen (einfach durchlaufen und jedes Element ausgeben)
    MyNode* help = queue->head;
 
    while(help != NULL)
    {
        printf("%d ", help->value);
        help = help->next;
    }
 
    printf("\n");
}
 
bool isEmpty(const MyQueue* queue)
{//Diese Methode checkt ob sich Elemente in der Queue befindet
    bool ret = false;
 
    if(queue->head == NULL && queue->tail == NULL)
        ret = true;
 
    return ret;
}