Lo primero es agradecerte el uso de nombres de variable que describen el uso que les vas a dar. Es una buena costumbre, no la pierdas.
He visto algún problema con la lógica:
Línea 79:
while(((nuevo->edad)>(actual->edad))&&(actual))
En la primera condición de la expresión lógica estás desreferenciando
actual, que puede ser
NULL. Tienes que cambiar el orden:
while((actual && (nuevo->edad)>(actual->edad)))
Así si
actual es
NULL la condición falla directamente, la segunda parte de la expresión no se evaluaría y no tendrías problemas por desreferenciar un puntero NULL. Por si alguien no lo sabe o no se acuerda, las condiciones de una expresión lógica se evalúan de izquierda a derecha, si en un
y falla una de las condiciones la expresión se evalúa automáticamente a false (en C cero) y el resto de condiciones se ignoran, con
o pasa lo contrario, si la condición que está a la izquierda es verdad directamente se evalua a true (en C no cero) y el resto no se evalúa.
En la línea 120 está sucediendo lo mismo, tienes que cambiar el orden de las condiciones de la expresión lógica. Además, ya no porque esté mal, lo tienes bien, pero si por la posibilidad de ahorrar ciclos, sabiendo que las edades están ordenadas de menor a mayor, si en lugar de comprobar si la edad del nodo actual es distinta de la edad solicitada compruebas que sea menor, sabrás que el dato que buscas está en una posición más avanzada de la lista, y si la edad del nodo actual es mayor sabrás que directamente la edad que buscas no está en la lista, así que cambiaría ese distinto por un edad_actual < edad_que_buscas (después tendrás que retocar algo el código para saber si se ha salido del bucle por no haberse encontrado (nodo nulo o edad_actual > edad_que_buscas) o porque se ha encontrado la edad.
En la línea 181 también tienes que cambiar el orden de las condiciones y aplicaría los cambios del párrafo anterior.
Más allá de lo dicho no veo ningún error por el que el programa se tenga que quedar colgado (luego le volveré a echar un ojo por si he pasado algo por alto).
¡Saludos!
Por cierto, échale un ojo a este enlace:
https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.htmlconio.h es una librería que sólo he visto implementada en compiladores de Borland. Su uso no es nada recomendable (no forma parte del estandar de C).
fflush está diseñada para que funcione sobre flujos de salida. Su uso sobre stdin queda indefinido.
Los datos se leen de la entrada estandar después de haber pulsado intro. Ésto deja un salto de línea al final de la entrada. Si utilizas scanf/fscanf ese salto de línea queda en el buffer de entrada. Para limpiar la entrada y evitar el uso de fflush sobre stdin puedes usar el siguiente código:
while(getchar() != '\n'); //leemos datos de la entrada hasta encontrar un salto de linea y asi la dejamos limpia.
Lo anterior deberías de hacerlo siempre que sepas que has acabado de leer los datos de una línea del buffer de entrada para evitar que quede "basura". Por ejemplo:
Introduce un entero:
> El usuario escribe "12 abcd culo\n";
Leemos el entero.
En el buffer de entrada queda "abcd culo\n"
Leemos datos de la entrada hasta encontrar el salto de línea.
La entrada ha quedado lista para poder leer los datos que queramos sin que la basura introducida nos moleste.
Las funciones gets/fgets también leen el salto de línea, así que no hay que limpiar nada después de usarlas (si has leído el enlace anterior sabrás porque no es recomendable el uso de gets y porqué deberías de utilizar fgets sobre stdin, sino lee post ya).
Lo mismo se puede aplicar a la situación en la que esperas a que el usuario pulse intro para continuar:
printf("Pulsar intro para continuar..."); while(getchar() != '\n'); //evitamos el uso de getch, que es una funcion exclusiva de conio.h