Te explico un poco el funcionamiento de la llamada recursiva pero te aviso seriamente que te interesa entender el funcionamiento por tí mismo porque si no te vas a meter en la boca del lobo tu solito. Estás avisado.
La función (corregida) es la siguiente:
Código C++:
Ver originalLISTA* insertar(LISTA* head,int valor){
if(head==NULL){
head
=(LISTA
*)malloc(sizeof(LISTA
)); head->valor=valor;
head->sgte=NULL;
}
else{
head->sgte=insertar(head->sgte,valor);
}
return head;
}
Si pasas un puntero vacío:
Código C++:
Ver originalLISTA* insertar(LISTA* head,int valor){
if(true){
head
=(LISTA
*)malloc(sizeof(LISTA
)); head->valor=valor;
head->sgte=NULL;
}
return head;
}
Es decir, reserva memoria para el primer nodo y te devuelve dicho puntero
Segunda llamada.
head ya no es nulo, por lo que la función quedaría tal que:
Código C++:
Ver originalLISTA* insertar(LISTA* head,int valor){
if(false){
}
else{
head->sgte=insertar(NULL,valor);
}
return head;
}
En este caso vuelve a llamar a
insertar, pero pasando en este caso
head->sgte, que sí que es nulo, luego el código que se ejecutará es:
Código C++:
Ver originalLISTA* insertar(LISTA* head,int valor){
if(true){
head
=(LISTA
*)malloc(sizeof(LISTA
)); head->valor=valor;
head->sgte=NULL;
}
return head;
}
es decir, crea un nodo y devuelve su puntero. Este puntero lo recoge la primera llamada:
Entonces,
head->sgte deja de ser NULL y pasa a apuntar al siguente elemento de la lista... y así con el resto de nodos a insertar... se busca el final de la lista y se inserta el nuevo nodo en dicha posición.
Un saludo.