Реализация массива Queue: функция удаления из очереди

#c #queue

#c #очередь

Вопрос:

Застрял на проблеме с реализацией функции удаления из очереди массива. Кажется, что сама функция верна, но проблема, насколько я понимаю, в указателе в параметрах. Почему я завершаю работу с ошибкой сегментации здесь?

 #include <stdio.h>
#include <stdbool.h>

#define CAPACITY 3

typedef struct {
        int head;
        int size;
        int elements[CAPACITY];
        } queue;

bool isempty(queue* q);
int size(queue* q);
bool enqueue(queue* q, int element);
bool dequeue(queue* q, int* element);


int main(void) {

queue q;

if(isempty(amp;q)) {
    printf("Queue is emptyn");
}

enqueue(amp;q, 34);
enqueue(amp;q, 2);
enqueue(amp;q, 4);
dequeue(amp;q, amp;q.head);

if(!isempty(amp;q)) {
    printf("Queue is not emptyn");
}

printf("%in", q.elements[1]);

}

bool isempty(queue* q) {
    return q->size == 0;
}

int size(queue* q) {
    return q->size;
}

bool enqueue(queue* q, int element) {

    if(q->size < CAPACITY) {
        q->elements[(q->head   q->size) % CAPACITY] = element;
        q->size  ;
        printf("Enqueue: %dn", element);
        return true;
    }

    return false;
}

bool dequeue(queue* q, int* element) {

    if(q->size > 0) {
        *element = q->elements[q->head];
        q->head = (q->head 1) % CAPACITY;
        q->size--;

        return true;
    }

    return false;
}   
  

Комментарии:

1. Используйте отладчик. Как минимум, он точно сообщит вам, какая строка вызывает ошибку seg. И многое другое.

2. queue q; это неинициализированная переменная. Он содержит ненужные значения. С этого момента все ставки отменяются.

3. Для начала вам может потребоваться иметь еще одну функцию, например createqueue, где вы инициализируете очередь.