Buenas, mi problema es el siguiente. Tengo una lista simplemente enlazada que la inicializo con los elementos de un array generados aleatoriamente. Esos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.
La estructura:
typedef struct lista{
int numero;
struct lista *siguiente;
}LISTA;
La función para crear la lista
LISTA *crearLista(int num)
{
LISTA *lista;
lista = (LISTA*) malloc( sizeof(LISTA) );
lista->numero= num;
lista->siguiente= NULL;
return lista;
}
La función de añadir un elemento:
LISTA *anyadirElementoAlPrincipio(int num, LISTA *lista)
{
LISTA *nodo_nuevo;
nodo_nuevo= (LISTA*) malloc( sizeof(LISTA) );
if(nodo_nuevo == NULL)
printf("\nNo hay sitio para más números.\n");
else
{
nodo_nuevo->numero = num;
nodo_nuevo->siguiente= lista;
}
return nodo_nuevo;
}
La función de ver la lista entera:
void mostrarLista(LISTA *lista)
{
printf("%d\n", lista->numero);
if(lista->siguiente != NULL)
mostrarLista(lista->siguiente);
}
En el main el uso de la función de añadir un elemento es exactamente igual con los elementos del array y con el introducido desde el teclado... Si ayudara en algo, decídmelo y lo pongo también.
Gracias de antemano y saludos.
PD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
Cita de: NathanD en 22 Abril 2013, 11:23 AMEsos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.
En lo general ese fragmento no tiene problemas salvo dos detalles: falta de consistencia (hay que verificar el valor de retorno de malloc en todas sus llamadas) y el problema con la función "mostrarLista" si se trata de imprimir una lista vacía.
Mejor publica el código fuente completo.
Cita de: NathanD en 22 Abril 2013, 11:23 AMPD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
No porque estarías liberando la memoria del nodo recién agregado.
Un saludo
Muchas gracias por responder rir3760, pero ya he descubierto mi fallo.
Para ejecutar las opciones, usaba la siguiente función:
void ejecutarOpcion(LISTA *lista, int opcion);
No me había dado cuenta de cuál era el fallo hasta que he copiado esa función en el main y sí funcionaba. En como parámetro tenía que pasarle la dirección de memoria de la lista, entonces había que definir el parámetro con un doble puntero, para que los cambios afectaran a todo el programa y no sólo en la función. Me alegro de haber podido corregir el fallo por mi cuenta :D
De nuevo, gracias por tu atención.
Saludos