Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21
  1. #11
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Caiodark
    Altra cosa è non usare un costrutto perché ci sono un sacco di compilatori che si basano su dialetti C non ISO che non implementano parte del linguaggio.
    Infatti, ho solo detto ... occhio ... perché la particolare implementazione del compilatore (in particolare quello che ho indicato con cui si verifica l'errore e che è ampiamente usato) potrebbe causare problemi con quello specifico codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #12
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Il problema è che in quell' if non ci entra mai.
    Il valore più piccolo (o uguale) a quello cercato è in prec, non in curr.
    Per cui la condizione:

    codice:
    if(prec!=NULL && equal(inf,curr->info))
    Va sostituita con:

    codice:
    if(prec!=NULL && equal(inf,prec->info))
    Ma ora devi rivederti il codice contenuto dell' if, che ovviamente non funzionerà.Devi riscriverlo tenendo conto che prec è il nodo da cancellare.
    Posta anche il codice della struttura t_node.

  3. #13
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Who am I
    Il problema è che in quell' if non ci entra mai.
    Non hai letto bene il mio messaggio ... si riferiva a

    while((curr!=NULL) && greater(inf,curr->info))

    e non ad una if ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #14
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Scusa, ma non capisco. Il mio algoritmo sembra corretto. Quando viene a mancare la condizione
    codice:
    greater(inf,curr->info)==true
    significa che il nodo cui punta "curr" non è più grande del nodo da cancellare. Quindi controllo che sia uscito proprio per questo motivo e non per la condizione
    codice:
    curr!=NULL
    con
    codice:
    if(curr!=NULL && equal(inf,curr->info))
    la quale mi assicura anche che il nodo su cui mi sono fermato è uguale al nodo di confronto ( dato che, essendo la lista ordinata, non avrebbe senso continuare a cercare se è semplicemente minore). In definitiva il nodo da cancellare è quello che ha fatto sì che il ciclo while si interrompesse, ovvero curr. "prec" lo suo per "legare" l'elemento prima del nodo da cancellare con quello dopo...

    dove è sbagliato il mio ragionamento?

  5. #15
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    E' vero, dopo il while l' elemento contenuto in curr deve essere maggiore o uguale a inf.
    Per cui quell' if va bene.
    Però penso che non ci entra comunque in quel blocco di codice.Prova ad aggiungere una fprintf di debug per verificarlo:

    codice:
    t_list node_delete(t_list lista,t_info inf)
    {
    	t_node* prec=NULL;
    	t_node* curr=lista;
    	while((curr!=NULL) && greater(inf,curr->info))
    	{
    		prec=curr;
    		curr=curr->link;
    	}
    	if(prec!=NULL && equal(inf,curr->info))
    	{
                fprintf(stderr,"Se stampa questa riga è entrato nell' if");
    	    if(prec==NULL)
    		{
    			lista=curr->link;
    		}
    		else
    		{
    			prec->link=curr->link;
    		}
    		free(curr);
    		return lista;
    	}
    	return lista;
    	
    }
    @oregon: Ma io parlavo dell' if.

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Who am I
    @oregon: Ma io parlavo dell' if.
    Allora non ci siamo capiti ... tu avevi risposto subito dopo la mia risposta ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #17
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Avendo cancellato per sbaglio il programma che vi ho linkato, ho riutilizzato la stessa funzione in un altro e mi sono accorto che funziona, ovvero entra nel while, ma solo se chiedo di cancellare un elemento che non sia il primo. Avendo cambiato struttura, mi viene da pensare che prima l'errore fosse nella funzione "equal" anche se sembra che vada bene...che ne pensate?

  8. #18
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Il problema sta nel fatto che se l'elemento è il primo
    codice:
      greater(inf,curr->info)
    viene a mancare sin da subito, e quindi prec rimane inizializzato a NULL e ciò genera il fatto che non entra nel ciclo!



    edit: ho detto una cavolata perchè avevo fatto copia/incolla dal codice che avevo postato sul forum , che era sbagliato in un punto.....la funzione adesso va bene.................................

  9. #19
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Quindi ora va bene anche se cancelli il primo elemento della lista?

  10. #20
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Si, ma è assurda come cosa. Anche la "equal" che ho postato qui sul forum sembra corretta....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.