#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);
}