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