Version:0.9 StartHTML:0000000105 EndHTML:0000008105 StartFragment:0000000152 EndFragment:0000008071
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 8 ************************/
/******************************************************/

#include "00maxHeap.h"

/*****************************************************************************
* Funcion: Heap
* Descripcion: Constructor de clase Heap
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*
*
*
*
* Valor devuelto:
*       Inicializa un objeto de la clase Heap
*****************************************************************************/

Heap::Heap()
{
    num = -1;
};

/*****************************************************************************
* Funcion: Insertar
* Descripcion: Inserta un elemento en el objeto Heap que hace la llamada
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*   x           E         Valor que queremos insertar
*
*
*
* Valor devuelto:
*       Devuelve true si el vector esta lleno y no podemos insertar, false en caso contrario
*****************************************************************************/
bool Heap::Insertar(Valor x)
{
    bool error;

    if (num == MAX-1)
        error = true;
    else
    {
        error = false;
        num++;
        info[num] = x;
        Subir(num);
    }
    return(error);
};

/*****************************************************************************
* Funcion: EliminarMaximo
* Descripcion: Elimina el maximo del objeto Heap de maximos que hace la llamada
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*
*
*
*
* Valor devuelto:
*       Devolvera true si se ha podido elimiar el maximo, true en caso contrario
*****************************************************************************/

bool Heap::EliminarMaximo()
{
    bool ok;

    Valor aux;

    if (num < 0)
        ok = false;
    else
    {
        ok = true;
        info[0] = info[num];
        num--;
        Bajar(0);

    }  // else
    return(ok);
};

/*****************************************************************************
* Funcion: ConsultarMaximo
* Descripcion: Consulta el valor maximo en un Heap de maximos
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*   res         E/S       Variable por referencia donde almacenaremos la consulta
*
*
*
* Valor devuelto:
*       Devuelve true si la consulta se ha realizado con exito, false en caso contrario
*****************************************************************************/


bool Heap::ConsultarMaximo (Valor & res)
{
    bool ok;
    if (num < 0)
        ok = false;
    else
    {
        ok = true;
        res = info[0];
    }
    return(ok);
};

/*****************************************************************************
* Funcion: HeapVacio
* Descripcion: Indica si el objeto Heap que hace la llamada es vacio
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*
*
*
*
* Valor devuelto:
*       Devolvera true si el objeto heap esta vacio, true en caso contrario
*****************************************************************************/


bool Heap::HeapVacio()
{
    return(num == -1);
};

/*****************************************************************************
* Funcion: Subir
* Descripcion: Sube niveles del objeto Heap que hace la llamada
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*   i            E         Indica el nodo en el que nos encontramos
*
*
*
* Valor devuelto:
*       void.
*****************************************************************************/

void Heap::Subir(int i)
{
    Valor aux;

    if((i > 0) && (info[i] > info[(i-1)/2]))
    {
        aux = info[i];
        info[i] = info[(i-1)/2];
        info[(i-1)/2] = aux;
        Subir((i-1)/2);
    }
};

/*****************************************************************************
* Funcion: Bajar
* Descripcion: Baja niveles del objeto Heap que hace la llamada
*
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*   i            E         Indica el nodo en el que nos encontramos
*
*
*
* Valor devuelto:
*       void.
*****************************************************************************/

void Heap::Bajar(int i)
{
    int m;
    Valor aux;
    m = i;
    if (2*(i+1)-1 <= num && (info[2*(i+1)-1] > info[m]) )
        m = 2*(i+1)-1;
    if ( (2*(i+1) < num) && ( info[2*(i+1)]) > info[m])
        m = 2*(i+1);

    if (m != i)
    {
        aux = info[i];
        info[i] = info[m];
        info[m] = aux;
        Bajar(m);
    }
};