NODO *ultimo;
ultimo=*cabeza;
while(ultimo->sig!=NULL)
ultimo=ultimo->sig;
Con esto el programa revienta al procesar una lista vacía.
NODO *ultimo;
ultimo=*cabeza;
while(ultimo!=NULL)
ultimo=ultimo->sig;
Y aquí no se actualizaría correctamente si, de nuevo, la lista esta vacía.
Para insertar un nodo al final:
void insertar_ultimo(struct nodo **p, struct nodo *nodo)
{
while (*p != NULL)
p = &(*p)->sig;
*p = nodo;
}
Donde el primer argumento es la dirección en memoria de la variable que almacena la dirección en memoria del primer nodo (Ouch!), usualmente "&primero". El segundo argumento es la dirección en memoria del nodo a insertar.
Por ultimo y en el caso ideal cada función debe realizar una sola operación, por ejemplo la función que agrega pide los datos y llama a las funciones para 1) Crear un nodo y 2) Insertarlo en la lista.
Un saludo