Salve ragazzi è ormai una decina di ore che mi sto cervelland per scrivere un codice che funzioni e sono senza risultati... L'obiettivo è quello di creare una funzione che ordini una lista di struct in base al campo word di ogni elemento.
La faccenda l'ho organizzata cosi:
Una funzione scorre la lista(quella disordinata) grazie ad un ciclo while e dentro al ciclo chiamo una seconda funzione a cui li passo ogni volta l'elemento a cui sono arrivato. All'interno di questa seconda funzione piglio il nuovo elemento e lo posiziono in ordine rispetto a quelli che ho posizionato prima.
ecco le due funzioni:
codice:
WList wl_sort(WList L) {
WList e = L;
L = NULL;
while( e != NULL ) {
L = wl_new_sort( L, e );
e = e->next;
}
return L;
}
WList wl_new_sort( WList L, WList e ) {
if( L == NULL ) return e;
else if( (strcmp(e->word, L->word)) <= 0 ) {
e->next = L;
return e;
}
else {
WList R = L;
while( L->next != NULL ) {
if( (strcmp(e->word, (L->next)->word)) < 0 ) {
e->next = L->next;
L->next = e;
return R;
}
L = L->next;
}
e->next = NULL;
L->next = e;
return R;
}
}
Qui vi ripropongo le stesse funzioni di prima ma ambientate insieme ad un main e una funzione che stampa la lista cosi se vi va potete fare direttamente delle prove.
codice:
#include <stdio.h>
#include <string.h>
typedef struct WElem {
char* word;
struct WElem* next;
} WElem, *WList;
WList wl_sort(WList L);
WList wl_new_sort( WList L, WList e );
void stampa_lista( WList p );
int main( void ) {
WList L;
WElem X, Y, W, V, Z;
L = &X;
X.word = "napoli";
X.next = &Y;
Y.word = "livorno";
Y.next = &W;
W.word = "hotel";
W.next = &V;
V.word = "firenze";
V.next = &Z;
Z.word = "dadada";
Z.next = NULL;
stampa_lista( L );
printf( "---\n" );
L = wl_sort(L);
printf( "---\n" );
stampa_lista( L );
}
WList wl_sort(WList L) {
WList e = L;
L = NULL;
while( e != NULL ) {
L = wl_new_sort( L, e );
e = e->next;
}
return L;
}
WList wl_new_sort( WList L, WList e ) {
if( L == NULL ) return e;
else if( (strcmp(e->word, L->word)) <= 0 ) {
e->next = L;
return e;
}
else {
WList R = L;
while( L->next != NULL ) {
if( (strcmp(e->word, (L->next)->word)) < 0 ) {
e->next = L->next;
L->next = e;
return R;
}
L = L->next;
}
e->next = NULL;
L->next = e;
return R;
}
}
/* riceve come argomento puntatore
* a primo elemento della lista */
void stampa_lista( WList p ) {
while( p != NULL ) {
printf( "%s -> ", p->word );
p = p->next;
}
printf( "NULL\n" );
}
Avendo esaurito le idee riaffronterò il problemada un altro punto di vista... memorizzo ogni membro word in un array di stringhe, ordino l'array di stringhe e ricostruisco una listascorrendo l'array di stringhe ordinato. So che fa abbastanza schifo come cosa infatti spero che voi mi diate un occhiata al codice sopra proposto
Vi ringrazio e vi saluto!