|
|
|
![]() |
|
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 10: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 12: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: 06:22.