0

Some code was written by me, the rest by my partner and his last partner. I'm working with a partner whom also does not fully understand the code as his last partner did some of it. He still understands it more than I do.

Removed MyForm.cpp/MyForm.h, unimplemented code and comments because of character limit. The MyForm.cpp includes the MyForm.h and the Funciones.cpp and calls the Windows Form in main. MyForm.h is a GUI that I will scrap later for a Python embedded GUI. The unimplemented code can be fixed with alt + enter and having VS create a definition.

Funciones.cpp

#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <thread>
#include <map>
#include <cstdlib>
#include <cstring>
#include <stdlib.h>
#include <conio.h>
#include <errno.h>
#include <math.h>

using namespace std;

struct nodoAA
{
    int cont, nivel;
    int codSede;
    int codCarrera;
    int codCurso;
    int codGrupo;
    string nombreAA;
    int cantCupos;

    nodoAA* derAA;
    nodoAA* izqAA;
    nodoAA* padre;
    nodoAA* siguiente;
    nodoAA* raizAA;

    friend class NodoBinario;
    friend class RBArbol;
}*raizAA;

class AA_Arbol
{
public:
    int buscar(int, int, int, int, string, int);
    void girar(nodoAA*);
    bool dividir(nodoAA*);
    void balancear(nodoAA*);
    nodoAA* insertar(nodoAA*, nodoAA*);
    void print(nodoAA*);
    int contarN(nodoAA*);
    void PreordenAA(nodoAA*);
    void PostordenAA(nodoAA*);
    void InordenAA(nodoAA*, int);
    void PreordenAAXCurso(int, nodoAA*);
    nodoAA* BuscarGrupoAA(nodoAA*, int, int, int, int);
    nodoAA* getRaizAA();
    void setRaizAA(nodoAA*);
    AA_Arbol() { raizAA = NULL; }
};
nodoAA* AA_Arbol::getRaizAA()
{
    return raizAA;
}

void AA_Arbol::setRaizAA(nodoAA* raizAA)
{
    raizAA = raizAA;
    return;
}

nodoAA* AA_Arbol::BuscarGrupoAA(nodoAA* temp, int codigo1, int codigo2, int codigo3, int codigo4)
{
    if (temp == NULL)
        return NULL;
    else if (temp->codSede == codigo1 && temp->codCarrera == codigo2 && temp->codCurso == codigo3 && temp->codGrupo == codigo4)
        return temp;
    else if (temp->codGrupo > codigo4)
        return BuscarGrupoAA(temp->izqAA, codigo1, codigo2, codigo3, codigo4);
    else if (temp->codGrupo < codigo4)
        return BuscarGrupoAA(temp->derAA, codigo1, codigo2, codigo3, codigo4);
    else
        return NULL;
}

int AA_Arbol::buscar(int codSede, int codCarrera, int codCurso, int codGrupo, string nombreAA, int cantCupos)
{
    nodoAA* temp = new nodoAA();
    temp->codSede = codSede;
    temp->codCarrera = codCarrera;
    temp->codCurso = codCurso;
    temp->codGrupo = codGrupo;
    temp->nombreAA = nombreAA;
    temp->cantCupos = cantCupos;
    temp->nivel = 1;
    temp->cont = 0;
    temp->izqAA = NULL;
    temp->derAA = NULL;
    temp->padre = NULL;
    temp = insertar(raizAA, temp);
    return temp->cont;
}

void AA_Arbol::girar(nodoAA* temp)
{
    nodoAA* ptr = temp->izqAA;

    if (temp->padre->izqAA == temp)
        temp->padre->izqAA = ptr;
    else
        temp->padre->derAA = ptr;

    ptr->padre = temp->padre;
    temp->padre = ptr;
    temp->izqAA = ptr->derAA;

    if (temp->izqAA != NULL)
        temp->izqAA->padre = temp;
    ptr->derAA = temp;
    temp->nivel = (temp->izqAA ? temp->izqAA->nivel + 1 : 1); //(expresión relacional) ? (expresion1) : (expresion2)  |   true : false se ejecuta
}

bool AA_Arbol::dividir(nodoAA* temp)
{
    nodoAA* ptr = temp->derAA;

    if (ptr && ptr->derAA && (ptr->derAA->nivel == temp->nivel))
    {
        if (temp->padre->izqAA == temp)
            temp->padre->izqAA = ptr;
        else
            temp->padre->derAA = ptr;

        ptr->padre = temp->padre;
        temp->padre = ptr;
        temp->derAA = ptr->izqAA;

        if (temp->derAA != NULL)
            temp->derAA->padre = temp;

        ptr->izqAA = temp;
        ptr->nivel = temp->nivel + 1;
        return true;
    }
    return false;
}

void AA_Arbol::balancear(nodoAA* temp)
{
    temp->izqAA = NULL;
    temp->derAA = NULL;
    temp->nivel = 1;
    for (temp = temp->padre; temp != raizAA; temp = temp->padre)
    {
        if (temp->nivel != (temp->izqAA ? temp->izqAA->nivel + 1 : 1))
        {
            girar(temp);

            if (temp->derAA == NULL)
                temp = temp->padre;
            else if (temp->nivel != temp->derAA->nivel)
                temp = temp->padre;
        }

        if (temp->padre != raizAA)
        {
            if (dividir(temp->padre) == false)
                break;
        }
    }
}

