Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] Stack di stringhe

  1. #1

    [C] Stack di stringhe

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: [C] Stack di stringhe

    Tanto per cominciare

    Originariamente inviato da h3unter
    Inoltre la funzione pop vede sempre la pila vuota. Credo sia una banalità ma davvero sono bloccato
    bada bene a cosa hai scritto:

    codice:
    case 2:  // Pop di una stringa
    // Se la pila non è vuota //
    if (!isEmpty)
    {
        stringa = pop (&pila);
        printf ("\nLa stringa e':\n%s", stringa);
    }
    effettivamente quella condizione è sempre falsa.

    In quanto al primo problema, è un effetto subdolo dovuto al fatto che per la lettura da tastiera della stringa utilizzi sempre lo stesso array allocato staticamente in memoria nel main, "parola": poiché ogni volta che inserisci una stringa vai a scrivere nell'array parola che in memoria si trova sempre allo stesso indirizzo, di fatto ad ogni iterazione vai a sovrascrivere la parola precedente; ora, poiché quando crei un nuovo nodo non fai una strcpy() ma una banale copia di puntatori, di fatto ti ritrovi con tutti i nodi che hanno, nel campo stringa, l'indirizzo dell'array "parola" allocato in main, pertanto la stringa da loro puntata si aggiorna dinamicamente all'ultima parola letta da tastiera.
    Correggi allocando della memoria per il puntatore "stringa" di ogni nodo ed eseguendo una strcpy().
    every day above ground is a good one

  3. #3
    Tutto chiaro grazie. Ho risolto utlizzando la funzione strcpy. Ovviamente ho anche corretto l'istruzione if nella pop, avevo dimenticato il parametro nella funzione isEmpty
    Grazie ancora per l'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.