Salve ragazzi. Sto facendo alcuni esercizi in C e mi sono bloccato al momento di creare uno stack di stringhe. Vi posto il codice che ho fatto fino ad ora e vi spiego il problema:

codice:
* Questo programma prende in input una frase e, utilizzando una pila, la visualizza in ordine inverso */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 20

// Definizione del Nodo della pila //
struct stack
{
    char *stringa;
    struct stack *next;
};

// Definizione dei nuovi tipi //
typedef struct stack StackNode;
typedef StackNode *NodePtr;

// Prototipi di funzione //
void push (NodePtr *, char [SIZE]);
char* pop (NodePtr *);
int isEmpty (NodePtr *);
void stampa (NodePtr);
int menu ();

int main ()
{
    NodePtr pila = NULL;  // Nuova pila
    int scelta;  // Scelta fatta dall'utente
    char parola [SIZE];  // Elemento con cui lavorare nella pila
    char *stringa;

    // Visualizzo il menu //
    scelta = menu ();

    while (scelta != 4)
    {
        switch (scelta)
        {
            case 1:  // Push di una stringa all'interno della pila
                printf ("\nInserisci una parola: \n");
                scanf ("%s", parola);
                push (&pila, parola);
                stampa (pila);
                break;
            case 2:  // Pop di una stringa
                // Se la pila non è vuota //
                if (!isEmpty)
                {
                    stringa = pop (&pila);
                    printf ("\nLa stringa e':\n%s", stringa);
                }
        }

        // Richiamo la funzione menu //
        scelta = menu ();
    }
}

// Funzione push //
void push (NodePtr *top, char *parola)
{
    NodePtr nuovo;  // Puntatore al nuovo nodo

    nuovo = malloc (sizeof (StackNode));  // Allocazione dello spazio in memoria per il nuovo nodo

    // Inserisce il nuovo nodo in cima alla pila //
    if (nuovo != NULL)
    {
        nuovo->stringa = parola;
        nuovo->next = (*top);
        (*top) = nuovo;
    }
    else  // La memoria non è stata riservata
    {
        printf ("\nMemoria non disponibile\n");
    }
}

// Funzione menu //
int menu ()
{
    int choice;

    printf ("\n\n\t\t********** MENU **********\n\n\n");
    printf ("1. Push\n"
            "2. Pop\n"
            "3. Inverti frase\n"
            "4. Esci\n");
    scanf ("%d", &choice);

    return choice;
}

// Funzione stampa //
void stampa (NodePtr pila)
{
    // Controlla se la pila non è vuota //
    if (pila != NULL)
    {
        printf ("\nLa pila è: \n\n\n");

        // Scorre la pila //
        while (pila != NULL)
        {
            printf ("%s --> ", pila->stringa);
            pila = pila->next;
        }

        printf ("NULL\n\n");
    }
}

// Funzione Pop //
char *pop (NodePtr *top)
{
    NodePtr temp;  // Nodo temporaneo
    char *data;  // Elemento tolto dalla pila

    temp = *top;
    data = (*top)->stringa;
    (*top) = (*top)->next;  // Aggiorna la testa
    free (temp);  // Libera lo spazio in memoria

    return data;
}
Il problema è che ogni volta che inserisco un elemento questo viene inserito ma mi va a sovrascrivere quelli già scritti. Cioè se inserisco la prima volta "ciao" la pila conterrà solo "ciao". Se la seconda volta inserisco "come", la pila conterrà "come"->"come". Inoltre la funzione pop vede sempre la pila vuota. Credo sia una banalità ma davvero sono bloccato