nodoAA* AA_Arbol::insertar(nodoAA* temp, nodoAA* ins)
{
    if (raizAA == NULL)
    {
        ins->cont = 1;
        ins->padre = NULL;
        ins->izqAA = NULL;
        ins->derAA = NULL;
        raizAA = ins;
        return raizAA;
    }

    if (ins->codGrupo < temp->codGrupo)
    {
        if (temp->izqAA)
            return insertar(temp->izqAA, ins);

        temp->izqAA = ins;
        ins->padre = temp;
        ins->cont = 1;
        balancear(ins);
        return ins;
    }

    if (ins->codGrupo > temp->codGrupo)
    {
        if (temp->derAA)
            return insertar(temp->derAA, ins);
        temp->derAA = ins;
        ins->padre = temp;
        ins->cont = 1;
        balancear(ins);
        return ins;
    }

    temp->cont++;

    delete ins;
    return temp;
}

void AA_Arbol::print(nodoAA* temp)
{
    if (!temp)
        return;

    print(temp->izqAA);
    cout << "Valor: " << temp->codGrupo << "  Cont:" << temp->cont;
    cout << "  nivel: " << temp->nivel << endl;
    print(temp->derAA);
}

int AA_Arbol::contarN(nodoAA* temp)
{
    if (!temp)
        return 0;

    int cont = 1;
    cont = cont + contarN(temp->izqAA);
    cont = cont + contarN(temp->derAA);
    return cont;
}

void AA_Arbol::PreordenAA(nodoAA* temp)
{
    if (temp == NULL)
        return;
    else
    {
        cout << "Codigo de grupo: " << temp->codGrupo << ", " << "nombreAA: " << temp->nombreAA << " - ";
        PreordenAA(temp->izqAA);
        PreordenAA(temp->derAA);
    }
}

void AA_Arbol::InordenAA(nodoAA* temp, int n)
{
    if (temp == NULL)
        return;
    else
    {
        InordenAA(temp->izqAA, n);
        if (temp->codCurso == n)
        {
            cout << ".Codigo de grupo: " << temp->codGrupo << ", " << "Nombre: " << temp->nombreAA << ", " << "Cantidad de Cupos: " << temp->cantCupos << endl;
            InordenAA(temp->derAA, n);
        }
        else
        {
            InordenAA(temp->derAA, n);
        }
    }
}

void AA_Arbol::PostordenAA(nodoAA* temp)
{
    if (temp == NULL)
        return;
    else
    {
        PostordenAA(temp->izqAA);
        PostordenAA(temp->derAA);
        cout << "Codigo de grupo: " << temp->codGrupo << ", " << "nombreAA: " << temp->nombreAA << " - ";
    }
}

void AA_Arbol::PreordenAAXCurso(int CodCurso, nodoAA* temp)
{
    if (temp == NULL)
        return;
    else
    {
        if (CodCurso == temp->codCurso)
            cout << "Codigo de grupo: " << temp->codGrupo << ", " << "Nombre: " << temp->nombreAA << ", " << "Cupos: " << temp->cantCupos << " - " << endl;

        PreordenAAXCurso(CodCurso, temp->izqAA);
        PreordenAAXCurso(CodCurso, temp->derAA);
    }
}

enum Color { ROJO, NEGRO };

struct Nodo
{
    int codigoSede;
    int codigoCarrera;
    int codigoCurso;
    string nombreRN;
    int creditos;    //CodSede;CodCarrera;CodCurso;Nombre;Creditos
    bool color;
    Nodo* izqRN, * derRN, * padreRN, * siguiente;
    nodoAA* siguiente3 = NULL;

    // Constructor 
    Nodo(int codigoSede, int codigoCarrera, int codigoCurso, string nombreRN, int creditos)
    {
        this->codigoSede = codigoSede;
        this->codigoCarrera = codigoCarrera;
        this->codigoCurso = codigoCurso;
        this->nombreRN = nombreRN;
        this->creditos = creditos;
        izqRN = derRN = padreRN = NULL;
        this->color = ROJO;
    }
    friend class NodoBinario;
};

//Class arbol ROJO-NEGRO 
class RBArbol
{
public:
    Nodo* raizRN;

    void rotarizqRN(Nodo*&, Nodo*&);
    void rotarderRN(Nodo*&, Nodo*&);
    void reglaDelTio(Nodo*&, Nodo*&);

    // Constructor 
    RBArbol() { raizRN = NULL; }
    void insertar(const int& n, const int& n2, const int& n3, const string& n4, const int& n5);
    void inordenRN(int n);
    Nodo* BuscarCursoRNMod(Nodo*, int);
    Nodo* BuscarCursoRN(Nodo* raizRN, int, int, int);
    void BuscarCursoRNRep(Nodo*, int);
    Nodo* getRaiz();
    void setRaiz(Nodo* raizRN);
};

