Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Cancellazione di un elemento in un array di liste circolari!
Forum - C/C++ - Cancellazione di un elemento in un array di liste circolari!

Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 10:15
Venerdì, 07/01/2011
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?;)

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 13:02
Mercoledì, 12/01/2011
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.

PM Quote
Avatar
ramy1989 (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/01/2011

Segnala al moderatore
Postato alle 21:26
Mercoledì, 12/01/2011
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:
Codice sorgente - presumibilmente C/C++

  1. int *num;
  2. num=(int*)malloc(sizeof(int));
  3. *num=0;


Ogni volta che alloco una nuova struttura eseguo :
Codice sorgente - presumibilmente Plain Text

  1. (*num)++;


Col puntatore al prossimo elemento proprio non mi ci ritrovo,per cancellare un elemento una funzione potrebbe essere questa:
Codice sorgente - presumibilmente C++

  1. lista *cancel(lista *ptr_1, *num)    // typedef struct {...}lista in testa al file
  2. {
  3.     lista *ptr_2;
  4.     int i;
  5.     ptr_2=(lista*)calloc(*num-1,sizeof(lista));   // stessa lunghezza -1
  6.     for(i=0;i<*num-1;i++)
  7.         copy(lista_2[i],lista_1[i+1]);                  // costruendo una funzione per copiare le strutture
  8.     free(lista_1);
  9.     (*num)--;                                                // il numero di strutture cala
  10.     return lista_2;
  11. }


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 il 12/01/2011 alle 21:28
PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 9:38
Giovedì, 13/01/2011
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:(

PM Quote
Avatar
ramy1989 (Normal User)
Newbie


Messaggi: 10
Iscritto: 06/01/2011

Segnala al moderatore
Postato alle 9:57
Giovedì, 13/01/2011
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.

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 12:38
Giovedì, 13/01/2011
:k:
Grazie mille!

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 9:21
Venerdì, 18/02/2011
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?

PM Quote