Funzione ordinamento lista dinamica

di il
3 risposte

Funzione ordinamento lista dinamica

Ciao, scrivo per un piccolo problema in questa function che ho scritto:

TipoElem *OrdinaLista(TipoElem *Testa)
{
    TipoElem *TestaOrd, *Puntprovv;
    int NumProv, Numprov2, i;
    char criterio;
    printf("inserisci il criterio (c per crescente e d per decrescente)\n");
    scanf("%*d%c", &criterio);
    Puntprovv = Testa;
    TestaOrd = Testa;
    if (criterio == 'c')
    {
        for (i = ContaElementiLista(Testa); i > 0; i--)
        {
            NumProv = Puntprovv->Dato;
            while (Puntprovv != NULL)
            {
                if (Puntprovv->Dato <= NumProv)
                {
                    NumProv = Puntprovv->Dato;
                }
                Puntprovv = Puntprovv->Prossimo;
            }
            Puntprovv = Testa;
            while (Puntprovv->Dato != NumProv)
            {
                Puntprovv = Puntprovv->Prossimo;
            }
            Numprov2 = Puntprovv->Dato;
            Puntprovv->Dato = Testa->Dato;
            Testa->Dato = Numprov2;
            Testa = Testa->Prossimo;
            Puntprovv = Testa;
        }
        return (TestaOrd);
    }
    if (criterio == 'd')
    {
        for (i = ContaElementiLista(Testa); i > 0; i--)
        {
            NumProv = Puntprovv->Dato;
            while (Puntprovv != NULL)
            {
                if (Puntprovv->Dato >= NumProv)
                {
                    NumProv = Puntprovv->Dato;
                }
                Puntprovv = Puntprovv->Prossimo;
            }
            Puntprovv = Testa;
            while (Puntprovv->Dato != NumProv)
            {
                Puntprovv = Puntprovv->Prossimo;
            }
            Numprov2 = Puntprovv->Dato;
            Puntprovv->Dato = Testa->Dato;
            Testa->Dato = Numprov2;
            Testa = Testa->Prossimo;
            Puntprovv = Testa;
        }
        return (TestaOrd);
    }
}
void main()
{
    TipoElem *testa;
    testa = CreaRiempiLista();
    testa = OrdinaLista(testa);
    StampaLista(testa);
}
Il problema non è tanto che non mi mette in ordine la lista, più che altro ho un problema con lo scegliere decrescente e crescente, infatti anche se metto c in input mi stampa sempre la lista in ordine decrescente. Penso proprio sia un problema dello scanf, non tanto delle righe di codice che ordinano la lista... . Ho pensato che il codice per ordinare è identico sia per crescente che decrescente, ad eccezione di un <= che diventa un >=.
Precisamente qui;
 if (criterio == 'c')
    {
        for (i = ContaElementiLista(Testa); i > 0; i--)
        {
            NumProv = Puntprovv->Dato;
            while (Puntprovv != NULL)
            {
                if (Puntprovv->Dato <= NumProv)
                {
                    NumProv = Puntprovv->Dato;
                }
                Puntprovv = Puntprovv->Prossimo;
            }
if (criterio == 'd')
    {
        for (i = ContaElementiLista(Testa); i > 0; i--)
        {
            NumProv = Puntprovv->Dato;
            while (Puntprovv != NULL)
            {
                if (Puntprovv->Dato >= NumProv)
                {
                    NumProv = Puntprovv->Dato;
                }
                Puntprovv = Puntprovv->Prossimo;
            }
Correggetemi se sbaglio sotto questo aspetto. Comunque credo che l'errore sia nella lettura del char che successivamente andrà dentro la variabile "criterio". Grazie mille in anticipo

3 Risposte

  • Re: Funzione ordinamento lista dinamica

    Penso proprio sia un problema dello scanf, non tanto delle righe di codice che ordinano la lista...
    Non sono un esperto della scanf(), infatti per capire il significato (se c'è) di "%*d%c" dovrei effettuare qualche ricerca, ma quello che mi chiedo è perchè non usare un semplice scanf("%c", &criterio)?

    Per evitare di avere un codice tanto ridondante basta usare un po' di ingegno per unire le due condizioni degli if:
    (Puntprovv->Dato <= NumProv)
    e
    (Puntprovv->Dato >= NumProv)
    sfruttando la variabile criterio.

    P.S.
    Non hai più risposto alla mia domanda nell'altro topic!?
  • Re: Funzione ordinamento lista dinamica

    Per quanto riguarda l'unione dei due if non ci ho affatto pensato ed effettivamente hai ragione tu dato che hanno moltissime righe di codice in comune. Per quanto riguarda "%*d%c" questo serve per prevenire che lo scanf legga un valore errato. Infatti quando si fanno più scanf consecutivamente, la funzione scanf legge l'ultimo dato inserito da tastiera prendendo per buono il primo dato inserito. scrivere "%*d" con l'asterisco fra il tipo e il percentuale serve a dire allo scanf:"troverai in input un dato di tipo d, ma scartalo e leggi il dato successivo(che è il %c che ho messo di fianco). Comunque ora che ci penso questa procedura va utilizzata solo nel caso di due scanf consecutivi che dorrebbero leggere uno stesso tipo di dato, quindi potrebbe essere qui l'errore.
  • Re: Funzione ordinamento lista dinamica

    Non ho neanche guardato il codice ma spesso io risolvo i problemi della scanf con fflush() che ti pulisce il buffer
Devi accedere o registrarti per scrivere nel forum
3 risposte