Реализация очереди FIFO в C

Для встроенного приложения я пытаюсь реализовать очередь структур «первым пришел - первым вышел» (FIFO) с использованием ANSI C. Наиболее простой способ сделать это, по-видимому, реализовать связанный список, чтобы каждая структура содержала указатель на следующий в очереди. Следовательно, я определяю саму структуру как:

typedef enum { LED_on, LED_off, etc } Action;
typedef struct Queued_Action QueuedAction;

struct Queued_Action
{
    Action       action;
    int          value;
    QueuedAction *nextAction;
};

Все идет нормально. Если я определю указатели на первый и последний элементы в очереди как:

QueuedAction *firstAction;
QueuedAction *lastAction;

... тогда я хотел бы иметь возможность добавить новое действие в очередь, указав (например):

if (!add_action_to_queue(LED_on, 100, &lastAction))
     printf("Error!\n);

... поэтому по возвращении lastAction будет указателем на только что созданное последнее действие в очереди. Следовательно, процедура добавления действия в очередь будет выглядеть так:

int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
    QueuedAction *newQueuedAction;

    // Create a new action in memory
    if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
        return 0;

    // Make the old 'lastAction' point to the new Action, 
    // and the new Action to point to NULL:
    *lastAction -> nextAction = newQueuedAction;
    newQueuedAction -> nextAction = NULL;
    newQueuedAction -> action = newAction;
    newQueuedAction -> value = newValue;

    // Designate the new Action as the new lastAction:
    *lastAction = newQueuedAction;
    return 1;
}

Все будет хорошо, но этот код не скомпилируется. Ошибка в строке, говорящей

*lastAction -> nextAction = newQueuedAction;

... где компилятор утверждает, что элемент слева от '->' не является допустимой структурой. Конечно, однако, это должно быть. Если на самом деле я делаю то, что должно быть полностью лишним приведением:

fakeAction = (QueuedAction *)(*lastAction);
fakeAction -> nextAction = newQueuedAction;

... тогда компилятор вполне доволен. Тем не менее, я обеспокоен тем, что сообщение об ошибке намекает на что-то неуловимое, что я могу ошибаться здесь. Итак (чтобы перейти к сути), может кто-нибудь сказать мне, почему компилятор не доволен, и есть ли лучший способ сделать то, что я пытаюсь сделать здесь.

Ответы на вопрос(4)

Ваш ответ на вопрос