|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
[C]Liste
Ciao sto cercando di eliminare un elemento di una lista, ma mi da un run time error e non capisco dove sia l'errore, visual studio express mi punta a p=p->next ma non capisco dove sia l'errore, cmq ora vi passo il sottoprogramma magari gli date un'occhiata
Codice:
struct cella *elimina(struct cella *punt)//Punt è il puntatore alla testa della lista
{
struct cella *p,*temp;//p è il puntatore che scorre la lista
char name[MAX];
p=punt;
printf("Nome da eliminare\n");
scanf("%s",name);
if(p->nome==name)//Controllo che l'elemento da eliminare non sia la testa
{
temp=p;
p=p->next;
punt=p;
free(temp);
}
else
{
while(((p->next)->nome)!=name) //se non è la testa controllo in quelli successivi
{
p=p->next;
}
temp=p->next; //temp ora punta all'elemento da eliminare
if(temp->next!=NULL)//se è un elemnto in mezzo alla lista
{
p->next=temp->next;
free(temp);
}
else//se invece è la coda
{
p->next=NULL;
free(temp);
}
return(punt);//ritorno la testa
}
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" Ultima modifica di stgww : 11-02-2010 alle 11:33. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se non trova nome come si arresta il while ? Se la lista ha un solo elemento cosa succede ? Nome è una stringa ? In tal caso i confronti fra stringhe non si fanno così.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Monza
Messaggi: 3686
|
Grazie, con tutti sti esercizi mi è proprio passato di mente che stavo trattando stringhe, gli altri casi li avevo saltati per velocizzare.
Ho provato a sistemarlo Codice:
struct cella *elimina(struct cella *punt)//Punt è il puntatore alla testa della lista
{
struct cella *p,*temp;//p è il puntatore che scorre la lista
char name[MAX];
p=punt;
printf("Nome da eliminare\n");
scanf("%s",name);
if((strcmp((p->nome),name)==0))//Controllo che l'elemento da eliminare non sia la testa
{
if(p->next==NULL)
free(punt);
else
{
temp=p;
p=p->next;
punt=p;
free(temp);
}
}
else
{
while((strcmp(p->next->nome,name)!=0)&&(p->next!=NULL)) //se non è la testa controllo in quelli successivi
{
p=p->next;
}
temp=p->next; //temp ora punta all'elemento da eliminare
if(temp->next!=NULL)//se è un elemento in mezzo alla lista
{
p->next=temp->next;
free(temp);
}
else//se invece è la coda
{
p->next=NULL;
free(temp);
}
return(punt);//ritorno la testa
}
Se mi torna lista vuota basta fare un if nel main dopo la chiamata di questa funzione in cui gli dico cosa fare nel caso testa_della_lista==NULL, giusto?
__________________
" Disprezzato e reietto dagli uomini, uomo dei dolori che ben conosce il patire, come uno davanti al quale ci si copre la faccia, era disprezzato e non ne avevamo alcuna stima." ... "Maltrattato, si lasciò umiliare e non aprì la sua bocca; era come agnello condotto al macello, come pecora muta di fronte ai suoi tosatori, e non aprì la sua bocca" Ultima modifica di stgww : 11-02-2010 alle 13:15. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prima di tutto ti consiglio di scrivere così il prototipo della funzione:
struct cella *elimina(struct cella *punt, char *nome); In questo modo separi la parte algoritmica da quella di IO, che è sempre una buona cosa. Questo if non importa, il caso è già gestito automaticamente dal ramo else (mi sono sbagliato prima, non credevo che ci fosse l'if, credevo che eliminassi tutti glie elementi con nome uguale). Codice:
if(p->next==NULL)
free(punt);
else
{
temp=p;
p=p->next;
punt=p;
free(temp);
}
Codice:
if(temp->next!=NULL)//se è un elemento in mezzo alla lista
{
p->next=temp->next;
free(temp);
}
else//se invece è la coda
{
p->next=NULL;
free(temp);
}
Cosa succede se non viene trovato "nome" ? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:41.



















