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

Pasar puntero en función recursiva

Estas en el tema de Pasar puntero en función recursiva en el foro de C/C++ en Foros del Web. Hola, estoy programando un árbol AVL. Cuando quiero insertar un nuevo elemento llamo a la función "insertar" que tiene como parámetros el elemento a insertar ...
  #1 (permalink)  
Antiguo 27/11/2011, 23:06
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Pasar puntero en función recursiva

Hola, estoy programando un árbol AVL. Cuando quiero insertar un nuevo elemento llamo a la función "insertar" que tiene como parámetros el elemento a insertar y un puntero al nodo raíz a partir del cual buscar su posición dentro del árbol. El problema es que solo se me inserta un elemento, el que está apuntado por el puntero raíz y cuando intento insertar más no lo hace.

El tipo nodo lo tengo así:
class nodo{
string clase;
nodo *izq, *der;
}

El puntero raiz lo tengo declarado así y al principio apunta a NULL:
nodo* raiz;

La cabecera de mi función insertar es así:
void insertar(nodo* a, string clave);

Y cuando de nuevo llamo recursivamente a insertar, lo hago, si por ejemplo es al hijo izquierdo del nodo actual, así:
insertar((*a).izq, clave);

¿Dónde puede estar el fallo? ¿Es algo relacionado con el paso por referencia de los punteros? ¿Cómo tendría que declararlos?

Gracias!!!!
  #2 (permalink)  
Antiguo 28/11/2011, 04:03
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Pasar puntero en función recursiva

En C, si quieres modificar un parametro de una funcion, en realidad tienes que pasar la direccion de memoria del dato y tienes que recibirlo en un puntero a ese dato. Si quieres modificar un puntero, pasa la direccion de memoria del puntero a modificar, recibelo en un puntero al puntero.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 28/11/2011, 07:44
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Pasar puntero en función recursiva

Podes mostrar la funcion entera?

Gracias
  #4 (permalink)  
Antiguo 28/11/2011, 12:20
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Respuesta: Pasar puntero en función recursiva

Esta es la función que estoy usando un poco simplificada:

void arbol::insertar(nodo *a, string b)
{
if(a == NULL)
{
nodo *nuevo;
nuevo = new nodo(b,0,NULL,NULL);
a = nuevo;
numElements++;
return;
}
else
{
if(b < (*a).clave)
{
insertar((*a).izq,b);

// AQUI SE RECALCULARÍAN LAS ALTURAS
}
else if(b > (*a).clave)
{
insertar((*a).der,b);

// AQUI SE RECALCULARÍAN LAS ALTURAS
return;
}
}
  #5 (permalink)  
Antiguo 28/11/2011, 14:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Pasar puntero en función recursiva

Veo que el problema era como dijo CalgaryCorpus. En esa funcion cuando haces a = nuevo; y despues haces un return. Al salir de la funcion, no se afecto realmente a lo que vos necesitabas. Ya que vos modificaste una variable local, que es un puntero. Vos podes modificar el nodo pero no a lo que apunta. Pasa lo mismo con un entero normal. Si pasas un entero por valor, al modificarlo y retornar el entero vuelve a su valor inicial. Aca pasa lo mismo, pasas un puntero, modificas su valor y cuando volves vuelve a su valor. Posible modificacion:

Código C:
Ver original
  1. void arbol::insertar(nodo **a, string b)
  2. {
  3. if(*a == NULL)
  4. {
  5. nodo *nuevo;
  6. nuevo = new nodo(b,0,NULL,NULL);
  7. *a = nuevo;
  8. numElements++;
  9. return;
  10. }
  11. else
  12. {
  13. if(b < (*a)->clave)
  14. {
  15. insertar( & ((*a)->izq),b);
  16.  
  17. // AQUI SE RECALCULARÍAN LAS ALTURAS
  18. }
  19. else if(b > (*a)->clave)
  20. {
  21. insertar( & ((*a)->der),b);
  22.  
  23. // AQUI SE RECALCULARÍAN LAS ALTURAS
  24. return;
  25. }
  26. }
  #6 (permalink)  
Antiguo 28/11/2011, 21:50
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Respuesta: Pasar puntero en función recursiva

He probado con ese código pero al compilar me sale el siguiente error en la llamada recursiva a insertar:

arbol.cpp:145:22: error: no matching function for call to ‘arbol::insertar(nodo**&, nodo**&, std::string&)’
arbol.cpp:120:6: note: candidate is: void arbol::insertar(nodo**. nodo*, std::string)

Y me está volviendo loco porque no sé por qué sale
  #7 (permalink)  
Antiguo 28/11/2011, 23:27
 
Fecha de Ingreso: febrero-2011
Ubicación: Paraguay
Mensajes: 59
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Pasar puntero en función recursiva

Que te parece algo asi?? ya que usas C++ usa las clases y es todo mas facil..
Código C++:
Ver original
  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. struct nodo_binario {
  7.     int dato;
  8.     nodo_binario* der;
  9.     nodo_binario* izq;
  10.    
  11.     nodo_binario(int valor=NULL, nodo_binario* d=NULL, nodo_binario* i=NULL) {
  12.         dato = valor;
  13.         der = d;
  14.         izq = i;
  15.     }
  16.     void insertar_derecho(int d) {
  17.         der = new nodo_binario(d);
  18.     }
  19.     void insertar_izquierdo(int d) { // Otra manera
  20.         izq = new nodo_binario(d);
  21.     }
  22. };

Etiquetas: clase, programa, puntero, recursiva, string
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 11:15.