Hola!. Hice una lista simplemente enlazada y no me funciona en algunas partes.
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!!
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 (c) [Seleccionar]
/ 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{
system("cls");
printf("Ingrese la opcion\n\n1:Ingresar datos de una persona\n\n2:Ver datos de una persona\n\n");
printf("3:Mostrar todas las personas\n\n4:Borrar una persona\n\n5:Eliminar todas las personas\n\n6:Salir del programa\n\n");
scanf("%d",&opcion);
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;
case 6:system("cls");
exit(0);
}
}while((opcion>=1)&&(opcion<=6));
system("cls");
printf("Opcion incorrecta\n\nEl programa terminara\n\n\n");
return 0;
}
void IngresarUno(struct nodo **principio)
{
system("cls");
struct nodo *anterior,*actual,*nuevo;
nuevo=(struct nodo *)malloc(sizeof(struct nodo));
if(!nuevo)
{
printf("Error al reservar memoria\n\n");
printf("Presione una tecla para salir\n\n");
getch();
exit(1);
}
printf("Ingrese el nombre: ");
fflush(stdin);
gets(nuevo->nombre);
printf("\n\nIngrese la edad: ");
scanf("%d",&(nuevo->edad));
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;
}
}
printf("\n\n\nPresione una tecla para salir\n\n\n");
getch();
return;
}
void MostrarUno(struct nodo **principio)
{
struct nodo *actual;
int a;
actual=(*principio);
system("cls");
if(!(*principio))
{
printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
getch();
}
else
{
printf("Ingrese la edad a buscar: ");
scanf("%d",&a);
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
{
printf("\nNo se encontró la edad buscada\n\nPresione una tecla para salir\n\n\n");
getch();
}
else
{
printf("\n\nLos datos son:\n\n\n");
printf("Nombre: ");
puts(actual->nombre);
printf("\nEdad: %d\n\n",actual->edad);
printf("Presione una tecla para salir\n\n\n");
getch();
}
}
return;
}
void MostrarTodos(struct nodo **principio)
{
struct nodo *actual;
actual=(*principio);
system("cls");
if(!(*principio))
{
printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
getch();
}
else
{
while(actual)
{
printf("Nombre: ");
puts(actual->nombre);
printf("\nEdad: %d\n\n\n",actual->edad);
actual=actual->siguiente;
}
printf("Presione una tecla para salir\n\n\n");
getch();
}
return;
}
void EliminarUno(struct nodo **principio)
{
struct nodo *actual,*anterior;
int a;
system("cls");
if(!(*principio))
{
printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
getch();
}
else
{
actual=(*principio);
anterior=(*principio);
printf("Ingrese la edad a eliminar: ");
scanf("%d",&a);
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
{
printf("\nNo se encontró la edad buscada\n\nPresione una tecla para salir\n\n\n");
getch();
}
else if(anterior==actual) //Si los punteros son iguales, entonces el nodo a eliminar es el primero
{
(*principio)=((*principio)->siguiente);
free(actual);
actual=NULL;
printf("\n\nPresione una tecla para salir\n\n\n");
getch();
}
else // Si no es el primero, entonces es cualquiera de los demás
{
(anterior->siguiente)=(actual->siguiente);
free(actual);
actual=NULL;
}
}
return;
}
void EliminarTodos(struct nodo **principio)
{
struct nodo *actual;
system("cls");
if(!(*principio))
{
printf("Lista vacia\n\nPresione una tecla para salir\n\n\n");
getch();
}
else
{
actual=(*principio);
while(actual)
{
(*principio)=((*principio)->siguiente);
free(actual);
actual=(*principio);
}
printf("La lista fue eliminada\n\n\nPresione una tecla para salir\n\n\n");
getch();
return;
}
}