Nodo* RBArbol::getRaiz()
{
    return raizRN;
}

void RBArbol::setRaiz(Nodo* raizRN)
{
    raizRN = raizRN;
    return;
}

Nodo* RBArbol::BuscarCursoRNMod(Nodo* raizRN, int codigo)
{
    if (raizRN == NULL)
        return NULL;
    else if (raizRN->codigoCurso == codigo)
        return raizRN;
    else if (raizRN->codigoCurso > codigo)
        return BuscarCursoRNMod(raizRN->izqRN, codigo);
    else if (raizRN->codigoCurso < codigo)
        return BuscarCursoRNMod(raizRN->derRN, codigo);
}

void RBArbol::BuscarCursoRNRep(Nodo* raizRN, int codigo)
{
    if (raizRN == NULL)
        return;
    else
    {
        if (raizRN->codigoCarrera == codigo)
            cout << "\nCodigo de Curso:" << raizRN->codigoCurso << " | Nombre: " << raizRN->nombreRN << " | Creditos: " << raizRN->creditos;

        BuscarCursoRNRep(raizRN->izqRN, codigo);
        BuscarCursoRNRep(raizRN->derRN, codigo);
    }
}

Nodo* RBArbol::BuscarCursoRN(Nodo* raizRN, int codigo1, int codigo2, int codigo3)
{
    if (raizRN == NULL)
        return NULL;
    else if (raizRN->codigoSede == codigo1 && raizRN->codigoCarrera == codigo2 && raizRN->codigoCurso == codigo3)
        return raizRN;
    else if (raizRN->codigoCurso > codigo3)
        return BuscarCursoRN(raizRN->izqRN, codigo1, codigo2, codigo3);
    else if (raizRN->codigoCurso < codigo3)
        return BuscarCursoRN(raizRN->derRN, codigo1, codigo2, codigo3);
    else
        return NULL;
}

void inorderRNHelper(Nodo* raizRN, int n)
{
    if (raizRN == NULL)
        return;

    inorderRNHelper(raizRN->izqRN, n);
    if (raizRN->codigoCarrera == n)
    {
        cout << ".Codigo de Curso: " << raizRN->codigoCurso << ", " << "Nombre: " << raizRN->nombreRN << ", " << "Creditos: " << raizRN->creditos << endl;
        inorderRNHelper(raizRN->derRN, n);
    }
    else
        inorderRNHelper(raizRN->derRN, n);
}

Nodo* BSTInsertar(Nodo* raizRN, Nodo* pt)
{
    if (raizRN == NULL)
        return pt;

    if (pt->codigoCurso <= raizRN->codigoCurso)
    {
        raizRN->izqRN = BSTInsertar(raizRN->izqRN, pt);
        raizRN->izqRN->padreRN = raizRN;
    }
    else if (pt->codigoCurso > raizRN->codigoCurso)
    {
        raizRN->derRN = BSTInsertar(raizRN->derRN, pt);
        raizRN->derRN->padreRN = raizRN;
    }
    return raizRN;
}

void RBArbol::rotarizqRN(Nodo*& raizRN, Nodo*& pt)
{
    Nodo* pt_derRN = pt->derRN;

    pt->derRN = pt_derRN->izqRN;

    if (pt->derRN != NULL)
        pt->derRN->padreRN = pt;

    pt_derRN->padreRN = pt->padreRN;

    if (pt->padreRN == NULL)
        raizRN = pt_derRN;

    else if (pt == pt->padreRN->izqRN)
        pt->padreRN->izqRN = pt_derRN;

    else
        pt->padreRN->derRN = pt_derRN;

    pt_derRN->izqRN = pt;
    pt->padreRN = pt_derRN;
}

void RBArbol::rotarderRN(Nodo*& raizRN, Nodo*& pt)
{
    Nodo* pt_izqRN = pt->izqRN;

    pt->izqRN = pt_izqRN->derRN;

    if (pt->izqRN != NULL)
        pt->izqRN->padreRN = pt;

    pt_izqRN->padreRN = pt->padreRN;

    if (pt->padreRN == NULL)
        raizRN = pt_izqRN;

    else if (pt == pt->padreRN->izqRN)
        pt->padreRN->izqRN = pt_izqRN;

    else
        pt->padreRN->derRN = pt_izqRN;

    pt_izqRN->derRN = pt;
    pt->padreRN = pt_izqRN;
}

