No se añade elemento nuevo en una lista enlazada

Iniciado por NathanD, 22 Abril 2013, 11:23 AM

0 Miembros y 1 Visitante están viendo este tema.

NathanD

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?

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

NathanD

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