Ci sono tanti modi per realizzarla, uno è di usare un array di dimensioni fisse:

codice:
typedef struct __queue
{
    unsigned long maxLength;
    unsigned long length;
    int *data;
}queue;

queue* getQueue()
{
    queue* q= (queue*)malloc(sizeof(queue));
    q->length=0;
    q->maxLength=100;
    q->data=(int*)malloc(sizeof(int)*q->maxLength);
    return q;
}

void enqueue(queue* q, int value)
{
    q->data[q->length%100]=value;
    q->length++;
}

void deleteQueue(queue** q)
{
    free((*q)->data);
    free(*q);
    *q=NULL;
}
Concettualmente è una coda che quando raggiunge la sua massima grandezza va a sostituire gli elementi che sono stati aggiunti per primi, cronologicamente.
Ora puoi dirmi te se quel codice, che hai preso da qualche parte, implementa una coda circolare o no.