void RBArbol::reglaDelTio(Nodo*& raizRN, Nodo*& pt)
{
    Nodo* padreRN_pt = NULL;
    Nodo* abuelo_pt = NULL;
    while ((pt != raizRN) && (pt->color != NEGRO) && (pt->padreRN->color == ROJO))
    {
        padreRN_pt = pt->padreRN;
        abuelo_pt = pt->padreRN->padreRN;
        /*  Case : A
            padreRN de pt es hijo izqRN de abuelo pt*/
        if (padreRN_pt == abuelo_pt->izqRN)
        {
            Nodo* tio_pt = abuelo_pt->derRN;

            /* Case : 1
               Pone el tio en rojo*/
            if (tio_pt != NULL && tio_pt->color == ROJO)
            {
                abuelo_pt->color = ROJO;
                padreRN_pt->color = NEGRO;
                tio_pt->color = NEGRO;
                pt = abuelo_pt;
            }
            else
            {
                /* Case : 2
                el hijo derRNecho de la raizRN hacer rotacion izqRNuierda */
                if (pt == padreRN_pt->derRN)
                {
                    rotarizqRN(raizRN, padreRN_pt);
                    pt = padreRN_pt;
                    padreRN_pt = pt->padreRN;
                }
                /* Case : 3
                pt hijo izqRNuierdo del papa hacer rotacion derRNecha y cambia a rojo */
                rotarderRN(raizRN, abuelo_pt);
                swap(padreRN_pt->color, abuelo_pt->color);
                pt = padreRN_pt;
            }
        }
        /* Case : B
           padreRN of pt es el hijo derRNecho del abuelo de pt */
        else
        {
            Nodo* tio_pt = abuelo_pt->izqRN;

            /*  Case : 1
            el tio de pt es tambien rojo  */
            if ((tio_pt != NULL) && (tio_pt->color == ROJO))
            {
                abuelo_pt->color = ROJO;
                padreRN_pt->color = NEGRO;
                tio_pt->color = NEGRO;
                pt = abuelo_pt;
            }
            else
            {
                /* Case : 2
                pt hijo izqRN del padreRN hace rotacion derRNecha y cambia a rojo */
                if (pt == padreRN_pt->izqRN)
                {
                    rotarderRN(raizRN, padreRN_pt);
                    pt = padreRN_pt;
                    padreRN_pt = pt->padreRN;
                }
                /* Case : 3
                pt is el hijo derRNecho del padreRN y hace rotacion izqRN*/
                rotarizqRN(raizRN, abuelo_pt);
                swap(padreRN_pt->color, abuelo_pt->color);
                pt = padreRN_pt;
            }
        }
    }
    raizRN->color = NEGRO;
}

void RBArbol::insertar(const int& codigoSede, const int& codigoCarrera, const int& codigoCurso, const string& nombreRN, const int& creditos)
{
    Nodo* pt = new Nodo(codigoSede, codigoCarrera, codigoCurso, nombreRN, creditos);
    raizRN = BSTInsertar(raizRN, pt);
    reglaDelTio(raizRN, pt);
}

void RBArbol::inordenRN(int n)
{
    inorderRNHelper(raizRN, n);
}

class NodoBinario
{
public:

    NodoBinario(int num, int num2, string nombre, int num3, NodoBinario* der = NULL, NodoBinario* izq = NULL, NodoBinario* sig = NULL) :
        Hizq(izq), Hder(der), valor(num), valor2(num2), name(nombre), cantCursos(num3), siguiente(sig), FB(0) {}

    int valor;
    int valor2;
    string name;
    int cantCursos;
    int FB;
    NodoBinario* Hizq, * Hder, * siguiente;
    Nodo* siguiente2 = NULL;
    friend class Pila;
    friend class Binario;

    void InsertaBinario(int num, int num2, string nombre, int num3);
};

typedef NodoBinario* pnodo;
typedef NodoBinario* pNodoBinario;
typedef NodoBinario*& pNodoBinario2;

class Binario
{
public:
    pNodoBinario raiz;

    Binario() :raiz(NULL) {}

    void InsertaNodo(int num, int num2, string nombre, int num3);
    void PreordenR(pNodoBinario raiz);
    void InordenR(pNodoBinario raiz);
    void PostordenR(pNodoBinario raiz);
    void PreordenAVL(pNodoBinario raiz);
    void InordenAVL(pNodoBinario raiz, int);
    void PostordenAVL(pNodoBinario raiz);
    NodoBinario* BuscarSede(pNodoBinario raiz, int);
    void PreordenAVLXSede(int, NodoBinario* R);
    NodoBinario* BuscarCarrera(pNodoBinario raiz, int, int);
    //void evaluar();

    bool Hh;

    void Borrar(NodoBinario* nodoB, bool);
    void BorrarBalanceado(NodoBinario* r, bool, int eliminar);
    void Equilibrar1(NodoBinario* n, bool);
    void Equilibrar2(NodoBinario* n, bool);
    void InsertarBalanceado(NodoBinario*& r, bool&, int x, int  x2, string nombre, int x3);
    void RotacionDobleIzquierda(NodoBinario*& n1, NodoBinario* n2);
    void RotacionDobleDerecha(NodoBinario*& n1, NodoBinario* n2);
    void RotacionSimpleIzquierda(NodoBinario*& n1, NodoBinario* n2);
    void RotacionSimpleDerecha(NodoBinario*& n1, NodoBinario* n2);
};

void NodoBinario::InsertaBinario(int num, int num2, string nombre, int num3)
{
    if (num < valor)
    {
        if (Hizq == NULL)
            Hizq = new NodoBinario(num, num2, nombre, num3);
        else
            Hizq->InsertaBinario(num, num2, nombre, num3);
    }
    else if (num > valor)
    {
        if (Hder == NULL)
            Hder = new NodoBinario(num, num2, nombre, num3);
        else
            Hder->InsertaBinario(num, num2, nombre, num3);
    }
}

