Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Cancellazione da lista

    Voglio cancellare uno o più elementi da una lista ma quando ci provo o cancello tutta la lista o nulla...

    codice:
    [...]
    typedef struct OSTACOLO
    {
    	int x0, x1, y0, y1;
    	struct OSTACOLO *suc;
    } OSTACOLO;
    
    OSTACOLO *Ostacolo = NULL;
    
    int inseriscoInTesta(int a, int b, int c, int d)
    {
    	OSTACOLO *nuovo;
    
    	nuovo = malloc(sizeof(OSTACOLO));
    	nuovo->x0 = a;
    	nuovo->y0 = b;
    	nuovo->x1 = c;
    	nuovo->y1 = d;
    	nuovo->suc = Ostacolo;
    
    	Ostacolo = nuovo;
    
    	return 0;
    }
    
    int main(void)
    {
    	[...]
    	inseriscoInTesta(a, b, c, d);
    	[...]
    	elimina(x, y);
    	[...]
    }
    ...e fin qui tutto OK...
    Il problema viene quando devo scorrere tutta la lista ed eliminare tutti quegli ostacoli che soddisfano TUTTE queste condizioni:
    ostacolo_corrente->x0 <= a
    a <= ostacolo_corrente->x1
    ostacolo_corrente->y0 <= b
    b <= ostacolo_corrente->y1



    Ho provato una cosa del genere...
    codice:
    int elimina(int a, int b)	// NON FUNZIONA
    {
    	if(Ostacolo != NULL)
    		Ostacolo = elimina_ostacolo(Ostacolo, a, b);
    	return 0;
    }
    
    OSTACOLO *elimina_ostacolo(OSTACOLO *primo, int a, int b) // NON FUNZIONA
    {
    	OSTACOLO secondo;
    
    	primo = elimina_ostacolo(primo->suc, a, b);
    
    	if(primo != NULL)
    	{
    		if(primo->x0 <= a && a <= primo->x1)
    		{
    			if(primo->y0 <= b && b <= primo->y1)
    			{
    				printf("da eliminare: %d %d %d %d\n", primo->x0, primo->y0, primo->x1, primo->y1);
    			}
    		}
    	}
    	return primo;
    }
    ...con scarsisssssssimi risultati...
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    questa funzione di permette di togliere un nodo in cima alla lista

    codice:
    void delete_start_node()
       { node *temp;
         temp = start_ptr;
         start_ptr = start_ptr->nxt;
         delete temp;
       }
    e questa lo toglie alla fine

    codice:
    void delete_end_node()
       { node *temp1, *temp2;
         if (start_ptr == NULL)
              cout << "The list is empty!" << endl;
         else
            { temp1 = start_ptr;
              while (temp1->nxt != NULL)
                 { temp2 = temp1;
                   temp1 = temp1->nxt;
                 }
              delete temp1;
              temp2->nxt = NULL;
            }
       }
    vedi te se manipolandole riesci a tirare fuori qualcosa

  3. #3
    Grazie, ora faccio delle prove... ho visto un'istruzione "delete" che a dire il vero non usavo mai...

    Se cmq qualcuno ha altri suggerimenti, sono ben accetti!
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Delete si usa per deallocare memoria allocata con new (in c++); te per deallocare devi usare free(); prova questa versione di elimina_ostacolo:

    codice:
    OSTACOLO *elimina_ostacolo(OSTACOLO *primo, int a, int b){
    	if(primo == NULL)
    		return NULL;
    	if(primo->x0 <= a && a <= primo->x1){
    		if(primo->y0 <= b && b <= primo->y1){
    			OSTACOLO temp = primo -> suc;
    			free(primo);	
    			return elimina_ostacolo(temp, a, b);
    		}
    	}
    	primo -> suc = elimina_ostacolo(primo -> suc, a, b);
    	return primo;
    }

    Non l'ho provata comunque.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Originariamente inviato da anx721
    Delete si usa per deallocare memoria allocata con new (in c++); te per deallocare devi usare free(); prova questa versione di elimina_ostacolo:
    L'ho provata e funziona fino a quando ho la lista di n caratteri e ne elimino solo una parte, non tutti. Appena devo eliminarli tutti mi va in crash!

    Mi spiego: metti che inserisco un ostacolo con coordinate 1,1 100,100
    e un altro con coordinate 2,2 50,50. Se faccio partire la elimina dal main chiamando
    Testa_ostacoli = elimina_ostacolo(Testa_ostacoli, a, b);
    con a, b = 60, 60 mi cancella correttamente il primo lasciando in lista l'altro... Se però i miei a, b sono = 4, 4 (cioè devo eliminare entrambi gli ostacoli) si impalla!!
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    l'ho provata, funziona, almeno l'eliminazione in se, se poi e sbagliatala condizione degli if che hai scritto tu non so, ma l'eliminazione degli elementi funziona corettamente e non c'è nessun crash

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  7. #7
    Originariamente inviato da anx721
    l'ho provata, funziona, almeno l'eliminazione in se, se poi e sbagliatala condizione degli if che hai scritto tu non so, ma l'eliminazione degli elementi funziona corettamente e non c'è nessun crash
    Può essere che il mio compilatore (il GCC) non accetti qualche istruzione?
    Ho già spostato infatti la dichiarazione della variabile TEMP a inizio funzione, poi per il resto te l'ho detto, funziona bene sempre (non centrano le condizioni dunque), a parte quando la lista ha un solo elemento, che devo cancellare, e lì si impianta il programma....
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    non c'entra il compilatore; sbagli te qualkosa credo, prova a postare il programma completo

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  9. #9
    VVoVe: il programma completo sono più di 1000 righe...

    Cmq questa è la parte di cancellazione ostacoli, nessun'altra funzione attuale tocca la lista, dunque è superfluo mettertela...

    codice:
    struct OSTACOLO
    {
    // Come sopra riportato
    }
    
    OSTACOLO *Ostacolo = NULL;
    
    int main(void)
    {
    	// l'inserimento te l'ho già postato ed è tutto OK
    
    	// Cancellazione:
    	elimina(a, b);
    }
    
    void elimina(int a, int b)
    {
    	if(Ostacolo!=NULL)
    		Ostacolo = elimina_ostacolo(Ostacolo, a, b);
    }
    
    OSTACOLO *elimina_ostacolo(OSTACOLO *primo, int a, int b)
    {
    	OSTACOLO *temp;
    
    	if(primo->x0 <= a && a <= primo->x1)
    	{
    		if(primo->y0 <= b && b <= primo->y1)
    		{
    			temp = primo->suc;
    			free(primo);
    			if(temp != NULL)
    				return elimina_ostacolo(temp, a, b);
    			else
    				return NULL;
    		}
    	}
    	if(primo->suc != NULL)
    		primo->suc = elimina_ostacolo(primo->suc, a, b);
    
    	return primo;
    }
    .: Teju.it - Una vita da raccontare
    .: 8s8.it - Wordpress gratis per tutti
    .: Vado.li - Accorcia URL

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    probabilmente sbagli a fare altro
    fai un altro programma in cui ti limi a costruire la lista e a togliere gli elementi e vedi cosa succede

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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 © 2024 vBulletin Solutions, Inc. All rights reserved.