Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
(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?
P.S. con questi numeri non ordina correttamente: 5 2 6 4 8 1 -1
Codice sorgente - presumibilmente C++
#include <iostream>
#include <stdlib.h>
usingnamespace 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";
elseif( 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";
return0;
}
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);
elseif(l -> val < x)
inserisci_coda(l, x);
}
int length(lista *l){
if(l ==NULL)
return0;
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 il 19/01/2014 alle 14:22
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
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?
Ho risolto grazie.
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?