PDA

Visualizza la versione completa : [C++] Cancellazione elementi di una lista


doctorGra
11-02-2008, 20:11
Salve, ho un problema con la cancellazione di elementi all’interno di una lista. Quello che volevo fare era, scorrere l’intera lista, se si verifica la condizione, cancellare l’elemento puntato, sia che l’elemento si trova in testa, coda o nel mezzo, e poi riusare la lista per poter aggiungere altri elementi. Il problema è che se libero la memoria FREE(temp) –vedi parte commentata- mi da errore perché il puntatore al ciclo successivo punta ad una allocazione della memoria inesistente. Quello che mi chiedo è giusto così come ho fatto? Come faccio a deallocare la memoria occupata visto che dopo un minuto supero i 2,5Gb di memoria?



typedef struct elemento
{
int val;
struct elemento *next;
struct elemento *prev;
};
struct elemento *cancellaElemento(struct elemento *pCanc){

struct elemento *temp;
while(pCanc!=NULL){
if(condizione){
//caso in cui è l’unico elemento nella lista ad essere cancellato
if(pCanc->next==NULL && pCanc->prev==NULL){
//free(pCanc);

}else if(pCanc->prev==NULL && pCanc->){
temp=pCanc;
pCanc->next->prev=NULL;
//free(temp);
//continue;
}else if(pCanc->next==NULL){
temp=pCanc;
pCanc->prev->next=NULL;
//free(temp);
//continue;
}else if(pCanc->next!=NULL && pCanc->prev!=NULL){
temp=pCanc;
pCanc->next->prev=pCanc->prev;
pCanc->prev->next=pCanc->next;
//free(temp);
}
}
pCanc=pCanc->next;
}
return pCanc;
}

doctorGra
13-02-2008, 14:12
Help me!!!
voglio qualche consiglio vi prego, sto sclerando

oregon
13-02-2008, 15:05
http://en.wikipedia.org/wiki/Linked_list

doctorGra
14-02-2008, 18:08
ho letto il link che mi hai dato e sintatticamente mi sembra giusto :dhò:
il problema è che se tento di liberare la memoria con free mi va in crash

ciao

oregon
14-02-2008, 18:23
No ... non hai letto bene il contenuto della pagina del link ...

Non e' solamente la sintassi che devi rispettare (altrimenti non compilerebbe) ...

LeleFT
15-02-2008, 09:25
Il linguaggio va espressamente indicato nel titolo, come richiesto dal regolamento.

Correggo io.


Ciao. :ciauz:

doctorGra
15-02-2008, 15:04
Grazie per aver modificato il titolo, la prox volta starò + attento. :)

doctorGra
15-02-2008, 15:05
ciao,
ti ringrazio dell'aiuto che mi hai dato, ma nn sono riuscita ancora a capire l'errore.
Comunque vediamo di procedere passo passo.
Considerando il link che mi hai dato, le liste doppiamente concatenate o doubly-linked sono rappresentate così

[NULL|dato|next]<=>[prev|dato|next]<=>[prev|dato|next]<=>...<=>[prev|dato|NULL]

io ho aggiungo elementi alla lista nel seguente modo:



struct elemento *aggiungiElemento(struct elemento *p, int valore)
{
//aggiunge in testa



struct elemento *punt;

if(p != NULL)
{
// creazione Nodi successivi
punt = (struct elemento *)malloc(sizeof(struct elemento));
punt->val = valore;
// Metto il puntatore in testa alla lista
punt->next = p;
punt->prev = NULL;
p->prev = punt;

} else {

p = (struct elemento *)malloc(sizeof(struct elemento));
p->val = valore;
p->next = NULL;
p->prev = NULL;
punt = p;
}
return(punt);

}


Non ci dovrebbero essere errori, ma se ci sono segnalameli, oppure dimmi il perchè ho fatto in quel modo ed io proverò a rispondere.

per quanto riguarda la cancellazione io volevo fare in questo modo, ma nn so se è fattibile: scorro l'intera lista, se dati è maggiore di un certo valore, cancellare il nodo con dati maggiore di valore; come ho scritto all'inizio la funzione cancellaElemento diciamo che l'elemento nn c'è ma nn possso liberare la memoria.

P.S. Aiutami a trovare la retta via :confused:

doctorGra
15-02-2008, 17:33
Forse ho capito, bisogna mettere un puntatore alla testa della lista ed una alla coda?...ma nn so come fare!!!!!
:bhò:

Loading