12/01/11 12:02
-Meng0-
Ragazzi nessuno??
Non riesco a sbloccarmi, le liste di cui parliamo sono liste semplici e circolari (il puntatore next dell'ultima cella punta alla testa).
Per il raggiungimento dell'elemento da cancellare con un for riesco a scorrere l'array e di volta in volta la lista dentro ogni cella dell'array.
Con la free() eseguo la cancellazione, ma ora devo ricongiungere gli elementi e spostare tutti i successivi per ricomporre la lista.
Nessuno mi aiuta?
Non chiedo codice, ma soltanto uno spunto o qualche dritta per implementare l'algoritmo.
aaa
12/01/11 20:26
ramy1989
Quando implementi una coda (una lista circolare),la difficoltà sta nel cancellare l' elemento,perchè devi slittare tutti gli altri.
Direi che non serve utilizzare la free,semplicemente creare una nuova struttura e cancellare la precedente.
Per aggiungere un elemento non c'è alcun problema perchè lo aggiungi in testa,ma per far slittare gli elementi e riallocare ci vuole una funzione.Io tengo sempre il puntatore numerico al numero di strutture allocate:
int *num;
num=(int*)malloc(sizeof(int));
*num=0;
Ogni volta che alloco una nuova struttura eseguo :
(*num)++;
Col puntatore al prossimo elemento proprio non mi ci ritrovo,per cancellare un elemento una funzione potrebbe essere questa:
lista *cancel(lista *ptr_1, *num) // typedef struct {...}lista in testa al file
{
lista *ptr_2;
int i;
ptr_2=(lista*)calloc(*num-1,sizeof(lista)); // stessa lunghezza -1
for(i=0;i<*num-1;i++)
copy(lista_2[i],lista_1[i+1]); // costruendo una funzione per copiare le strutture
free(lista_1);
(*num)--; // il numero di strutture cala
return lista_2;
}
Se ho fatto tutto correttamente (non ho provato a compilarlo) alla fine l' array di liste restituito dovrebbe essere uguale a quello precedente,tranne che conitene una struttura in meno,quella di coda che è stata cancellata.
Ultima modifica effettuata da ramy1989 12/01/11 20:28
aaa
13/01/11 8:57
ramy1989
Per eliminare una cella mi sembra ancora più facile,basta copiare tutti gli elementi tranne quello da cancellare.
Il discorso è lo stesso,in teoria se tu hai un array di n elementi,di cui alcuni sono da cancellare,includendo stdbool.h puoi aggiungere alla struttura un bool che dice se l' elemento va tenuto o no.
Comunque quando sai quale elemento cancellare il ragionamento è lo stesso,li copi tutti in nuovo array,tranne quello da cancellare.Ovviamente il nuovo array dovrà avere la dimensione giusta,se era lungo num dovrà essere lungo num-1.
Se ne vuoi cancellare 5 il nuovo array allocato con calloc avrà num-5 elementi,poi li copi uno ad uno nel nuovo array e quello vecchio lo liberi con la free.
aaa