PDA

Visualizza la versione completa : [C] Problema eliminazione elemento da lista


DreamBack
21-08-2016, 17:06
Ciao a tutti! Sono uno studente e sono registrato da poco nel forum.
Ho un problema.
Sto studiando C e, in un esercizio, mi viene chiesto di gentire una semplice rubrica telefonica, in grado di gestire 4 funzioni: 1- Aggiungi contatto; 2-Visualizza nome e numero associati; 3-Elimina contatto tramite nome; 4-Ordina rubrica per nome
Sono rimasto bloccato con la terza funzione in quanto, se il contatto (quindi l'elemento) l'ultimo della lista, questi non viene eliminato :dh:

Vi posto qua il codice:
https://gist.github.com/anonymous/e50d18265657a5f5a6b3ffdff1bce1c7

Grazie :)

torn24
22-08-2016, 18:06
Io la implementerei in modo diverso, visto che esistono tanti esempi online che potresti copiare, ti posto anche questo :)





List *DeletebyName(List *first, char a[100]){
List *tmp, *first1=first;
if (first!=NULL){
// Caso primo nodo da eliminare perdo riferimento a inizio lista che viene elinato
if (strcmp(a, first1->name)==0){
tmp=first1;// salvo il puntatore al nodo da cancellare
first1=first1->n; // scorro la lista, se l'ultimo nodo first diviene null
first=first1; // prino nodo della lista da restituire
free(tmp);
return (first);
}
while(first1!=NULL){
if (strcmp(a, first1->name)==0){
tmp=first1;// salvo il puntatore al nodo da cancellare
first1=first1->n; // scorro la lista, se l'ultimo nodo first diviene null
free(tmp);
return (first);
}
else{

first1=first1->n;
}
}
}
else{
return 0;
}






return (first);
}

torn24
23-08-2016, 11:53
Leggendo oggi il post, mi sono accorto che l'esempio errato, una correzione fondamentale.






List *DeletebyName(List *first, char a[100]){
List *tmp, *first1=first;
if (first!=NULL){
// Caso primo nodo da eliminare perdo riferimento a inizio lista che viene elinato
if (strcmp(a, first1->name)==0){
tmp=first1;// salvo il puntatore al nodo da cancellare
first1=first1->n; // scorro la lista, se l'ultimo nodo first diviene null
first=first1; // prino nodo della lista da restituire
free(tmp);
return (first);
}
while(first1->n!=NULL){
if (strcmp(a, first1->n->name)==0){
tmp=first1->n;// salvo il puntatore al nodo da cancellare
first1->n=first1->n->n; // NON DEVO SCORRERE MA PASSARE AL SUCCESSIVO
//SALTANDO IL NODO DA ELIMINARE
free(tmp);
return (first);
}
else{

first1=first1->n;
}
}
}
else{
return 0;
}

Loading