void Binario::InsertaNodo(int num, int num2, string nombre, int num3)
{
    if (raiz == NULL)
        raiz = new NodoBinario(num, num2, nombre, num3);
    else
        raiz->InsertaBinario(num, num2, nombre, num3);
}

void Binario::PreordenR(NodoBinario* R)
{
    if (R == NULL)
        return;
    else
    {
        cout << ".Codigo de Sede: " << R->valor << ", " << "Nombre: " << R->name << endl;
        PreordenR(R->Hizq);
        PreordenR(R->Hder);
    }
}

void Binario::InordenR(NodoBinario* R)
{
    if (R == NULL)
        return;
    else {
        InordenR(R->Hizq);
        cout << ".Codigo de Sede: " << R->valor << ", " << "Nombre: " << R->name << endl;
        InordenR(R->Hder);
    }
}

void Binario::PostordenR(NodoBinario* R)
{
    if (R == NULL)
        return;
    else
    {
        PostordenR(R->Hizq);
        PostordenR(R->Hder);
        cout << ".Codigo de Sede: " << R->valor << ", " << "Nombre: " << R->name << endl;
    }
}

void Binario::PreordenAVL(NodoBinario* R)
{
    if (R == NULL)
        return;
    else
    {
        cout << ".Codigo de carrera: " << R->valor << ", " << "Nombre: " << R->name << "Cantidad de Cursos: " << R->cantCursos << endl;
        PreordenAVL(R->Hizq);
        PreordenAVL(R->Hder);
    }
}

void Binario::InordenAVL(NodoBinario* R, int codigo)
{
    if (R == NULL)
        return;
    else
    {
        InordenAVL(R->Hizq, codigo);
        if (R->valor2 == codigo)
        {
            cout << ".Codigo de carrera: " << R->valor << ", " << "Nombre: " << R->name << ", " << "Cantidad de Cursos: " << R->cantCursos << endl;
            InordenAVL(R->Hder, codigo);
        }
        else
            InordenAVL(R->Hder, codigo);
    }
}

void Binario::PostordenAVL(NodoBinario* R)
{
    if (R == NULL)
        return;
    else
    {
        PostordenAVL(R->Hizq);
        PostordenAVL(R->Hder);
        cout << ".Codigo de carrera: " << R->valor << ", " << "Nombre: " << R->name << ", " << "Cantidad de Cursos: " << R->cantCursos << endl;
    }
}

NodoBinario* Binario::BuscarSede(pNodoBinario R, int codigo)
{
    if (R == NULL)
        return NULL;
    else if (R->valor == codigo)
        return R;
    else if (R->valor > codigo)
        return BuscarSede(R->Hizq, codigo);
    else if (R->valor < codigo)
        return BuscarSede(R->Hder, codigo);
    else
        return NULL;
}

void Binario::PreordenAVLXSede(int CodSede, NodoBinario* R)
{
    if (R == NULL)
        return;
    else
    {
        if (CodSede == R->valor2)
        {
            cout << "\nCodigo de carrera: " << R->valor << ", " << "Nombre: " << R->name << "Cantidad de Cursos: " << R->cantCursos << endl;
            cout << "\n";
        }
        PreordenAVLXSede(CodSede, R->Hizq);
        PreordenAVLXSede(CodSede, R->Hder);
    }
}

NodoBinario* Binario::BuscarCarrera(pNodoBinario R, int codigo1, int codigo2)
{
    if (R == NULL)
        return NULL;
    else if ((R->valor == codigo2) & (R->valor2 == codigo1))
        return R;
    else if (R->valor > codigo2)
        return BuscarCarrera(R->Hizq, codigo1, codigo2);
    else if (R->valor < codigo2)
        return BuscarCarrera(R->Hder, codigo1, codigo2);
    else
        return NULL;
}

void Binario::InsertarBalanceado(pNodoBinario2 ra, bool& Hh, int x, int x2, string nombre, int x3)
{
    pNodoBinario n1;
    if (ra == NULL)
    {
        ra = new NodoBinario(x, x2, nombre, x3);
        Hh = true;
    }
    else
    {
        if (x < ra->valor)
        {
            InsertarBalanceado(ra->Hizq, Hh, x, x2, nombre, x3);
            if (Hh)
            {
                switch (ra->FB)
                {  //ra->valor asi estaba antes 
                case 1: ra->FB = 0;
                    Hh = false;
                    break;
                case 0: ra->FB = -1;
                    break;
                case -1: n1 = ra->Hizq;
                    if (n1->FB == -1)
                        RotacionSimpleIzquierda(ra, n1);
                    else
                        RotacionDobleIzquierda(ra, n1);
                    Hh = false;
                    break;
                }
            }
        }
        else
        {
            if (x > ra->valor)
            {
                InsertarBalanceado(ra->Hder, Hh, x, x2, nombre, x3);

                if (Hh)
                {
                    switch (ra->FB)
                    {
                    case -1: ra->FB = 0;
                        Hh = false;
                        break;
                    case 0: ra->FB = 1;
                        break;
                    case 1: n1 = ra->Hder;
                        if (n1->FB == 1)
                            RotacionSimpleDerecha(ra, n1);
                        else
                            RotacionDobleDerecha(ra, n1);
                        Hh = false;
                        break;
                    }
                }
            }
        }
    }
}

