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:
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: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; } }
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 propostocodice:#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" ); }
Vi ringrazio e vi saluto!![]()

Rispondi quotando
