Для этого стиля очередь , lQUEUE lqueue_init_default(void)
возвращает структуру .
К сожалению, код OP выделяет память для структуры и затем возвращает копию памяти. Это теряет оригинальный указатель на выделенное.
Далее, pQ->head->length
отменяет ссылки pQ->head
, хотя элемент head
не был назначен. Конечно, это причина того, что "left of '-> head' должно указывать на struct / union", так как во время выполнения OP определила недопустимое значение pQ->head
.
Как исправить это зависит от неустановленных целей кодирования.
Вероятно, для соответствия lQUEUE lqueue_init_default()
явному намерению назначьте членов структуры lQUEUE
и верните ее копию.
lQUEUE lqueue_init_default(void) {
lQUEUE lQ;
lQ.head = malloc(sizeof *(lQ.head)); // allocate memory for a QNODE, not lQUEUE
// If allocation successful ...
if (lQ.head) {
lQ.head->length = 0;
lQ.head->next = NULL;
}
lQ.tail = lQ.head; // start with head & tail pointing to the same `QNODE`.
return lQ;
}
Другая форма lqueue_init_default()
может просто назначить head, tail
на NULL
. Это зависит от других целей кодирования, не указанных.
lQUEUE lqueue_init_default(void) {
lQUEUE lQ;
lQ.head = NULL;
lQ.tail = lQ.head; // start with head & tail pointing to the same `QNODE`.
return lQ;
}
Пример использования
lQUEUE myQ = lqueue_init_default(void);
Я нахожу это все еще из очереди расточительно и не очень полезно. очереди не требуется указатель на голову и хвост, чтобы добавить к обоим концам за O (1) время.