void Binario::RotacionDobleIzquierda(pNodoBinario2 n, NodoBinario* n1)
{
    NodoBinario* n2;
    n2 = n1->Hder;
    n->Hizq = n2->Hder;
    n2->Hder = n;
    n1->Hder = n2->Hizq;
    n2->Hizq = n1;

    if (n2->FB == 1)
        n1->FB = -1;
    else
        n1->FB = 0;

    if (n2->FB == -1)
        n->FB = 1;
    else
        n->FB = 0;

    n2->FB = 0;
    n = n2;
}

void Binario::RotacionDobleDerecha(pNodoBinario2 n, NodoBinario* n1)
{
    NodoBinario* n2;
    n2 = n1->Hizq;
    n->Hder = n2->Hizq;
    n2->Hizq = n;
    n1->Hizq = n2->Hder;
    n2->Hder = n1;

    if (n2->FB == 1)
        n->FB = -1;
    else
        n->FB = 0;

    if (n2->FB == -1)
        n1->FB = 1;
    else
        n1->FB = 0;

    n2->FB = 0;
    n = n2;
}

void Binario::RotacionSimpleDerecha(pNodoBinario2 n, NodoBinario* n1)
{
    n->Hder = n1->Hizq;
    n1->Hizq = n;

    if (n1->FB == 1)
    {
        n->FB = 0;
        n1->FB = 0;
    }
    else
    {
        n->FB = 1;
        n1->FB = -1;
    }
    n = n1;
}

void Binario::RotacionSimpleIzquierda(pNodoBinario2 n, NodoBinario* n1)
{
    n->Hizq = n1->Hder;
    n1->Hder = n;

    if (n1->FB == -1)
    {
        n->FB = 0;
        n1->FB = 0;
    }
    else
    {
        n->FB = -1;
        n1->FB = -1;
    }
    n = n1;
}

class Pagina
{
public:
    Pagina()
    {
        for (int i = 0; i < 5; i++)
        {
            clave[i] = -1;
            Nombres[i] = -1;
        }
        for (int i = 0; i < 5; i++)
        {
            rama[i] = NULL;
        }
        cuenta = 0;
    }
    int clave[5];
    string Nombres[5];
    Pagina* rama[5];
    int cuenta;
    static const int max = 4;
    static const int min = 2;
    friend class ArbolB;
};

class ArbolB
{
public:
    Pagina* raiz;
    ArbolB() { raiz = NULL; }
    void BuscarNodo(int c1, Pagina*& p, bool& encontrado, int& k);
    void InsertarArbolB(int c1, string Nom, Pagina*& raiz);
    void Empujar(int c1, string Nom, Pagina*& r, bool& empujarArriba, int& mdna, Pagina*& xr);
    void MeterHoja(int x, string Nom, Pagina*& xder, Pagina*& p, int& k);
    void DividirNodo(int x, string Nom, Pagina* xder, Pagina*& p, int& k, int& mdna, Pagina*& mder);
    bool verCarnet(int x, Pagina* r);
    void Burbuja(Pagina*& r);
    Pagina* BuscarE(int x, Pagina* r);
    bool arbolBVacio() { return raiz == NULL; }
};

class nodo {
public:
    //nodos estudiante
    nodo(string codSede, string pNombre)
    {
        codigo_sede = codSede;
        nombre = pNombre;
        siguiente = NULL;
        anterior = NULL;
        abajo = NULL;
    }

    nodo(int pCarnet, string pNombre, string codSede, int pCursos)
    {
        carnet = pCarnet;
        nombre = pNombre;
        codigo_sede = codSede;
        cursos = pCursos;
        siguiente = NULL;
        anterior = NULL;
        arriba = NULL;
        abajo = NULL;
    }

    nodo(string codSede, string codCarrera, string codCurso, string codGrupo, int pCantCreditos)
    {
        codigo_sede = codSede;
        codigo_carrera = codCarrera;
        codigo_curso = codCurso;
        codigo_grupo = codGrupo;
        creditos = pCantCreditos;
        siguiente = NULL;
        anterior = NULL;
        arriba = NULL;
        abajo = NULL;
    }

    string codigo_sede;
    string codigo_carrera;
    string codigo_curso;
    string codigo_grupo;
    string nombre;
    string cantCursos;
    string cantCreditos;
    int cantCupos;
    int carnet;
    int creditos;
    int cursos;
    nodo* siguiente;
    nodo* anterior;
    nodo* arriba;
    nodo* abajo;
};
typedef nodo* pnodo_enlazado;

void ArbolB::BuscarNodo(int c1, Pagina*& p, bool& encontrado, int& k)
{
    if (c1 < p->clave[1])
    {
        encontrado = false;
        k = 0;
    }
    else
    {
        k = p->cuenta;
        while ((c1 < p->clave[k]) && (k > 1))
        {
            k = k - 1;
        }
        if (c1 == p->clave[k])
            encontrado = true;
        else
            encontrado = false;
    }
}

