|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
[C] Cancellazione elemento lista
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
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Facci vedere il codice...
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
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.
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; Ultima modifica di TeX-mAn : 06-04-2008 alle 13:27. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
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
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
Quote:
ptr cancellastudente(ptr lis (sarebbe la testa),int matricola)
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1159
|
Ti dò un abbozzo in pseudo codice, non escludo ci siano errori, devi modificartelo
Codice:
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;
}
}
}
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
Grazie mille.Ora ho capito tutto.Ciao
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
Codice:
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);
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ragazzi, secondo me non serve a niente fornire codice così, già svolto per intero. Meglio 10 volte una spiegazione a parole.
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
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
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Già che ci siamo posto una soluzione ricorsiva
Codice:
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;
}
Ultima modifica di cionci : 06-04-2008 alle 18:50. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2006
Messaggi: 371
|
Quote:
Ottimo grazie.
__________________
Processore Intel Core 2 Duo E6600 ; 2 Gb di RAM DDR2 ; Scheda video RADEON X1950 XTX da 512 mb ; |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:16.




















