Implementando uma fila FIFO em C

Para um aplicativo incorporado, estou tentando implementar uma fila de estruturas primeiro a entrar, primeiro a sair (FIFO) usando ANSI C. A maneira mais direta de fazer isso parece ser implementando uma lista vinculada, para que cada estrutura contenha um ponteiro para o próximo na fila. Por isso, defino a estrutura em si como:

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

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

Por enquanto, tudo bem. Se eu definir ponteiros para o primeiro e o último itens da fila como:

QueuedAction *firstAction;
QueuedAction *lastAction;

... gostaria de poder adicionar uma nova ação à fila, afirmando (por exemplo):

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

... então, no retorno, lastAction seria um ponteiro para a última ação recém-criada na fila. Portanto, a rotina para adicionar a ação à fila seria semelhante a:

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;
}

Tudo ficaria bem e elegante, exceto que esse código não será compilado. O erro está na linha dizendo

*lastAction -> nextAction = newQueuedAction;

... onde o compilador reivindica o item à esquerda do '->' não é uma estrutura válida. Certamente, no entanto, deve ser. Se, de fato, faço o que deveria ser um elenco totalmente redundante:

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

... então o compilador está muito feliz. No entanto, estou preocupado que a mensagem de erro esteja sugerindo algo sutil que eu possa estar fazendo de errado aqui. Então (para chegar ao ponto), alguém pode me dizer por que o compilador não está feliz e se existe uma maneira melhor de fazer o que estou tentando fazer aqui.