После вызова take_out (обычно называют pop), куда показывает голова очереди? Переменная queue указывает на адрес, который только что освободили.
либо возвращайте в take_out указатель на новую голову:
QUEUE* take_out(QUEUE *q, NODE *node, int *error)
{
QUEUE *old_item = q; // начало очереди
NODE *old_info = 0;
if (q) // если очередь не пуста
{
old_info = old_item->info;
q = (q)->next;
delete old_item; // уничтожение элемента
*error = 0;
}
else *error = 1;
node = old_info;
return q;
....
queue = take_out(queue, p, err)
}
либо организуйте очередь как
struct List;
struct List
{
struct List *next;
NODE *info;
};
typedef struct
{
struct List *head;
} QUEUE;
int pop(QUEUE* q, NODE* info)
{
int ret;
if (q && q->head)
{
info = q->head->info;
q->head = q->head->next;
ret = 0;
}
else
{
ret = -1;
}
}
по мне второй вариант лучше.