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

Interrogante ante un árbol binario

Estas en el tema de Interrogante ante un árbol binario en el foro de C/C++ en Foros del Web. Esta tarde he estado trabajando sobre la interfaz de un árbol binario de búsqueda. El caso es que en principio funciona, con la excepción de ...
  #1 (permalink)  
Antiguo 29/05/2012, 16:42
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Interrogante ante un árbol binario

Esta tarde he estado trabajando sobre la interfaz de un árbol binario de búsqueda.

El caso es que en principio funciona, con la excepción de que no busca el dato que le pida (Vamos, que no funciona).

En Linux no tengo depurador, por lo que no he podido seguir los valores de las variables, pero en cualquier caso, si alguno que tenga tiempo puede echarle un vistazo y decirme si ve algún error, estaría encantado.

De primeras, a mi juicio, el error tiene que estar, o en la función anadir, o en la función buscar... pero vaya, que nunca se sabe :/

Código C:
Ver original
  1. /*Este programa crea un árbol binario de búsqueda y permite añadir datos
  2. y buscarlos. Está basado en funciones recursivas.*/
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. /*Declaraciones globales*/
  8. typedef struct nodo{
  9. int clave;
  10. struct nodo *derecho;
  11. struct nodo *izquierdo;
  12. }nodo;
  13.  
  14. nodo *raiz; //Raiz del arbol, externa al programa.
  15.  
  16. /*Prototipo de funciones*/
  17. void crear_arbol(void);
  18. nodo *anadir(int clave, nodo *r);
  19. void borrar_arbol(nodo *r);
  20. nodo *buscar(int clave, nodo *r);
  21. void flush_stdin(void);
  22.  
  23. /*Programa principal*/
  24. main()
  25. {
  26. int opcion, dato, c;
  27. nodo *p;
  28. puts("\tMenu");
  29. puts("\t1. Crear arbol");
  30. puts("\t2. Anyadir dato");
  31. puts("\t3. Buscar dato");
  32. puts("\t4. Borrar arbol y salir\n");
  33.  
  34. while(1){
  35. printf("Seleccion: ");
  36. while(1){
  37.     c = scanf("%d", &opcion);
  38.     flush_stdin();
  39.     if(c == 1) break; //Cuando el usuario pulse Ctrl+Z
  40. }
  41.  
  42. if(opcion == 1)
  43.   crear_arbol();
  44.  
  45. if(opcion == 2){
  46.   printf("Introduzca el dato: ");
  47.   scanf("%d", &dato);
  48.   flush_stdin();
  49.   p = anadir(dato, raiz);}
  50.  
  51. if(opcion == 3){
  52.   printf("Dato deseado: ");
  53.   scanf("%d", &dato);
  54.   flush_stdin();
  55.   p = buscar(dato, raiz);
  56.   if(p == NULL)
  57.     puts("\tNo existe ese dato");
  58.   else
  59.     printf("\t\nLa clave %d existe", p->clave);}
  60.  
  61. if(opcion == 4){
  62.   borrar_arbol(raiz);
  63.   exit(1);}
  64. }
  65. }
  66.  
  67. /*Limpiar el buffer de entrada*/
  68. void flush_stdin(void)
  69. {
  70.   int ch;
  71.   while( ((ch = getchar()) != '\n') && (ch != EOF) );
  72. }
  73.  
  74. /*Añadir un nodo. Nótese que es una función recursiva*/
  75. nodo *anadir(int clave, nodo *r)
  76. {
  77.   int num;
  78.  
  79.   if(r == NULL){
  80.      r = (nodo *)malloc(sizeof(nodo));
  81.      if(r == NULL)
  82.         puts("\tFalta Memoria");
  83.      else
  84.         {r->clave = num; r->izquierdo = r->derecho = NULL;}}
  85.  
  86.   else{
  87.      if(num < r->clave)
  88.         r->izquierdo = anadir(num, r->izquierdo);
  89.      if(num > r->clave)
  90.         r->derecho = anadir(num, r->derecho);}
  91.  
  92.   return r;
  93. }
  94.  
  95. /*Crear arbol*/
  96. void crear_arbol(void)
  97. {
  98.   int numero, c;
  99.   while(1){
  100.      printf("Introduzca el dato de la raiz: ");
  101.      c=scanf("%d", &numero);
  102.      if(c==0) continue;
  103.      if(c==1) break;}
  104.   raiz = anadir(numero, raiz);
  105. }
  106.  
  107. /*Buscar datos. Nótese que es una función recursiva*/
  108. nodo *buscar(int dato, nodo *r)
  109. {
  110.   if(r == NULL)  /*Dato no existe*/
  111.      return r;
  112.  
  113.   else if(dato > r->clave)
  114.      return buscar(dato, r->derecho); /*Buscar en subarbol derecho*/
  115.  
  116.   else if(dato < r->clave)
  117.      return buscar(dato, r->izquierdo); /*Buscar en subarbol izquierdo*/
  118.   else
  119.      return r; /*Dato no encontrado*/
  120. }
  121.  
  122. /*Borrar arbol. De nuevo, una función recursiva*/
  123. void borrar_arbol(nodo *r)
  124. {
  125.   if(r != NULL){
  126.      borrar_arbol(r->izquierdo);
  127.      borrar_arbol(r->derecho);
  128.      free(r);}
  129. }
  #2 (permalink)  
Antiguo 29/05/2012, 17:50
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 13 años
Puntos: 94
Respuesta: Interrogante ante un árbol binario

Hola! no vi todo el codigo pero error me parece q esta en la funcion anadir():
Código C:
Ver original
  1. nodo *anadir(int clave, nodo *r)
  2.     {
  3.       int num;
  4.      
  5.       if(r == NULL){
  6.          r = (nodo *)malloc(sizeof(nodo));
  7.          if(r == NULL)
  8.             puts("\tFalta Memoria");
  9.          else
  10.             {r->clave = num; r->izquierdo = r->derecho = NULL;}}
  11.      
  12.       else{
  13.          if(num < r->clave)
  14.             r->izquierdo = anadir(num, r->izquierdo);
  15.          if(num > r->clave)
  16.             r->derecho = anadir(num, r->derecho);}
  17.      
  18.       return r;
  19.     }
Cuando el arbol esta vacio, vos le asignas a r->clave la variable "num", pero a esa variable la declaraste en esta funcion, tenias q hacer r->clave=clave;
Y usar clave en los lugares donde dice num

Saludos

PD: los ifs del main queda mas lindo con un switch-case :)
  #3 (permalink)  
Antiguo 30/05/2012, 15:05
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Respuesta: Interrogante ante un árbol binario

My heroe!

Jo, vaya error más estúpido, ¡y más grave! Me has dado la vida jaja thanks!

Etiquetas: binario, funcion, int, interrogante, programa, struct, variables
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 03:02.