void ArbolB::InsertarArbolB(int c1, string Nom, Pagina*& raiz)
{//ya esta  
    int x;
    Pagina* xr;
    Pagina* p;
    bool empujarArriba = false;
    Empujar(c1, Nom, raiz, empujarArriba, x, xr);
    if (empujarArriba)
    {
        p = new Pagina();
        p->cuenta = 1;
        p->clave[1] = x;
        p->Nombres[1] = Nom;
        p->rama[0] = raiz;
        p->rama[1] = xr;
        raiz = p;
    }
}

void ArbolB::Empujar(int c1, string Nom, Pagina*& r, bool& empujarArriba, int& mdna, Pagina*& xr)
{
    bool encontrado = false;
    int k = 0;
    if (r == NULL)
    {
        empujarArriba = true;
        mdna = c1;
        xr = NULL;
    }
    else
    {
        BuscarNodo(c1, r, encontrado, k);
        //this->Burbuja(r);
        if (encontrado)
            cout << "Elemento Repetido";

        Empujar(c1, Nom, r->rama[k], empujarArriba, mdna, xr);
        if (empujarArriba)
        {
            if (r->cuenta < Pagina().max)
            {
                empujarArriba = false;
                MeterHoja(mdna, Nom, xr, r, k);
            }
            else
            {
                empujarArriba = true;
                DividirNodo(mdna, Nom, xr, r, k, mdna, xr);
            }
        }
    }
}

void ArbolB::MeterHoja(int x, string Nom, Pagina*& xder, Pagina*& p, int& k)
{
    for (int i = p->cuenta; i >= k + 1; i--)
    {
        p->clave[i + 1] = p->clave[i];
        p->Nombres[i + 1] = p->Nombres[i];
        p->rama[i + 1] = p->rama[i];
    }
    p->clave[k + 1] = x;
    p->Nombres[k + 1] = Nom;
    p->rama[k + 1] = xder;
    p->cuenta = p->cuenta + 1;
}

void ArbolB::Burbuja(Pagina*& r)
{
    int aux;
    string auxN;
    for (int i = 1; i < r->cuenta + 1; i++)
    {
        for (int j = 1; j < r->cuenta; j++)
        {
            if (raiz->clave[j] > raiz->clave[j + 1] && raiz->clave[j + 1] != -1)
            {
                aux = raiz->clave[j];
                auxN = raiz->Nombres[j];

                raiz->clave[j] = raiz->clave[j + 1];
                raiz->clave[j + 1] = aux;

                raiz->Nombres[j] = raiz->Nombres[j + 1];
                raiz->Nombres[j + 1] = auxN;
            }
        }
    }
}

void ArbolB::DividirNodo(int x, string Nom, Pagina* xder, Pagina*& p, int& k, int& mdna, Pagina*& mder)
{
    int posmda;
    if (k <= Pagina().min)
        posmda = Pagina().min;
    else
        posmda = Pagina().min + 1;

    mder = new Pagina();
    for (int i = posmda + 1; i <= Pagina().max; i++)
    {
        mder->clave[i - posmda] = p->clave[i];
        mder->Nombres[i - posmda] = p->Nombres[i];
        mder->rama[i - posmda] = p->rama[i];
    }
    mder->cuenta = Pagina().max - posmda;
    p->cuenta = posmda;
    if (k <= Pagina().min)
        MeterHoja(x, Nom, xder, p, k);
    else
    {
        k = k - posmda;
        MeterHoja(x, Nom, xder, mder, k);
    }
    mdna = p->clave[p->cuenta];
    mder->rama[0] = p->rama[p->cuenta];
    p->cuenta = p->cuenta - 1;
}

bool ArbolB::verCarnet(int x, Pagina* r)
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (r->clave[j] == x)
                return true;
        }
        if (r->rama[i] != NULL)
        {
            if (verCarnet(x, r->rama[i]) == true)
                return true;
        }
    }
    return false;
}

Pagina* ArbolB::BuscarE(int x, Pagina* r)
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (r->clave[j] == x)
                return r;
        }
        if (r->rama[i] != NULL)
        {
            if (BuscarE(x, r->rama[i]) == r)
                return r;
        }
    }
    return NULL;
}

class listaDC {
public:
    listaDC() { primero = NULL; }
    bool listaVacia() { return primero == NULL; }
    int largoLista();
    void InsertaMatricula(string pCarnet, string nombre);
    bool verificar(string sede, string carrera, string curso, string grupo, int id, int creditos, int& verificar);
    void Eliminar(string sede, string carrera, string curso, string grupo, int id, int creditos);

    pnodo_enlazado primero;

    void informeMatricula(listaDC& lista_matricula, listaDC& lista_sedes);
    void estudiantesPorSede(listaDC& lista_matricula);
    void maxEstudiantes(listaDC& lista_matricula);
    void minEstudiantes(listaDC& lista_matricula);
    void cursosPorEstudiante(listaDC& lista_matricula);
    void creditosPorEstudiante(listaDC& lista_matricula);
    void estudianteMasCursos(listaDC& lista_matricula);
};

