PDA

View Full Version : [C] Cancellazione elemento lista


TeX-mAn
06-04-2008, 08:08
Ciao a tutti ho un problema.Non riesco a capire come faccio a cancellare un elemento a mia scelta presente in una lista.Riesco a cancellare il primo ma non riesco a cancellare gli elementi presente all'interno della lista.Aspetto un vostro aiuto.Grazie:)

cionci
06-04-2008, 08:47
Facci vedere il codice...

TeX-mAn
06-04-2008, 10:22
Facci vedere il codice...

Devo fare un programma di gestione di un archivio di studenti,struttura avente Matricola,Cognome,nome e un puntatore alla struttura studente per creare una lista.

struct Studente{
int Matricola;
Stringa Cognome;
Stringa Nome;
struct Studente *next;
}
typedef struct Studente *ptr;

Devo creare delle funzioni di inserimento Studente,cancellazione Studente,Stampa Studenti...ecc...

Ho un problema con la funzione di cancellazione del tipo:
ptr cancellastudente (ptr lis,int matricola);
Praticamente gli passo la matricola dello studente da cancellare,la funzione fa una verifica con le matricole presenti nell'archivio,se la trova cancella lo studente.
Ora il mio problema è che nn so come cancellare un elemento nella lista senza perdere la testa della lista.

Spero di essere stato chiaro.

carter100
06-04-2008, 10:31
Devi mantenerti altri 2 puntatori, con uno (diciamo p) scorri la lista fino all'elemento da levare, l'altro punta all'elemento precedente. Quando trovi l'elemento mandi il precedente a collegarsi al successivo di p. Non so se sono stato chiaro, ma come hai notato, non puoi scorrere con la testa, quella resta ferma

TeX-mAn
06-04-2008, 13:30
Devi mantenerti altri 2 puntatori, con uno (diciamo p) scorri la lista fino all'elemento da levare, l'altro punta all'elemento precedente. Quando trovi l'elemento mandi il precedente a collegarsi al successivo di p. Non so se sono stato chiaro, ma come hai notato, non puoi scorrere con la testa, quella resta ferma

Mi potresti scrivere il codice della funzione

ptr cancellastudente(ptr lis (sarebbe la testa),int matricola)

carter100
06-04-2008, 13:46
Ti dò un abbozzo in pseudo codice, non escludo ci siano errori, devi modificartelo

struct studente s, *p,*q;
p=testa;
q=null;
if ( la matricola del primo elemento è da eliminare)
{
testa=testa->next; //cambi la testa
free (p)
}
else
{
while (non trovi l'elemento o non termina la lista)
{
if (p punta all'elemento da levare)
{
q->next=p->next;
free (p);
}
else
{
q=p;
p=p->next;
}
}
}


In sostanza, ti devi mantenere un puntatore per scorrere la lista dall'inizio alla fine (p) e 1 altro che precede p di una posizione (q). Se trovi l'elemento, colleghi l'elemento di q col successivo di p, altrimenti continui a scorrere

TeX-mAn
06-04-2008, 14:47
Grazie mille.Ora ho capito tutto.Ciao :)

..::DAVE::..
06-04-2008, 14:50
ptr cancellastudente (ptr lis,int matricola)
{
ptr temp,prec;

temp=lis->next;
prec=lis;

if(prec->matricola==matricola)
{
delete prec;
return temp;
}

while(temp!=NULL)
{
if(temp->matricola==matricola)
{
prec->next=temp->next;
delete temp;
}
prec=temp;
temp=temp->next;
}

return lis;
}

testa=cancellastudente(testa,matricola);

dovrebbe essere così

cionci
06-04-2008, 15:03
Ragazzi, secondo me non serve a niente fornire codice così, già svolto per intero. Meglio 10 volte una spiegazione a parole.

..::DAVE::..
06-04-2008, 15:34
Ragazzi, secondo me non serve a niente fornire codice così, già svolto per intero. Meglio 10 volte una spiegazione a parole.

non hai tutti i torti in effetti, però se uno vuole capire/imparare guarda il codice, se capisce bene, se ha dei dubbi poi chiede.

cionci
06-04-2008, 15:37
non hai tutti i torti in effetti, però se uno vuole capire/imparare guarda il codice, se capisce bene, se ha dei dubbi poi chiede.
E se invece doveva fare un esercizio ? Gli avete dato la soluzione già pronta :D

..::DAVE::..
06-04-2008, 16:21
E se invece doveva fare un esercizio ? Gli avete dato la soluzione già pronta :D

chi è causa del suo mal pianga se stesso... se fa degli esercizi alla fine (presumibilmente) avrà una prova e li non ci sarà nessun forum:)

TeX-mAn
06-04-2008, 16:43
Raga basta ^^ grazie a tutti e due...Ora ho capito come funziona la cancellazione di un elemento all'interno di una lista :)
Sono riuscito a completare il programmino e ora funziona!!!!^^
Grazie ancora...CIAOOOOOOO alla prossima ( che spero nn ci sia :p )

cionci
06-04-2008, 16:52
Già che ci siamo posto una soluzione ricorsiva ;)

ptr cancellastudente(ptr lis, int matricola)
{
if(!lis) return NULL;
if(lis->matricola == matricola)
{
ptr tmp = lis->next;
free(lis);
return tmp;
}
lis->next = cancellastudente(lis->next, matricola);
return lis;
}

TeX-mAn
06-04-2008, 19:11
Già che ci siamo posto una soluzione ricorsiva ;)

ptr cancellastudente(ptr lis, int matricola)
{
if(!lis) return NULL;
if(lis->matricola == matricola)
{
ptr tmp = lis->next;
free(lis);
return tmp;
}
lis->next = cancellastudente(lis->next, matricola);
return lis;
}



Ottimo grazie.