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:
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 bloccatocodice:* 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; }![]()

Rispondi quotando