none
Lenguaje C - Arbol no busca datos RRS feed

  • Pregunta

  • Hola, tengo una aplicación desarrollada en C, como dice el titulo. La cual tiene 2 funciones, ingresar y buscar datos.

    Es bien sencilla, no hace nada mas que eso. Hago el uso de la estructura de datos llamada Arbol con punteros.

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <time.h>
    
    #define TRUE 1
    #define FALSE 0
    
    typedef struct nodo 
    {
    	int numero;
    	struct nodo *derecho;
    	struct nodo *izquierdo;
       	
    }*ptr;
    
    
    
    void MarcoPantalla();
    void MostrarMenu();
    void gotoxy();
    void IngresarDatos();
    void BuscarNodo();
    void Insertar(ptr *nodo, int dato);
    void InOrden(ptr nodo, void (*func)(int*));
    void PreOrden(ptr nodo, void (*func)(int*));
    void PostOrden(ptr nodo, void (*func)(int*));
    void Mostrar(int *a);
    void auxContador(ptr nodo, int*);
    void auxAltura(ptr nodo, int, int*);
    
    int Buscar(ptr nodo, int dato);
    int EsHoja(ptr h);
    int Num_Nodos(ptr nodo, int* c);
    int Altura_Arbol(ptr nodo, int *altura);
    int Vacio(ptr r);
    
    int main()
    {
    	ptr Arbol = NULL;
       
        int i, num, ndatos, opc;
    	
    	do{
    	
    	system("cls");
    	system("color F0");
    	MarcoPantalla(2,2,23,78);
    	MostrarMenu();
    	 	
    	gotoxy(4,20);
    	printf("FECHA:");
    	time_t tiempo = time(0);
            struct tm * tlocal = localtime(&tiempo);
            char output[128];
            strftime(output,128,"%d/%m/%Y",tlocal);
            printf("%s\n",output);
            gotoxy(63,20);
       	strftime(output, 128, "%H:%M:%S", tlocal);
       	printf("HORA: %s", output);
    	 	
    	gotoxy(50,22);
    	printf("INGRESE UNA OPCION..: ");
    	scanf("%d", &opc);	
    	
    	switch(opc){
    	case 1:
    		IngresarDatos();
    		break;
    	case 2:
    		BuscarNodo();
    		break;
    	case 3:
    		gotoxy(37,22);
    		printf("Programa realizado por Mauricio Toledo");
    		break;
    	default:
    	gotoxy(21,22);
    	printf("Error, debes ingresar una opcion dentro del rango 1 a 3");
    	getch();
    	break;
    }
    	
    	}while(opc != 3);
    	
    	printf("\n");
    	getch();
    	return 0;
    }
    
    void gotoxy(int x, int y)
    {
    	HANDLE hCon;
    	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    	COORD dwPos;
    	dwPos.X=x;
    	dwPos.Y=y;
    	SetConsoleCursorPosition(hCon,dwPos);
    }
    void MarcoPantalla(int LinIni, int ColIni, int LinFin, int ColFin)
    {
    	int fila,columna;
    	for (fila=ColIni; fila<=ColFin;fila++)
    	{
    		gotoxy(fila,LinIni);
    		printf("%c", 205);
    		
    		gotoxy(fila,LinIni+2);
    		printf("%c", 205);
    		
    		gotoxy(fila,LinFin);
    		printf("%c",205);
    		gotoxy(fila,LinFin-2);
    		printf("%c",205);
    	
    	}
    	for(columna=LinIni;columna<= LinFin; columna++)
    	{
    		gotoxy(ColIni, columna);
    		printf("%c", 186);
    		
    		gotoxy(ColFin,columna);
    		printf("%c", 186);
    		
    	 
    	}
    	gotoxy(ColIni,LinIni);
    	printf("%c", 201);
    	
    	gotoxy(ColIni,LinFin);
    	printf("%c", 200);
    	
    	gotoxy(ColFin,LinIni);
    	printf("%c", 187);
    	
    	gotoxy(ColFin,LinFin);
    	printf("%c", 188);
    }
    
    void MostrarMenu()
    {
    	gotoxy(4,3);
    	printf("ARBOL");
    	
    	gotoxy(20,7);
    	printf("1.- INGRESAR LOS DATOS...:");
    	
    	gotoxy(20,8);
    	printf("2.- BUSCAR DATOS.........:");
    	
    	gotoxy(20,9);
    	printf("3.- SALIR................:");
    		
    }
    void IngresarDatos(ptr *nodo, int dato)
    {
    	int i, ndatos, num;
    	
    	ptr Arbol = NULL;
    	
    	system("cls");
    	system("color F0");
    	MarcoPantalla(2,2,23,78);
    	
    	gotoxy(4,3);
    	printf("FECHA:");
    	time_t tiempo = time(0);
            struct tm * tlocal = localtime(&tiempo);
            char output[128];
            strftime(output,128,"%d/%m/%Y",tlocal);
            printf("%s\n",output);
            gotoxy(63,3);
       	strftime(output, 128, "%H:%M:%S", tlocal);
       	printf("HORA: %s", output);
    	
    	gotoxy(5,6);
    	printf("Indique cuantos datos desea ingresar: ");
    	scanf("%d",&ndatos);
    	
    	if(ndatos >= 2){
    		gotoxy(5,8);
    		printf("Ingrese los %d datos: ",ndatos);	
    	}else{
    		gotoxy(5,8);
    		printf("Ingrese su dato [%d]: ", ndatos);
    	}
    	
    	
    	for(i=1; i<=ndatos; i++)
        {
            scanf("%d",&num);                  
            gotoxy(5,9);
    		Insertar(&Arbol, num); 
            	
    	} 
    	gotoxy(5,11);
    	printf("Numero de Datos ----> %d ", Num_Nodos(Arbol, &num));
        
    	gotoxy(5,13);          
        printf("Altura arbol ----> %d ", Altura_Arbol(Arbol, &num));
        
    	gotoxy(5,15);                  
        printf("InOrden ----> ");
        gotoxy(20,15);
    	InOrden(Arbol, Mostrar);
        
    	gotoxy(5,17);        
    	printf("PreOrden ----> ");
        gotoxy(20,17);
    	PreOrden(Arbol, Mostrar);
        
    	gotoxy(5,19);        
    	printf("PostOrden ----> ");
        gotoxy(20,19);
    	PostOrden(Arbol, Mostrar);
    	
    	
    	gotoxy(39,22);
    	printf("Presione una tecla para continuar...");
    	getch();
    
    }
    void BuscarNodo()
    {
    	int num;
    	
    	ptr Arbol = NULL;
    	
    	system("cls");
    	system("color F0");
    	MarcoPantalla(2,2,23,78);
    	
    	gotoxy(4,3);
    	printf("FECHA:");
    	time_t tiempo = time(0);
        struct tm * tlocal = localtime(&tiempo);
        char output[128];
        strftime(output,128,"%d/%m/%Y",tlocal);
        printf("%s\n",output);
        gotoxy(63,3);
       	strftime(output, 128, "%H:%M:%S", tlocal);
       	printf("HORA: %s", output);
       	
       	gotoxy(5,5);
       	printf("Introduzca el Dato que desea buscar: ");
        scanf("%d", &num);
    	Buscar(Arbol, num);
    	
    	
    	getch();
    }
    
    void Insertar(ptr *a, int dato){
       ptr padre = NULL;
       ptr actual = *a;
       while(!Vacio(actual) && dato != actual->numero) {
          padre = actual;
          if(dato < actual->numero) 
          actual = actual->izquierdo;
          else if(dato > actual->numero)
          actual = actual->derecho;
       }
       if(!Vacio(actual)) 
       return;
       if(Vacio(padre)) {
          *a = (ptr)malloc(sizeof(struct nodo));
          (*a)->numero = dato;
          (*a)->izquierdo = (*a)->derecho = NULL;
       }
       else if(dato < padre->numero) {
          actual = (ptr)malloc(sizeof(struct nodo));
          padre->izquierdo = actual;
          actual->numero = dato;
          actual->izquierdo = actual->derecho = NULL;
       }
       else if(dato > padre->numero) {
          actual = (ptr)malloc(sizeof(struct nodo));
          padre->derecho = actual;
          actual->numero = dato;
          actual->izquierdo = NULL;
          actual->derecho = NULL;
      }
    }
    
    int Vacio(ptr r)
    {
       return r==NULL;
    }
    
    void Mostrar(int *a)
    {
       printf("%d, ", *a);
    }
    
    void InOrden(ptr nodo, void (*func)(int*))
    {
       if(nodo->izquierdo)
       
         InOrden(nodo->izquierdo, func);
         
       func(&(nodo->numero));
       
       if(nodo->derecho) 
       
         InOrden(nodo->derecho, func);
    }
    
    
    void PreOrden(ptr nodo, void (*func)(int*))
    {
       func(&nodo->numero);
       
       if(nodo->izquierdo)
       
         PreOrden(nodo->izquierdo, func);
         
       if(nodo->derecho)
       
         PreOrden(nodo->derecho, func);
    }
    
    
    void PostOrden(ptr nodo, void (*func)(int*))
    {
       if(nodo->izquierdo) 
       
         PostOrden(nodo->izquierdo, func);
         
       if(nodo->derecho) 
       
         PostOrden(nodo->derecho, func);
         
       func(&nodo->numero);
    }
    
    int Num_Nodos(ptr nodo, int *cont)
    {
       *cont = 0;
       
       auxContador(nodo, cont); 
       
       return *cont;
    }
    
    int Altura_Arbol(ptr nodo, int *altura)
    {
       *altura = 0;
       
        auxAltura(nodo, 0, altura); 
        
        return *altura;
    }
    
    void auxContador(ptr nodo, int *c)
    {
       (*c)++; 
       
       if(nodo->izquierdo) 
       
         auxContador(nodo->izquierdo, c);
         
       if(nodo->derecho)  
       
         auxContador(nodo->derecho, c);
    }
    
    void auxAltura(ptr nodo, int a, int *altura)
    {
       if(nodo->izquierdo)
       
         auxAltura(nodo->izquierdo, a+1, altura);
         
       if(nodo->derecho)   
       
         auxAltura(nodo->derecho, a+1, altura);
         
       if(EsHoja(nodo) && a > *altura)
       
         *altura = a;
    }
    
    int EsHoja(ptr nodo)
    {
       return !nodo->derecho && !nodo->izquierdo;
    }
    
    int Buscar(ptr nodo, int dato)
    {
       ptr actual = nodo;
       
       while(actual!= NULL) 
       {
          if(dato == actual->numero)
          {
          	gotoxy(5,7);
            printf("%d EXISTE", dato); 
      	  	return TRUE;
    	  }
    	  else if(dato < actual->numero)
          
            actual = actual->izquierdo; 
    	  
    	  else if(dato > actual->numero)
          
          actual = actual->derecho;
          
       }
          gotoxy(5,8);
          printf("%d NO EXISTE", dato);
          return FALSE;
          getch();
    }

    Fijense que tengo 2 funciones, una llamada BuscarNodo() donde se pregunta al usuario, y otra llamada Buscar() donde hace el calculo completo.

    Y luego al buscar no encuentra nada, dejo un ejemplo.

    Primero se insertaran 3 datos.

    Luego se procederá a buscar el dato 12. No es posicion 12, es el dato 12.

    Como se puede ver dice que no existe, cuando deberia decir que lo encontró, que si existe. Me pregunto que hice mal ahí. Gracias!!



    • Editado M4uriXD miércoles, 27 de mayo de 2020 3:38
    miércoles, 27 de mayo de 2020 3:34

Respuestas

Todas las respuestas