La lista non viene ordinata a causa della definizione della funzione di ordinamento:
void Ordina(L l); //E' come se scrivessi 'void Ordina(struct Nodo *l);
In C le variabili alle funzoni vengono passate solo per 'valore' (non abbiamo come il C++ situazioni come 'void Ordina(L &l)' ). infatti quando si passa ad una generica funzione un puntatore, viene 'istanziato' ex novo un puntatore temporaneo con il 'valore' di quello passato alla funzione stessa. Per cui, nel caso il valore del puntatore (e non il valore del dato puntato, occhio eh) viene modificato nella funzione, lo stesso non accade al puntatore usato come parametro di input, dato che in pratica sono due variabili distinte e separate. un esempio:
void Next(int* p){
p++; //incrementiamo il valore del puntatore, non del dato puntato
printf("\nil valore di p è %p ed il suo indirizzo in memoria è %p",p,&p);
}
int main(){
int array[10]; //array di 10 elementi;
int *pArray = array //pArray punterà al primo elemento , identico a pArray = &array[0];
printf("\npArray, valore prima di Next(): %p",pArray); //stampiamo il valore di pArray, ovvero l'indirizzo in memoria del prio elemento;
//facciamo caso che sia 0x2c2c2c2c
Next(pArray);
printf("\npArray, valore dopo la Next(): %p . pArray è allocato in memoria nella posizione %p",pArray,&pArray); //pArray è rimasto invariato dopo la Next, perchè la funzione ha operato sulla variabile 'locale' p;
//quindi pArray vale sempre 0x2c2c2c2c
return 0;
}
In base al codice di cui sopra, noterai che i due indirizzi in memoria di p e di pArray sono diversi.
Se vui modificare il valore 'del puntatore' con una funzione hai due possibilità:
.la prima è che fai ritornare dalla funzione il valore'modificato' del puntatore: ad esempio:
int* Next(int *p){return (p+1)};
int main(){
int *p=0x2c2c2c00;
p=Next(p); //assegno a p il valore calcolato da Next(), dopo tale chiamata varrà 0x2c2c2c04
return 0;
}
.la seconda possibilità è quella di passare alla funzione l'indirizzo del puntatore, cioè un 'puntatore a puntatore', un esempio:
void Next(int **p){
*p++; //ora aumento il 'valore' del dato puntato da p, cioè il valore del puntatore passato come parametro;
}
int main(){
int *p=0x2c2c2c00;
Next(&p); //passo alla funzione l'indirizzo i memoria del puntatore;
cout<<p; //stamperà a video 0x2c2c2c04
return 0;
}
per cui, in base al tuo codice , modifica Ordina() in:
L Ordina(L l);
//oppure
void Ordina(L *l);
nella prima versione:
L Ordina(L l){
L p=l; //variabile temporanea per ordinare;
/*
effettua le operazioni necessarie per l'ordinamento
*/
return p; //ritorni la lista ordinata
}
nella seconda versione:
void Ordina(L *l){
L p= *l ; //usi una variabile temporanea per l'ordinamento
/*
effettua le operazioni necessarie per l'ordinamento
*/
*l=p; //assegni la nuova lista al dato puntato da l;
}
Prova a fare una delle due modifiche e facci sapere se funziona o no .