Problema liste concatenate :)

di il
19 risposte

Problema liste concatenate :)

Buon pomeriggio a tutti

19 Risposte

  • Re: Problema liste concatenate :)

    Ciao,
    mi ero messo a correggere un po' il codice ma mi sono fermato perché ci sono troppe cose che non vanno. Prendo ad esempio il main:
    
    int main ( int argc , char * argv[])
    {
        struct elemento *ind;
        struct elemento *inizio = NULL;
    
        char car_immesso;
        char comando;
        char istruzione[20];
        int i;
        i= 0;
    
        do
        {
            car_immesso = getchar();
            istruzione[i] = car_immesso;
            ++i;
        }
    
        while ( car_immesso != '/n' ) ;
    
        comando = istruzione[0];
    
        if ( comando == 'i')
        {
    
            while ( inizio =! NULL)
            {
                inizio ->inizio.prossimo;
            }
            inizio->prossimo = aggiungicliente (istruzione[20]);
            stampa ( *inizio ) ;
        };
    
        if ( comando == 'v')
        {
            struct elemento *t;
            t= inizio;
            inizio = aggiungicliente (istruzione[20]);
            inizio->prossimo = t;
            stampa (*inizio);
        };
    
        if (comando == 'e')
        {
    
            inizio->prossimo = inizio ;
            stampa (*inizio);
        };
    
        return ;
    }
    
    Che cosa fa questo main? In quel do...while riempie un array di caratteri. Poi fa comando=istruzione[0] e ci sono tre if (uno solo dei quali sarà verificato). Qual è il senso? E gli altri caratteri inseriti che fine fanno? Poi perché passi questo array di comandi alla funzione aggiungi cliente? Quello non è certo il nome del cliente, ma sarà una sequenza di 'i', 'e', 'v', 's'.

    Rivedi un po' il testo e prova a spiegare meglio quello che devi fare.

  • Re: Problema liste concatenate :)

    Si scusami hai ragione ... non mi sono spiegata per niente bene
  • Re: Problema liste concatenate :)

    Ciao,
    per favore posta il codice negli appositi tag CODE.
    Comunque, sperando di aver capito il testo, ho velocemente scritto questo pezzo:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct cliente_t
    {
    
        char nome[20];
        struct cliente_t *prossimo;
    } cliente;
    
    
    cliente* nuovo_cliente(char *nome)
    {
        cliente *nuovo = (cliente *) malloc(sizeof(cliente));
        strcpy(nuovo->nome, nome);
        nuovo->prossimo = NULL;
        return nuovo;
    }
    
    
    cliente* ins_in_testa(cliente *lista, cliente *nuovo)
    {
        if(lista == NULL)
            return nuovo;
        nuovo->prossimo = lista;
        return nuovo;
    }
    
    
    cliente* ins_in_coda(cliente *lista, cliente *nuovo)
    {
        if(lista == NULL)
            return nuovo;
        cliente *aux = lista;
        while(aux != NULL)
            aux = aux->prossimo;
        aux->prossimo = nuovo;
        return lista;
    }
    
    
    void stampa (cliente *f)
    {
        printf("\nLA CODA:\n");
        while (f != NULL)
        {
            printf ("%s\n", f->nome);
            f = f->prossimo;
        };
        printf("\n");
    }
    
    
    int main ( int argc , char * argv[])
    {
        cliente *lista = NULL;
        char comando;
        char istruzione[20];
    
        printf("Inserire comando + nome: ");
        scanf("%s", istruzione);
    
        comando = istruzione[0];
    
        if ( comando == 'i')
        {
            /* inserimento in coda alla lista */
            int i=1;
            char nome[20];
            while(istruzione[i] != '\0')
            {
                nome[i-1] = istruzione[i];
                i++;
            }
            nome[i-1] = '\0';
            printf("Inserisco il cliente %s\n", nome);
            cliente *nuovo_cl = nuovo_cliente(nome);
            lista = ins_in_coda(lista, nuovo_cl);
            stampa(lista);
        }
    
        /* QUI PROVA TU */
    
        return 0;
    }
    
    Digitando, ad esempio, "iMario" il programma inserisce in coda un cliente di nome "Mario". Era questo quello che volevi? Ora prova a completare.

  • Re: Problema liste concatenate :)

    Il nome in realtà deve essere la sola iniziale e ci deve essere almeno uno spazio tra i o una di quelle lettere che ti dicono il tipo di comando da utilizzare ....
  • Re: Problema liste concatenate :)

    Grazie mille

    ah un altra domanda , qual è il significato di questa riga??
    strcpy(nuovo->nome, nome);
    non conosco questa funzione :/
  • Re: Problema liste concatenate :)

    bazzezzab ha scritto:


    qual è il significato di questa riga??
    strcpy(nuovo->nome, nome);
    Ecco qui: link.
  • Re: Problema liste concatenate :)

    Ok... adesso ne ho creata una versione completa che quando compilo non da segni di errore ma tuttavia non funziona lo stesso -,-"
  • Re: Problema liste concatenate :)

    Non mi è molto chiaro cosa faccia questa parte:
    
        int z ;
        z=1;
        while (instruction[z] == '/')
        {
            ++z;
        };
    
        nuovo->nome = instruction[z];
    
  • Re: Problema liste concatenate :)

    Siccome la funzione riceve come argomento l'array , quello z serve per scorrere l'array che contiente anche spazi , fino a quando non incontra il primo carattere che sarebbe il 'nome' del cliente
  • Re: Problema liste concatenate :)

    E poi immette quel carattere nel rispettivo membro della struttura creata
  • Re: Problema liste concatenate :)

    bazzezzab ha scritto:


    quello z serve per scorrere l'array che contiente anche spazi , fino a quando non incontra il primo carattere che sarebbe il 'nome' del cliente
    Sì, ma non funziona! Prova ad inserire "i Mario" e fatti stampare il carattere letto: ti stampa proprio lo spazio. Il problema è quello slash... Invece puoi scrivere semplicemente così:
    while (instruction[z] == ' ')
    Poi c'è un problema relativo all'eliminazione di un cliente dalla coda. Dovresti anche liberare la memoria allocata con una chiamata alla funzione free. In generale quando allochi (malloc) devi anche poi liberare (free).
    Infine devi fare in modo che il programma continui la sua esecuzione anche dopo, ad esempio, un inserimento. Questo lo ottieni facilmente con un ciclo all'interno del main.

  • Re: Problema liste concatenate :)

    Ok ho fatto quella cosa per evitare che stampi lo spazio... ma alla fine non stampa nulla lo stesso hahah non è possibile -.-"

    ah e poi del nome del cliente bisogna inserire solo l'iniziale
  • Re: Problema liste concatenate :)

    Per eliminare lo spazio con la funzione free non c'è problema, il prof non lo richiedeva quindi non lo faccio
  • Re: Problema liste concatenate :)

    Io ho corretto solo quello nel tuo codice. Comunque lo ri-posto:
    
    /* Il problema considerato consiste nel rappresentare quello che e'
    l'andamento di una coda; con gli eventuali inserimenti e le opportune
    cancellazioni delle varie parti di essa.
    Il programma e' stato incentrato sulla lista concatenata, la quale
    risulta essere la struttura dinamica che meglio si presta
    a descrivere questo tipo di dati .
    I comandi di input inseriti dall'utente forniscono al programma
    l'informazione sull'istruzione da eseguire:
    essi sono stati riportati in una stringa di caratteri per poter essere
    analizzati singolarmente e facilmente.
    Sono state utilizzate 4 diverse funzioni con il compito di "creare",
    "inserire" e "stampare" i successivi elementi della coda. */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct cliente_t
    {
        char nome;
        struct cliente_t *prossimo;
    
    } cliente;
    
    /* FUNZIONE CHE CREA UN NUOVO ELEMENTO DELLA LISTA ---> la funzione,
    trova uno spazio per la crezione del nuovo elemento della lista,
    riceve come argomento la stringa di caratteri immessa dall'utente
    per poter inserire nella coda il dato carattere,
    restituisce l'indirizzo del nuovo elemento  */
    
    cliente * nuovo_cliente (char  instruction[])
    {
        cliente *nuovo = (cliente *) malloc(sizeof(cliente));
    
        if ( nuovo == NULL)
        {
            exit(EXIT_FAILURE);
        };
    
        nuovo->prossimo = NULL;
        int z ;
        z=1;
        while (instruction[z] == ' ')
        {
            ++z;
        };
    
        nuovo->nome = instruction[z];
    
        return nuovo;
    };
    
    /* FUNZIONE CHE INSERISCE UN ELEMENTO IN CIMA ALLA LISTA ----> la
    funzione riceve come argomenti il puntatore all'inzio della coda
    e il puntatore al nuovo elemento creato, e restituisce l'indirizzo
    del nuovo elemento dopo averlo inserito in cima alla coda */
    
    cliente * ins_in_testa (cliente *lista ,cliente *nuovo)
    {
        if (lista == NULL)
        {
            return nuovo ;
        };
    
        nuovo->prossimo = lista;
    
        return nuovo;
    };
    
    /* FUNZIONE CHE INSERISCE UN ELEMENTO IN FONDO ALLA LISTA -----> la
    funzione riceve come argomenti il puntatore all'inzio della coda
    e il puntatore al nuovo elemento creato e scorre tutta la lista in
    modo da posizionare il nuovo elemento in fondo ad essa. Restituisce
    l'inirizzo al primo elemento della coda. */
    
    cliente * ins_in_coda ( cliente *testa , cliente *nuovo)
    {
        if ( testa ==NULL)
        {
            return nuovo;
        };
    
        cliente *q = testa;
    
        while ( q != NULL )
        {
            q = q->prossimo;
        };
    
        q->prossimo = nuovo;
    
        return testa;
    };
    
    /* FUNZIONE STAMPA --> scorre la lista e stampa i caratteri
    contenuti nel membro "nome" di ogni struttura. */
    
    void stampa (cliente *testa)
    {
        cliente *f ;
        f = testa;
        while ( f != NULL)
        {
            printf ( "%c", f-> nome);
            f= f->prossimo;
        };
    };
    
    
    
    
    int main (int argc, char *argv[])
    {
        cliente *testa = NULL;
        cliente *p = NULL;
        char car_immesso;
        char comando;
        char istruzione[10];
    
        int i;
        i= 0;
        /* utilizzo della funzione getchar per inserire i caratteri
        di input in un vettore "istruzione" sino all'inserimento di
        "invio" */
    
        do
        {
            car_immesso = getchar();
            istruzione[i] = car_immesso;
            ++i;
        }
    
        while (car_immesso != '\n');
    
    
        /* la successiva istruzione si basa sul fatto che il primo
        carattere digitato corrisponde ad un comando che il programma
        deve eseguire . */
    
        comando = istruzione[0];
    
        if ( comando == 'i')
        {
            p = nuovo_cliente (istruzione);
            testa = ins_in_coda ( testa , p);
            stampa (testa);
        };
    
        if ( comando == 'v')
        {
            p = nuovo_cliente(istruzione);
            testa = ins_in_testa ( testa, p);
            stampa (testa);
        };
    
        if (comando == 'e')
        {
            testa->prossimo = testa ;
            stampa (testa);
        };
    
        if (comando == 's')
        {
            exit(EXIT_SUCCESS);
        };
    
        return 0;
    
    }
    
    Ora prova ad inserire "i Mario" o "i Mario" e dovrebbe sempre stamparti "M".
Devi accedere o registrarti per scrivere nel forum
19 risposte