PDA

View Full Version : [C]Liste


stgww
11-02-2010, 11:23
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

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

}
Grazie

cionci
11-02-2010, 12:11
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ì.

stgww
11-02-2010, 13:13
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
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



}
Ora mi da errore ad un altro sottoprogramma -visualizza- che riceve come parametro la testa della lista, prima andava, probabilmente ho sbagliato qualcosa sempre in elimina.
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?

cionci
11-02-2010, 16:12
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).

if(p->next==NULL)
free(punt);
else
{
temp=p;
p=p->next;
punt=p;
free(temp);
}

Anche questo if non serve:
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);
}
Il caso particolare è già contemplato dal ramo sopra.
Cosa succede se non viene trovato "nome" ?