No logro ver donde están los errores
Cuando ingreso un nodo al final de la lista (líneas 89 a 93), el programa se cuelga.
Cuando ingreso un dato que no existe para verlo (lineas 122 a 125), en lugar de mostrar el mensaje de que el dato no se encontró, también se cuelga.
Idem anterior cuando quiero eliminar un dato e ingreso uno que no existe (lineas 186 a 190)
Aquí está el código
Gracias!!
Código
/ Lista simplemente enlazada que permite ingresar el nombre y la edad de personas // Va ingresando los datos ordenados de menor a mayor según la edad de la persona // Ademas el programa permite mostrar los datos de todas las personas o de una en particular, // eliminar una determinada persona o a todas #include <stdio.h> #include <conio.h> #include <stdlib.h> struct nodo{ char nombre[40]; int edad; struct nodo *siguiente; }; void IngresarUno(struct nodo **); void MostrarUno(struct nodo**); void MostrarTodos(struct nodo **); void EliminarUno(struct nodo **); void EliminarTodos(struct nodo **); int main() { int opcion; struct nodo *p; p=NULL; do{ printf("3:Mostrar todas las personas\n\n4:Borrar una persona\n\n5:Eliminar todas las personas\n\n6:Salir del programa\n\n"); switch(opcion) { case 1:IngresarUno(&p); break; case 2:MostrarUno(&p); break; case 3:MostrarTodos(&p); break; case 4:EliminarUno(&p); break; case 5:EliminarTodos(&p); break; } }while((opcion>=1)&&(opcion<=6)); return 0; } void IngresarUno(struct nodo **principio) { struct nodo *anterior,*actual,*nuevo; if(!nuevo) { } if(!(*principio)) // Si no hay ningún nodo en la lista, creo el primero { (*principio)=nuevo; nuevo->siguiente=NULL; } else { anterior=(*principio); actual=(*principio); while(((nuevo->edad)>(actual->edad))&&(actual)) //Mientras la edad del nodo nuevo sea mayor que la del nodo actual y mientras { //no haya llegado al final de la lista, me voy desplazando por la lista anterior=actual; //actualizando los punteros para evaluar el siguiente nodo actual=(actual->siguiente); //Cuando salga del while tendre el lugar donde tengo que ubicar el nuevo nodo, y } //puede ser al principio de la lista, al final, o entre dos nodos if(anterior==actual) //Si el nuevo nodo va al principio de la lista, los punteros son iguales { (*principio)=nuevo; (nuevo->siguiente)=actual; } else if(!actual) //Si llegue al final de la lista(el puntero actual apunta a NULL), entonces el elemento nuevo sera { //el último elemento de la lista (anterior->siguiente)=nuevo; (nuevo->siguiente)=NULL; } else //Si no es ninguno de los casos anteriores, entonces el nuevo elemento va entre otros dos { (anterior->siguiente)=nuevo; (nuevo->siguiente)=actual; } } return; } void MostrarUno(struct nodo **principio) { struct nodo *actual; int a; actual=(*principio); if(!(*principio)) { } else { while((a!=(actual->edad))&&actual) //Mientras no coincida la edad que busco con la del nodo, actualizo el puntero para leer el siguiente actual=actual->siguiente; if(!actual) //Si llegué al final de la lista, entonces no encontré la edad buscada { } else { } } return; } void MostrarTodos(struct nodo **principio) { struct nodo *actual; actual=(*principio); if(!(*principio)) { } else { while(actual) { actual=actual->siguiente; } } return; } void EliminarUno(struct nodo **principio) { struct nodo *actual,*anterior; int a; if(!(*principio)) { } else { actual=(*principio); anterior=(*principio); while((a!=(actual->edad))&&actual) //Mientras no coincida la edad que busco con la del nodo, actualizo el puntero para leer el siguiente { anterior=actual; actual=actual->siguiente; } if(!actual) //Si llegué al final de la lista, entonces no encontré la edad buscada { } else if(anterior==actual) //Si los punteros son iguales, entonces el nodo a eliminar es el primero { (*principio)=((*principio)->siguiente); actual=NULL; } else // Si no es el primero, entonces es cualquiera de los demás { (anterior->siguiente)=(actual->siguiente); actual=NULL; } } return; } void EliminarTodos(struct nodo **principio) { struct nodo *actual; if(!(*principio)) { } else { actual=(*principio); while(actual) { (*principio)=((*principio)->siguiente); actual=(*principio); } return; } }