vi giuro che per un attimo ho temuto di essere in una specie di incubo o di essere completamente rimbambito. ho dovuto copiare ed eseguire per tirare un sospiro di sollievo...
svegliatevi.
vi giuro che per un attimo ho temuto di essere in una specie di incubo o di essere completamente rimbambito. ho dovuto copiare ed eseguire per tirare un sospiro di sollievo...
svegliatevi.
Potresti rendere chiara al mondo la tua risposta.Originariamente inviato da rsdpzed
vi giuro che per un attimo ho temuto di essere in una specie di incubo o di essere completamente rimbambito. ho dovuto copiare ed eseguire per tirare un sospiro di sollievo...
svegliatevi.
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Vediamo il tuo algoritmo di "inversione" della lista:
Se tu hai almeno due nodi nella lista, allora curr non diventa mai uguale a NULL.codice:t_list inverti_lista(t_list lista) { printf("sono dentro"); t_node*curr; t_node*first; curr=lista; first=lista; while((curr->link)!=NULL) { (curr->link)->link=curr->link; curr=curr->link; } first->link=NULL; lista=curr; return lista; }
Supponiamo di avere due nodi, che simbolicamente chiamo A e B, A ha come successivo B dopodiché la lista finisce perché B ha NULL come valore del puntatore all' elemento successivo.
All' inizio dell' algoritmo curr punta ad A.
Con queste istruzioni:
Il puntatore al successivo di B punta ad A, e curr punta a B.codice:(curr->link)->link=curr->link; curr=curr->link;
Ora alla seconda iterazione esegui di nuovo le istruzioni (ti ricordo che il successivo di A è B e il successivo di B è B).
(curr->link)->link=curr->link; collega il successivo del successivo di B al successivo di B.Ma il successivo di B è B, così come il successivo del successivo di B è B.
Per cui nella seconda iterazione curr non cambia valore e questo vale per tutte le altre iterazioni.curr non raggiungerà mai il valore NULL e non si esce mai dal while.
Se la lista contiene un solo elemento questo problema non si verifica.
Supponiamo che ora facesse funzionare l'inverti, poi gli altri algoritmi non funzionerebbero più come dovrebbero perchè presuppongono che la lista sia ordinata...
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
@Scara. innanzitutto scusami per il tono, so che non devo farmi prendere la mano.
per il resto basta leggere il post.
@slashino. Al di la del problema algoritmico (che ti avevo gia detto e che who am i non poteva chiarirlo meglio) il mio consiglio (spassionato e gratuito) vale ancora anzi piu di prima visto che sostieni di averlo fatto il tracing: spendi piu tempo sul debug e migliora le tue capacità di tracing perchè le cose piu avanti andranno sempre peggio. Una descrizione del problema come quelle che dai tu, scusa la franchezza, sono inaccettabili. Se programmi in C devi sapere esattamente cosa sta succedendo in ogni angolo del tuo programma, al di la dei problemi logici e algoritmici.
qualche consiglio:
-Testa le funzioni sempre una alla volta prima di metterle insieme alle altre, perchè potrebbe succedere che mentre testi una, riproduci un caso partcolare che smette di far funzionare bene un'altra precedente.
- hai messo le printf prima dopo e durante il while DENTRO la funzione di inversione?
- in quelle printf nel main ci si confonde, usa di piu \n e \t
- hai un ide che ti permette di inserire i breakpoint ed eseguire il programma passo passo? inizia ad usare questi strumenti.
buon sabato![]()
Ok, grazie a tutti, siamo d'accordo sul fatto che "inversione" è sbagliata. La mia domanda era però un'altra: perchè la print_list si comporta come ho spiegato prima se inserisco "inverti_lista" (a prescindere dalla sua correttezza)? Ciò che ha detto Scara95 andrebbe bene se la chiamata alla funzione di inversione precedesse quella della print_list, e quindi quest ultima si troverebbe a lavorare su una lista non ordinata, ma non è cosi...
come è possibile ciò? penso sia questo il mio caso......Originariamente inviato da rsdpzed
perchè potrebbe succedere che mentre testi una, riproduci un caso partcolare che smette di far funzionare bene un'altra precedente.
metti questo codice dentro la funzione di inversione
ti si riempie lo schermo di "dentro il while"?codice:printf("\n\nprima del while\n\n"); t_node*curr; t_node*first; curr=lista; first=lista; while((curr->link)!=NULL) { printf("dentro il while\n"); (curr->link)->link=curr->link; curr=curr->link; } printf("\n\ndopo il while\n\n"); first->link=NULL; lista=curr; return lista;
si, ma questo l'avevo già provato. Il fatto è che non mi stampa la lista con un elemento cancellato, la cui print_list precede la funzione inverti....In che modo la funzione di inversione (sbagliata) può condizionare ciò che la precede?
ma sei sicuro? a me la print_list senza l'elemento (quello cancellato) funziona con o senza l'inversione.