Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema al enteder un codigo de una lista recursiva

Estas en el tema de Problema al enteder un codigo de una lista recursiva en el foro de C/C++ en Foros del Web. Buenas, tengo un códigos de una lita recursiva que se le puede ingresar n valores. El problema es que no entiendo muy bien como funcionaria ...
  #1 (permalink)  
Antiguo 15/11/2015, 16:26
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 14 años, 5 meses
Puntos: 0
Mensaje Problema al enteder un codigo de una lista recursiva

Buenas, tengo un códigos de una lita recursiva que se le puede ingresar n valores.

El problema es que no entiendo muy bien como funcionaria en forma recursiva.

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct lista_enlazada{
       int valor;
       struct lista_enlazada *sgte;
}LISTA;

LISTA* insertar(LISTA* head,int valor);
int main(){
    LISTA* head=NULL;
    int i,valor,n;
    printf("Ingrese la cantidad de valores a ingresar\n");
    scanf("%d",&n);
    for(i=1;i<=n;i++){
                      printf("Ingrese valor %d\n",i);
                      scanf("%d",&valor);
                      head=insertar(head,valor);  /*Aqui le asignamos a head lo que devuelte la funcion, que es un tipo de dato lista.*/
    }
    return 0;
}

/*Aqui es donde no se muy bien como hacerle el seguimiento a la función, es decir el camino que toma cuando ingreso mas de 1 numero*/
LISTA* 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 alguien me puediese ayudar explicando un poco el codigo cuando se ingresa mas de un numero, unos 3 , le agradeceria mucho.
  #2 (permalink)  
Antiguo 16/11/2015, 02:20
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Problema al enteder un codigo de una lista recursiva

Entiendo entonces que el código no lo has hecho tu, cierto? En cualquier caso has de saber que es recomendable que todas las rutas de la función deberían tener un return... cuando se reserva memoria no se hace el correspondiente return y eso, aunque funcione, no debería estar así.

¿Cual es tu nivel en C? ¿Has visto alguna vez listas enlazadas? ¿Sabes como funcionan?

Quizás deberías probar a dibujar lo que va haciendo el programa en un papel. Te sorprenderías lo que se puede llegar a aprender con algo tan tonto como usar un lápiz y un papel.

En cualquier caso lo que hace la función insertar es recorrer la lista enlazada hasta llegar al final (esta es la parte recursiva). Cuando se encuentra en el final hace una reserva de memoria para el nuevo nodo.
__________________
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.
  #3 (permalink)  
Antiguo 16/11/2015, 20:21
 
Fecha de Ingreso: julio-2010
Mensajes: 31
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema al enteder un codigo de una lista recursiva

Gracias, actualmente estoy viendo listas simples, y ese codigo lo escribio un profe, pero creo que todavia no soy capza de entender al 100% como crear una lista, asi que voy a empezar por eso.
  #4 (permalink)  
Antiguo 17/11/2015, 02:50
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
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.

Etiquetas: funcion, int, lista, numero, recursiva
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:23.