#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
typedef struct alumno
{ int numero;
char nombre[20];
char direccion[20];
}ALUMNO;
typedef struct nodo
{ ALUMNO dato;
struct nodo *der;
struct nodo *izq;
}NODO;
void cargar_alumno(ALUMNO* dato)
{ printf("Ingrese numero: "); scanf("%d", &dato -> numero);
printf("\nIngrese nombre: "); scanf("%s", dato -> nombre);
printf("\nIngrese direccion: "); scanf("%s", dato -> direccion);}
void insertar_nodo(NODO* &raiz, NODO* &nuevo){ // Primero debemos establecer la condicion de parada de la
// funcion, que sera cuando no pueda seguir recorriendo el arbol.
if(raiz == 0)
{ // Al estar en una posicion vacia, insertamos nuestro nodo y salimos
raiz = nuevo;
printf("Nodo agregado\n"); return;
}
else // Si todavia estamos en una posicion del arbol que contiene un nodo
{ // Debemos movernos a la izquierda o a la derecha, dependiendo del numero del registro
if(nuevo -> dato.numero < raiz -> dato.numero) // Si el registro del nuevo nodo es menor
// al de la posicion del arbol
{ // Haremos la llamada de la funcion recursivamente y nos moveremos a la izquierda
insertar_nodo(raiz -> izq, nuevo);
}
else if(nuevo -> dato.numero > raiz -> dato.numero) // De ser mayor
{ // Haremos la llamada de la funcion recursivamente y nos moveremos a la derecha
insertar_nodo(raiz -> der, nuevo);
}
else // En caso de que caiga en esta condicion, esto significa que ambos numeros son iguales
// y que ya existe un registro con ese numero social
{ printf("Numero ya existente\n"); return;
}
}
}
void agregar_nodo(NODO* &nodo)
{ // Primero debemos de crear el nuevo nodo antes de modificar el arbol
// Para eso, declaramos un puntero y le alojamos memoria
NODO* nuevo = (NODO*)malloc(sizeof(NODO));
// Verificamos que se haya alojado la memoria
if(!nuevo)
{ printf("No se pudo alojar memoria..."); return;
}
else
{ cargar_alumno(&nuevo -> dato);
}
// Y ahora enviamos nuestro nodo al arbol
insertar_nodo(nodo, nuevo);
}
// Metodo recursivo
// Funcion que imprime el registro del alumno
void imprimir_registro(ALUMNO dato)
{ printf("Numero del alumno: \t%d\n", dato.numero); printf("Nombre: \t%s\n", dato.nombre); printf("Direccion: \t%s\n", dato.direccion); printf("------------------------------");}
// Lo vamos a recorrer recursivamente
void imprimir_arbol(NODO* raiz)
{ // Primero establecemos la condicion de parada
if(raiz == NULL)
{ return;
}
else // Aqui imprimiremos los registros
{ // Ya que debe ser de forma ascendente (menor a mayor),
// recorreremos el arbol en formato in-orden.
// 1) Iremos a toda la rama izquierda del arbol
imprimir_arbol(raiz -> izq);
// 2) Una vez recorrido todo el lado izq, imprimimos los datos
imprimir_registro(raiz -> dato);
// 3) Por ultimo recorremos el lado derecho del arbol
imprimir_arbol(raiz -> der);
}
}
// Modificaremos la funcion imprimir_arbol para que tenga la capacidad de ejecutar otra funcion
void imprimir_arbol(NODO* raiz, bool guardar)
{
// Primero establecemos la condicion de parada
if(raiz == NULL)
{ return;
}
else // Aqui imprimiremos los registros
{ // Ya que debe ser de forma ascendente (menor a mayor),
// recorreremos el arbol en formato in-orden.
// 1) Iremos a toda la rama izquierda del arbol
imprimir_arbol(raiz -> izq, guardar);
// 2) Una vez recorrido todo el lado izq, imprimimos los datos
if(guardar == true)
guardar_registro(raiz->dato);
else
imprimir_registro(raiz -> dato);
// 3) Por ultimo recorremos el lado derecho del arbol
imprimir_arbol(raiz -> der, guardar);
}
}
void guardar_registro(NODO* raiz){ FILE* fp = fopen("registro.txt", "a"); // a De append
fprintf(fp, "Numero del alumno: \t%d\n Nombre: \t%s\n Direccion: \t%s\n ---------------------------------\n", raiz -> dato.numero, raiz -> dato.nombre, raiz -> dato.direccion);
fclose(fp);
}