Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/11/2015, 02:50
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problema al enteder un codigo de una lista recursiva

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 original
  1. LISTA* insertar(LISTA* head,int valor){
  2.        if(head==NULL){
  3.                       head=(LISTA*)malloc(sizeof(LISTA));
  4.                       head->valor=valor;
  5.                       head->sgte=NULL;
  6.        }
  7.        else{
  8.             head->sgte=insertar(head->sgte,valor);
  9.        }
  10.  
  11.        return head;
  12. }

Si pasas un puntero vacío:

Código C++:
Ver original
  1. LISTA* insertar(LISTA* head,int valor){
  2.        if(true){
  3.                       head=(LISTA*)malloc(sizeof(LISTA));
  4.                       head->valor=valor;
  5.                       head->sgte=NULL;
  6.        }
  7.  
  8.   return head;
  9. }

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 original
  1. LISTA* insertar(LISTA* head,int valor){
  2.        if(false){
  3.        }
  4.        else{
  5.             head->sgte=insertar(NULL,valor);
  6.        }
  7.  
  8.   return head;
  9. }

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 original
  1. LISTA* insertar(LISTA* head,int valor){
  2.        if(true){
  3.                       head=(LISTA*)malloc(sizeof(LISTA));
  4.                       head->valor=valor;
  5.                       head->sgte=NULL;
  6.        }
  7.  
  8.   return head;
  9. }

es decir, crea un nodo y devuelve su puntero. Este puntero lo recoge la primera llamada:

Código C++:
Ver original
  1. head->sgte=insertar(NULL,valor);

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.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.