Oppure

Loading
07/01/11 9:15
-Meng0-
Buongiorno a tutti.
Devo implementare una funzione il più generica possibile per risolvere il problema della cancellazione di un elemento in un array di liste circolari.
Sono in alto mare, qualcuno potrebbe darmi qualche dritta da cui partire?;)
aaa
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:38
-Meng0-
Il tuo discorso è giustissimo e funziona:k:
Il problema è che io non devo eliminare un'intera struttura, bensì una cella di una di quelle strutture!
Dentro ogni cella ho una lista con tanti elementi, io devo eliminare uno di quegli elementi, un determinato elemento di una determinata lista all'interno di una determinata cella dell'array:(
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
13/01/11 11:38
-Meng0-
:k:
Grazie mille!
aaa
18/02/11 8:21
-Meng0-
Riapro questa mia vecchia discussione perchè ancora non sono riuscito a risolvere questo problema:(
Devo lavorare obbligatoriamente con la seguente struttura dati per l'implementazione della lista:

struct Cella{
char Value;
struct Cella* next;
};

Ogni cella del mio array contiene una lista circolare delle suddette celle.
Io, conoscendo l'elemento da eliminare devo scorrere tutte le celle dell'array e, per ogni cella, cercare nella lista circolare contenuta questo elemento e, eventualmente, procedere alla sua eliminazione.
Come faccio per accedere agli elementi della lista dentro ogni cella dell'array e confrontarli con quello da eliminare?
aaa