Oppure

Loading
19/01/14 13:21
bububs
(Premetto che la lezione non l'ho seguita causa malattia, quindi ho visto per conto mio questa parte dei puntatori a struct)

L'esercizio consiste nel leggere una sequenza di numeri interi, terminata da un
numero negativo, e la memorizza in una lista concatenata in modo tale che risulti
ordinata in senso crescente. Ho provato però non capisco perchè non funziona in certi casi. Sapreste aiutarmi? :d

P.S. con questi numeri non ordina correttamente: 5 2 6 4 8 1 -1

#include <iostream>
#include <stdlib.h>

using namespace std;

struct lista{
    int val;
    lista *next;
};

void inserisci_testa(lista *&l, int x);
void inserisci_coda(lista *&l, int x);
void inserisci_ordinato(lista *&l, int x);
int length(lista *l);
void stampa_lista(lista *&l);

int main()
{
    int x;
    lista *l1 = NULL;
    cout << "Dai una sequenza di numeri interi (negativo per smettere):\n";
    do{
        cin >> x;
        if(x >= 0)
            inserisci_ordinato(l1, x);
    } while(x >= 0);
     if( length(l1) == 0 )
        cout << "\nLetto e memorizzato nessun numero\n";
    else if( length(l1) == 1 )
        cout << "\nLetto e memorizzato un solo numero\n";
    else
        cout << "\nLetti e memorizzati "<< length(l1) << " numeri\n";
    cout << "\nSequenza ordinata:\n";
    stampa_lista(l1);

    cout << "\n\n";
    return 0;
}

bool lista_vuota(lista *l){
     return (l == NULL);
}

void inserisci_testa(lista *&l, int x){
    lista *t = new lista;
    t -> val = x;
    t -> next = l;
    l = t;
}

void inserisci_coda(lista *&l, int x){
    if( lista_vuota(l) )
        inserisci_testa(l, x);
    else{
        lista *t;
        for(t = l; t -> next != NULL; t = t -> next);
        t -> next = new lista;
        t -> next -> val = x;
        t -> next -> next = NULL;
    }
}

void inserisci_ordinato(lista *&l, int x){
    if(lista_vuota(l) || l -> val >= x)
        inserisci_testa(l, x);
    else if(l -> val < x)
        inserisci_coda(l, x);
}

int length(lista *l){
    if (l == NULL)
        return 0;
    else
        return ( length(l -> next) + 1 );
}

void stampa_lista(lista *&l){
    lista *t = new lista;
    for(t = l; t != NULL; t = t -> next)
        cout << t -> val << "  ";
}

Ultima modifica effettuata da bububs 19/01/14 13:22
aaa
19/01/14 15:36
Ultimo

Il confronto lo fa sempre col primo valore puntato della struttura Lista, quindi il 4 risulterà maggiore del 2
e quindi verrà messo dopo il 6, quindi nessun errore
If ok Then GOTO Avanza else GOTO Inizia

19/01/14 15:51
bububs
Intanto grazie per la risposta.
Ma se io volessi invece la lista ordinata e quindi invece di: 1 2 5 6 4 8, questo: 1 2 4 5 6 8, come dovrei cambiare il codice?
aaa
19/01/14 16:03
Ultimo

Potresti inserire un semplice Bubble Sort
If ok Then GOTO Avanza else GOTO Inizia

20/01/14 11:53
bububs
Ho risolto grazie. :k:
Mi è sorto un altro dubbio.. se volessi scambiare il primo elemento della lista con un puntatore passato alla funzione, del tipo: scambia(lista *&l, lista *p){} come dovrei comportarmi?
aaa