Ваша очередь может очиститься после себя, если и только если struct Graphnode
является автономным и не содержит указателей на выделенную память.
void emptyQueue(struct queue *q) {
queueElement *element, *nextElement;
element = q->head;
while(element) {
nextElement = element->next;
free(element);
element = nextElement;
}
initQueue(q);
}
Обратите внимание, что, поскольку initQueue
не malloc
, его функция-аналог emptyQueue
не должна free
.Это позволяет вам создавать очереди в стеке, если вам нужно.
Если ваш struct Graphnode
имеет указатели на выделенную память, вам нужно будет делать это вручную, а не в emptyQueue
.Ваш код будет выглядеть примерно так:
struct Graphnode node;
while(!isEmpty(q)) {
node = front(q);
/* Delete the stuff in `node` here. */
dequeue(q);
}
Некоторые комментарии к вашему коду C ...
В enqueue
у вас есть:
if (q->head == NULL) {
//first element
q->head = newElement;
q->tail = newElement;
} else {
//put it to the tail
q->tail->next= newElement;
q->tail = newElement;
}
Поскольку вы делаете q->tail = newElement;
в обоих направлениях, уберите его:
if (q->head == NULL) {
//first element
q->head = newElement;
} else {
//put it at the tail
q->tail->next= newElement;
}
q->tail = newElement;
Кроме того, последовательные отступы - это хорошая привычка.Ваш текстовый редактор должен упростить вам эту задачу.
In dequeue
:
if (q->head == NULL) {
//empty queue
return;
} else {
element = q->head;
q->head = q->head->next;
free(element);
}
else
не требуется, поскольку первая часть всегда return
s.
if (q->head == NULL) {
//empty queue
return;
}
element = q->head;
q->head = q->head->next;
free(element);
Наконец, в ifEmpty
:
return (q->head == NULL ? 1:0);
C представляет истину как ненулевое значение и ложь как 0. Результат оператора ==
гарантированно будет таким, поэтомунет смысла заставлять true быть 1
;
return q->head == NULL;
Последнее замечание: в некоторых системах «используемая память», считываемая такой программой, как top
, может не уменьшаться.Это связано с тем, что система хранит страницы освобожденной памяти для дальнейшего использования.Это может освободить физическую память, но адреса виртуальной памяти будут оставаться «доступными» для вашей программы до завершения.