int listaDC::largoLista()
{
    int cont = 0;
    pnodo_enlazado aux = primero;
    if (listaVacia())
        return cont;
    else
    {
        while (aux != primero)
        {
            aux = aux->siguiente;
            cont++;
        }
        return cont;
    }
}

void listaDC::InsertaMatricula(string pCarnet, string nombre)
{
    int id, cursos = 0;
    string codSede = "";
    istringstream(pCarnet) >> id;
    if (listaVacia())
    {
        primero = new nodo(id, nombre, codSede, cursos);
        primero->anterior = primero;
        primero->siguiente = primero;
    }
    else
    {
        pnodo_enlazado aux = primero;
        int verificar = 0;
        do
        {
            if (aux->carnet != id)
                aux = aux->siguiente;
            else
            {
                cout << "ERROR: Un estudiante tiene el mismo id de un estudiante ya ingresado" << endl;
                verificar++;
                aux = primero;
            }
        } while (aux != primero);
        if (verificar == 0)
        {
            pnodo_enlazado nuevo = new nodo(id, nombre, codSede, cursos);
            nuevo->anterior = primero->anterior;
            nuevo->siguiente = primero->anterior->siguiente;
            primero->anterior->siguiente = nuevo;
            primero->anterior = nuevo;
        }
    }
}

bool listaDC::verificar(string sede, string carrera, string curso, string grupo, int id, int creditos, int& verificar)
{
    pnodo_enlazado aux = primero;
    do
    {
        if (aux->carnet == id)
        {
            aux->codigo_sede = sede;
            if (aux->abajo == NULL)
            {
                pnodo_enlazado nuevo = new nodo(sede, carrera, curso, grupo, creditos);
                aux->abajo = nuevo;
                nuevo->arriba = aux;
                nuevo->anterior = nuevo;
                nuevo->siguiente = nuevo;
                aux = primero;
            }
            else
            {
                pnodo_enlazado auxInfo = aux->abajo;
                int verificar = 0;
                do
                {
                    if (auxInfo->codigo_carrera == carrera && auxInfo->codigo_curso == curso && auxInfo->codigo_grupo == grupo)
                        return false;
                    else
                        auxInfo = auxInfo->siguiente;
                } while (auxInfo->arriba == NULL);
                pnodo_enlazado nuevo = new nodo(sede, carrera, curso, grupo, creditos);
                nuevo->anterior = auxInfo->anterior;
                nuevo->siguiente = auxInfo;
                auxInfo->anterior->siguiente = nuevo;
                auxInfo->anterior = nuevo;
                aux = primero;
            }
        }
        else
            aux = aux->siguiente;
    } while (aux != primero);
    return true;
}

int ArchivoMod(string texto)
{
    ofstream out_file;
    ifstream in_file;

    // Escribir el archivo
    out_file.open("Modificaciones.txt", ios::app);
    out_file << texto << endl;
    out_file.close(); 

    return 1;
}

int ArchivoAA(string texto)
{
    ofstream out_file;
    ifstream in_file;
    
    out_file.open("AccionesAdmin.txt", ios::app);
    out_file << texto << endl;
    out_file.close(); 

    return 1;
}
  • Edit your post to show the actual errors and project setup. You say " The MyForm.cpp includes the MyForm.h and the Funciones.cpp". Does this mean there is an actual `#include `? That will lead to the error in your title. – Botje Aug 10 '20 at 08:08
  • It looks like you have not organised your code correctly into header files and cpp files. But I'm just guessing. There nothing **definitely** wrong with the code posted. – john Aug 10 '20 at 08:10
  • Try to produce a **minimal** example that has one of these errors, and then post the **complete** code here. It's hard to diagnose problems like this from partial code. – john Aug 10 '20 at 08:11
  • @Botje I can't add more because of the character limit... Yes, there's an actual ```#include ``` because I need to link the functions in those to the form. Should I just copy-paste them into the .cpp where the main function is? @john I'm not sure how I'm supposed to organize it to produce a minimal example. I also can't post the complete code at all (even without description) because of character limit. – Daniel Pantigoso Aug 10 '20 at 08:36
  • 1
    No, you should remove the include of the cpp file. Visual studio is already compiling both CPP files and linking them together in the final executable, hence the error. – Botje Aug 10 '20 at 08:37
  • @Botje Oh, I did not know Visual Studio did that. Thank you! I'll also use the link you added to guide me better. Thanks for your help. Do you mind if I ask you for help if I have further problems? – Daniel Pantigoso Aug 10 '20 at 08:39
  • 1
    Make a new question if you have further questions. Make sure to describe the expected and actual behavior, along with full error output. Reduce your code to a [mcve] or at least the sections at fault. – Botje Aug 10 '20 at 08:40
  • Of course, I'll @ you, though :) Thanks for the links! They've made me understand code a little bit better and answered my question, clearly. I'll make sure to make a minimal reproducible example. Thank you again! – Daniel Pantigoso Aug 10 '20 at 08:45

0 Answers0