PDA

Visualizza la versione completa : [C] Cancellazione da lista


teju
22-01-2005, 02:02
Voglio cancellare uno o più elementi da una lista ma quando ci provo o cancello tutta la lista o nulla... :dhò:


[...]
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

:confused:
Ho provato una cosa del genere...

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... :fagiano:

perzem
22-01-2005, 09:44
questa funzione di permette di togliere un nodo in cima alla lista


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


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

teju
22-01-2005, 13:15
Grazie, ora faccio delle prove... ho visto un'istruzione "delete" che a dire il vero non usavo mai... :zizi:

Se cmq qualcuno ha altri suggerimenti, sono ben accetti!

anx721
22-01-2005, 14:10
Delete si usa per deallocare memoria allocata con new (in c++); te per deallocare devi usare free(); prova questa versione di elimina_ostacolo:



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.

teju
22-01-2005, 21:17
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! :dhò:

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!! :dottò:

anx721
22-01-2005, 21:44
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

teju
22-01-2005, 22:42
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.... :cry:

anx721
22-01-2005, 22:53
non c'entra il compilatore; sbagli te qualkosa credo, prova a postare il programma completo

teju
22-01-2005, 22:59
:oVVoVe: 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...


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;
}

anx721
22-01-2005, 23:04
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

Loading