Implementación de una cola FIFO en C

Para una aplicación incrustada, estoy tratando de implementar una cola de estructuras primero en entrar, primero en salir (FIFO) usando ANSI C. La forma más directa de hacerlo parece ser mediante la implementación de una lista vinculada, de modo que cada estructura contenga un puntero al siguiente en la cola. Por lo tanto, defino la estructura misma como:

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

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

Hasta aquí todo bien. Si defino punteros al primer y último elemento de la cola como:

QueuedAction *firstAction;
QueuedAction *lastAction;

... luego me gustaría poder agregar una nueva acción a la cola indicando (por ejemplo):

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

... así que al regresar, lastAction sería un puntero a la última acción recién creada en la cola. Por lo tanto, la rutina para agregar la acción a la cola se vería así:

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

Todo estaría bien y elegante, excepto que este código no se compilará. El error está en la línea que dice

*lastAction -> nextAction = newQueuedAction;

... donde el compilador afirma que el elemento a la izquierda de '->' no es una estructura válida. Seguramente, sin embargo, debe ser. Si de hecho hago lo que debería ser un elenco totalmente redundante:

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

... entonces el compilador está bastante contento. Sin embargo, me preocupa que el mensaje de error esté insinuando algo sutil que pueda estar haciendo mal aquí. Entonces (para ir al grano), ¿alguien puede decirme por qué el compilador no está contento y si hay una mejor manera de hacer lo que estoy tratando de hacer aquí?

Respuestas a la pregunta(4)

Su respuesta a la pregunta