3/29/2017

Ejercicio 46

El programa departamental de niños bajos en peso, quiere recolectar la información de los niños entre uno y seis años de los municipios de Sahagún, Montería y Lorica. Entre los datos relevantes del representante del niño (madre o padre) están la identificación y el nombre. En cuanto al niño se requiere tener el número de registro civil, el nombre, la talla y peso.

Lista doblemente enlazadas
Para la solución se deben implementar las clases necesarias que permitan llenar una lista doblemente enlazada, que guarde la información recolectada de los niños en cada municipio. El programa debe realizar las siguientes operaciones sobre los nodos almacenados en la lista doblemente enlazada:

  • Agregar la información del niño y su representante al final de la lista.

  • Insertar la información de un nuevo niño, entre dos nodos existentes.

  • Agregar la información de un niño al principio de la lista (agregar nodos por la cabeza de la lista).

  • Ordenar la información de la lista teniendo en cuenta el peso de los niños registrados.

  • Eliminar la información de un niño y su representante.

  • Mostrar la cantidad de nodos que hay en la lista

  • Eliminar un nodo de la lista

El director del programa departamental de niños bajos en peso requiere que la aplicación cuente con un menú de opciones para realizar las operaciones descritas anteriormente y para generar los siguientes informes sobre los datos almacenados en la lista.

  • Generar un listado por municipios, con la información de todos los niños registrados; se debe tener un consolidado de cuántos niños tiene el programa en cada municipio.

  • Se considera que los niños entre 2 y 3 años con un peso menor de 15 kilos están bajos de peso, lo mismo para los niños entre 4 y 6 años que pesan menos de 25 kilos. La dirección quiere un listado con la información de los niños que estén en estas condiciones y saber las cantidades en cada municipio para enviar unos mercados con una dieta especial.

  • Los niños entre 4 y 6 años que midan menos de un metro de estatura se consideran que están bajos de estatura, por esta razón se requiere saber la cantidad de niños que están bajos de talla en cada municipio.


#include <iostream>
// se incluye la clase Nino para despues llamar a sus metodos 
#include "Nino.h"
// se incluye la clase ProgramaDepartamental para despues llamar a sus metodos 
#include "ProgramaDepartamental.h"
// se incluye la clase stdlib para poder utilizar el metodo system que nos permitira utilizar los comandos basicos de la consola, en este caso lo utilizaremos para limpiar la pantalla de la consola system("cls")  
#include "stdlib.h"

using namespace std;

// método para llenar la lista 
void llenar(Nino *nod)
{
    int e, n_r, p, id, m;
    string n, n_p;
    float a;
    // con el ciclo do while comprobare que la edad este entre el rango de 1 y 6 años 
    do
    {
        cout << "Ingrese edad del nino" << endl;
        cout << ">> ";
        cin >> e;
    }
    while (e < 1 || e > 6);
    // encapsulo la variable e 
    nod->setEdad(e);
    // se pide el nombre del niño 
    cout << "Ingrese nombre del nino" << endl;
    cout << ">> ";
    cin >> n;
    // encapsulo la variable n 
    nod->setNombre(n);
    // se pide el registro civil del niño 
    cout << "Ingrese numero de registro civil del nino" << endl;
    cout << ">> ";
    cin >> n_r;
    // encapsulo la variable n_r 
    nod->setRegistroCivil(n_r);
    // se pide la altura del niño 
    cout << "Ingrese altura del nino" << endl;
    cout << ">> ";
    cin >> a;
    // se encapsula la variable a 
    nod->setAltura(a);
    // se pide el peso del niño 
    cout << "Ingrese peso del nino:" << endl;
    cout << ">> ";
    cin >> p;
    // se encapsula la variable p 
    nod->setPeso(p);
    // se pide el numero de identificacion del padre 
    cout << "Ingrese numero de identificacion del padre/madre del nino" << endl;
    cout << ">> ";
    cin >> id;
    // se encapsula la variable id 
    nod->setIdPadre(id);
    // se pide el nombre del padre o la madre del niño 
    cout << "Ingrese nombre del padre/madre del nino" << endl;
    cout << ">> ";
    cin >> n_p;
    // se encapsula la variable n_p 
    nod->setNombrePadre(n_p);
    // con el ciclo do while comprobare que se ingrese el municipio correcto 
    do
    {
        cout << "Ingrese municipio donde vive el nino" << endl;
        cout << "1. Sahagun" << endl;
        cout << "2. Monteria" << endl;
        cout << "3. Lorica" << endl;
        cout << ">> ";
        cin >> m;
        system("cls");
    }
    while (m < 1 || m > 3);
    // se encapsula la variable m 
    nod->setMunicipio(m);
}

// método para mostrar el municipio 
string mostrarMunicipio(int opc)
{
    // mediante el valor que se pase como parametro opc, el switch escore el caso 
    switch (opc)
    {
        case 1:
            return "Sahagun";
        case 2:
            return "Monteria";
        default:
            return "Lorica";
    }
}

// método para mostrar la informacion del niño 
void mostrar(Nino *nod)
{
    cout << "Nombre: " << nod->getNombre() << endl;
    cout << "Edad: " << nod->getEdad() << endl;
    cout << "Registro Civil: " << nod->getRegistroCivil() << endl;
    cout << "Altura: " << nod->getAltura() << endl;
    cout << "Peso: " << nod->getPeso() << endl;
    cout << "Nombre representante: " << nod->getNombrePadre() << endl;
    cout << "ID representante: " << nod->getIdPadre() << endl;
    cout << "Municipio: " << mostrarMunicipio(nod->getMunicipio()) << endl << endl;
}

// método para listar todos la lista 
void listar(ProgramaDepartamental *obj)
{
    // declaro e inicializo la variable temp en el valor que tenga la cabeza 
    Nino *temp = obj->getCabeza();
    // mientras haya un nodo en la lista 
    while (temp != NULL)
    {
        // entonces mostrara la informacion del nodo temp 
        mostrar(temp);
        // y se salta al siguiente nodo temp 
        temp = temp->getSiguiente();
    }
}

// método para listar los niños por municipio 
void listarPorMunicipio(ProgramaDepartamental *obj)
{
    // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
    for (int i = 1; i <= 3; i++)
    {
        // muestro en un mensaje de dialogo, el municipio actual: mostrarMunicipio(i) 
        cout << "[Ninos del municipio de " << mostrarMunicipio(i) << "]" << endl;
        // declaro e inicializo la variable temp con el valor de la cabeza 
        Nino *temp = obj->getCabeza();
        // mientras haya un nodo en la lista 
        while (temp != NULL)
        {
            // entonces, si el nodo temp pertenece al municipio i (i = 0: Sahagún, i = 1: Montería, i = 2: Lorica) 
            if (temp->getMunicipio() == i)
            {
                // se muestra la información del nodo temp 
                mostrar(temp);
            }
            // se salta al siguiente nodo temporal 
            temp = temp->getSiguiente();
        }
        // muestro la cantidad de niños de cada municipio, llamando al metodo contarNiñosMunicipio y pasandole como parametro i 
        cout << "Hay " << obj->contarNinosMunicipio(i) << " nino(s) en el municipio de " << mostrarMunicipio(i) << endl;
    }
}

// método para listar cada niño si cumple las condiciones de peso bajo 
void listarPorCondicionesPeso(ProgramaDepartamental *obj)
{
    cout << "[Ninos de 2 y 3 o 4 y 6 años en condiciones de bajo peso]" << endl;
    // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
    for (int i = 1; i <= 3; i++)
    {
        // declaro e inicializo la variable temp con el valor de la cabeza 
        Nino *temp = obj->getCabeza();
        // mientras haya un nodo en la lista 
        while (temp != NULL)
        {
            // entonces, si el municipio es igual a i, y tiene una edad entre 2 y 3 años y pesa menos de 15 kg ó si tiene una edad entre 4 y 6 y pesa menos de 25 kg 
            if (temp->getMunicipio() == i && ((temp->getEdad() >= 2 && temp->getEdad() <= 3) && temp->getPeso() < 15) || temp->getMunicipio() == i && ((temp->getEdad() >= 4 && temp->getEdad() <= 6) && temp->getPeso() < 25))
            {
                // se mostrara la informacion del nodo temp 
                mostrar(temp);
            }
            // se salta al siguiente nodo temp 
            temp = temp->getSiguiente();
        }
        // se muestra la cantidad de niños en condiciones de bajo peso por municipio 
        cout << "Hay " << obj->contarNinosMunicipioPeso(i) << " nino(s) en el municipio de " << mostrarMunicipio(i) << " en condiciones de bajo peso." << endl;
    }
}

// método para listar cada niño si tiene una altura menor a 1 metro 
void listarPorAltura(ProgramaDepartamental *obj)
{
    cout << "[Ninos entre 4 y 6 años que miden menos de 1 metro]" << endl;
    // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
    for (int i = 1; i <= 3; i++)
    {
        // declaro e inicializo la variable temp con el valor de la cabeza 
        Nino *temp = obj->getCabeza();
        // mientras haya un nodo en la lista 
        while (temp != NULL)
        {
            // si el niño esta en el municipio i y tiene una edad entre 4 y 6 años y tiene una altura menor a 1 m 
            if (temp->getMunicipio() == i && ((temp->getEdad() >= 4 && temp->getEdad() <= 6) && temp->getAltura() < 1))
            {
                // entonces se mostrara la información del nodo temp 
                mostrar(temp);
            }
            // se salta al siguiente nodo temp 
            temp = temp->getSiguiente();
        }
        // se muestra la cantidad de niños con una estatura menor a 1m por municipio 
        cout << "Hay " << obj->contarNinosPorAltura(i) << " nino(s) en el municipio de " << mostrarMunicipio(i) << " en condiciones de bajo peso." << endl;
    }
}

// método para mostrar el menu de opciones 
int menu()
{
    int opc;
    do
    {
        cout << "1. Agregar informacion del nino y su representante por el final." << endl;
        cout << "2. Insertar entre dos nodos existentes." << endl;
        cout << "3. Agregar informacion del nino y su representante por el principio." << endl;
        cout << "4. Buscar por numero de registro civil." << endl;
        cout << "5. Ordenar la informacion, teniendo en cuenta el peso de los niños." << endl;
        cout << "6. Eliminar la informacion de un nino y su representante." << endl;
        cout << "7. Listado por municipios." << endl;
        cout << "8. Listado por condiciones bajos de peso." << endl;
        cout << "9. Listado por altura." << endl;
        cout << "10. Mostrar toda la lista." << endl;
        cout << "11. Salir" << endl;
        cout << ">> ";
        cin >> opc;
        system("cls");
    }
    while (opc < 0 || opc > 11);
    return opc;
}

int main(void)
{
    // creo un objeto de la clase ProgramaDepartamental (instanciación) 
    ProgramaDepartamental *obj = new ProgramaDepartamental();
    // declaro una variable de tipo Nino 
    Nino *aux;
    // declaro dos variables de tipo entero opcion y num_reg 
    int opcion, num_reg;
    do
    {
       // se le asigna a la variable opcion el valor que retorne el metodo menu 
       opcion = menu();
       // dependiendo del valor de la opcion se escogera un caso 
       switch(opcion)
       {
            case 1:
                aux = new Nino();
                llenar(aux);
                obj->agregarFinal(aux);
                cout << "Se ha agregado correctamente la información" << endl;
                break;
            case 2:
                cout << "Ingrese número de registro del nodo anterior al que desea agregar" << endl;
                cout << ">> ";
                cin >> num_reg;
                aux = obj->buscar(num_reg);
                if(aux != NULL)
                {
                    aux = new Nino();
                    llenar(aux);
                    obj->agregarEntreNodos(obj->buscar(num_reg), aux);
                    cout << "Se ha agregado correctamente la información" << endl;
                }
                else
                {
                    cout << "No se ha encontrado el nodo!" << endl;
                }
                break;
            case 3:
                aux = new Nino();
                llenar(aux);
                obj->agregarInicio(aux);
                cout << "Se ha agregado correctamente la información" << endl;
                break;
            case 4:
                cout << "Ingrese número de registro del nodo anterior al que desea agregar" << endl;
                cout << ">> ";
                cin >> num_reg;
                aux = obj->buscar(num_reg);
                if(aux != NULL)
                {
                    mostrar(obj->buscar(num_reg));
                }
                else
                {
                    cout << "No se ha encontrado el nodo!" << endl;
                }
                break;
            case 5:
                aux = obj->getCabeza();
                if (aux != NULL)
                {
                    if(obj->contarNodos() > 1)
                    {
                        aux = obj->getCabeza();
                        obj->ordenarIntercambio(aux);
                        listar(obj);
                    }
                    else
                    {
                        cout << "Solo hay un nino, agregue por lo menos 1 niño mas para ordenar." << endl;
                    }
                }
                break;
            case 6:
                aux = obj->getCabeza();
                obj->eliminarNodo(aux);
                cout << "Se elimino correctamente." << endl;
                break;
            case 7:
                listarPorMunicipio(obj);
                break;
            case 8:
                listarPorCondicionesPeso(obj);
                break;
            case 9:
                listarPorAltura(obj);
                break;
            case 10:
                listar(obj);
                break;
            default:
                break;
       }
    }
    while (opcion != 11);
}

#ifndef NINO_H
#define NINO_H
#include <iostream>

using namespace std;

class Nino
{
    public:
        Nino();
        virtual ~Nino();
        // metodos publicos de la clase Nino 
        void setEdad(int val);
        int getEdad();
        void setNombre(string val);
        string getNombre();
        void setRegistroCivil(int val);
        int getRegistroCivil();
        void setAltura(float val);
        float getAltura();
        void setPeso(int val);
        int getPeso();
        void setIdPadre(int val);
        int getIdPadre();
        void setNombrePadre(string val);
        string getNombrePadre();
        void setMunicipio(int val);
        int getMunicipio();
        void setSiguiente(Nino *val);
        Nino *getSiguiente();
        void setAnterior(Nino *val);
        Nino *getAnterior();
        void copiar(Nino *nd);

    protected:

    private:
        // atributos privados de la clase Nino 
        int edad;
        string nombre;
        int registro_civil;
        float altura;
        int peso;
        int id_padre;
        string nombre_padre;
        int municipio;
        Nino *siguiente;
        Nino *anterior;
};

#endif // NINO_H 

#include "Nino.h"

Nino::Nino()
{
    // se le asigna valores por defecto en el constructor a los atributos de la clase Nino 
    edad = 0;
    nombre = "";
    registro_civil = 0;
    altura = 0;
    peso = 0;
    id_padre = 0;
    nombre_padre = "";
    municipio = 0;
    siguiente = NULL;
    anterior = NULL;
}

Nino::~Nino()
{
    //dtor 
}

// metodos Setters y Getters de los atributos de la clase 
void Nino::setEdad(int val)
{
    edad = val;
}

int Nino::getEdad()
{
    return edad;
}

void Nino::setNombre(string val)
{
    nombre = val;
}

string Nino::getNombre()
{
    return nombre;
}

void Nino::setRegistroCivil(int val)
{
    registro_civil = val;
}

int Nino::getRegistroCivil()
{
    return registro_civil;
}

void Nino::setAltura(float val)
{
    altura = val;
}

float Nino::getAltura()
{
    return altura;
}

void Nino::setPeso(int val)
{
    peso = val;
}

int Nino::getPeso()
{
    return peso;
}

void Nino::setIdPadre(int val)
{
    id_padre = val;
}

int Nino::getIdPadre()
{
    return id_padre;
}

void Nino::setNombrePadre(string val)
{
    nombre_padre = val;
}

string Nino::getNombrePadre()
{
    return nombre_padre;
}

void Nino::setMunicipio(int val)
{
    municipio = val;
}

int Nino::getMunicipio()
{
    return municipio;
}

void Nino::setSiguiente(Nino *val)
{
    siguiente = val;
}

Nino *Nino::getSiguiente()
{
    return siguiente;
}

void Nino::setAnterior(Nino *val)
{
    anterior = val;
}

Nino *Nino::getAnterior()
{
    return anterior;
}

// método para copiar toda la información de un nodo 
void Nino::copiar(Nino *nd)
{
    edad = nd->getEdad();
    nombre = nd->getNombre();
    registro_civil = nd->getRegistroCivil();
    altura = nd->getAltura();
    peso = nd->getPeso();
    id_padre = nd->getIdPadre();
    nombre_padre = nd->getNombrePadre();
}

#ifndef PROGRAMADEPARTAMENTAL_H
#define PROGRAMADEPARTAMENTAL_H
#include "Nino.h"
#include <iostream>

using namespace std;

class ProgramaDepartamental
{
    public:
        ProgramaDepartamental();
        virtual ~ProgramaDepartamental();
        // metodos publicos de la clase ProgramaDepartamental 
        void setCabeza(Nino *val);
        Nino *getCabeza();
        Nino *ultimo();
        void agregarFinal(Nino *nuevo);
        void agregarEntreNodos(Nino *nd, Nino *nuevo);
        void agregarInicio(Nino *nuevo);
        void eliminarNodo(Nino *nd);
        Nino *buscar(int num_r);
        int contarNodos();
        int contarNinosMunicipio(int mun);
        int contarNinosMunicipioPeso(int mun);
        int contarNinosPorAltura(int mun);
        void ordenarIntercambio(Nino *n);
        void cambiar(Nino *p1, Nino *p2);
    protected:

    private:
        // atributo privado de la clase ProgramaDepartamental 
        Nino *cabeza;
};

#endif // PROGRAMADEPARTAMENTAL_H 

#include "ProgramaDepartamental.h"

ProgramaDepartamental::ProgramaDepartamental()
{
    // se le asigna un valor por defecto en el contructor al atributo de la clase ProgramaDepartamental 
    cabeza = NULL;
}

ProgramaDepartamental::~ProgramaDepartamental()
{
    //dtor 
}

// metodo set y get del atributo de la clase 
void ProgramaDepartamental::setCabeza(Nino *val)
{
    cabeza = val;
}

Nino* ProgramaDepartamental::getCabeza()
{
    return cabeza;
}

// método para retornar el ultimo nodo de la lista 
Nino* ProgramaDepartamental::ultimo()
{
    // se inicializa una variable de tipo Nino en la cabeza 
    Nino *temp = cabeza;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // entonces, si el siguiente nodo de temp es igual a null 
        if (temp->getSiguiente() == NULL)
        {
            // entonces, se rompe el ciclo 
            break;
        }
        else
        {
            // sino, se salta al siguiente nodo del temp 
            temp = temp->getSiguiente();
        }
    }
    // se retorna el nodo temp 
    return temp;
}

// método para agregar por el final 
void ProgramaDepartamental::agregarFinal(Nino *nuevo)
{
    // se inicializa una variable de tipo Nino en el valor que retorne el metodo ultimo 
    Nino *temp = ultimo();
    // si la cabeza es diferente a null (si hay un nodo en la lista) 
    if (cabeza != NULL)
    {
        // entonces, el siguiente nodo de temp ahora sera el nuevo nodo 
        temp->setSiguiente(nuevo);
        // el nodo anterior de nuevo ahora sera el nodo temp 
        nuevo->setAnterior(temp);
        // y el siguiente de nodo ahora sera null 
        nuevo->setSiguiente(NULL);
    }
    else
    {
        // sino, entonces la cabeza apuntara al nuevo nuevo 
        cabeza = nuevo;
        // y el siguiente de nodo ahora sera null 
        nuevo->setAnterior(NULL);
    }
}

// método para agregar entre nodos 
void ProgramaDepartamental::agregarEntreNodos(Nino *nd, Nino *nuevo)
{
    // el siguiente nodo del nuevo sera el siguiente nodo de nd 
    nuevo->setSiguiente(nd->getSiguiente());
    // si el siguiente nodo de nd es diferente a null 
    if (nd->getSiguiente() != NULL)
    {
        // entonces el nodo anterior del siguiente nodo de nd ahora sera el nuevo nodo 
        nd->getSiguiente()->setAnterior(nuevo);
    }
    // el siguiente nodo de nd sera el nuevo nodo 
    nd->setSiguiente(nuevo);
    // el nodo anterior del nuevo nodo ahora sera el nodo nd 
    nuevo->setAnterior(nd);
}

// método para agregar desde el inicio 
void ProgramaDepartamental::agregarInicio(Nino *nuevo)
{
    // si la cabeza es diferente a null 
    if (cabeza != NULL)
    {
        // entonces, el siguiente nodo del nuevo ahora sera la cabeza 
        nuevo->setSiguiente(cabeza);
        // el nodo anterior de la cabeza sera el nuevo nodo 
        cabeza->setAnterior(nuevo);
        // el nodo anterior del nuevo nodo sera null 
        nuevo->setAnterior(NULL);
        // la cabeza sera el nuevo nodo 
        setCabeza(nuevo);
    }
    else
    {
        // sino, la cabeza sera el nuevo nodo 
        cabeza = nuevo;
        // el nodo anterior del nuevo nodo apuntara a null 
        nuevo->setAnterior(NULL);
    }
}

// método para eliminar nodo 
void ProgramaDepartamental::eliminarNodo(Nino *nd)
{
    // se declara una variable de tipo Nino llamada anterior 
    Nino *anterior;
    // si el nodo nd es igual a la cabeza 
    if (nd == cabeza)
    {
        // entonces, la cabeza saltara a su siguiente (saltaria a null) 
        cabeza = cabeza->getSiguiente();
    }
    else
    {
        // sino, el nodo anterior tendra el valor de la cabeza 
        anterior = cabeza;
        // mientras el siguiente nodo del anterior sea difente al nodo nd 
        while (anterior->getSiguiente() != nd)
        {
            // entonces se salta al siguiente nodo del anterior 
            anterior = anterior->getSiguiente();
        }
        // el siguiente del anterior ahora sera el siguiente nodo de nd 
        anterior->setSiguiente(nd->getSiguiente());
        // el anterior del siguiente nodo de nd ahora sera el nodo anterior 
        nd->getSiguiente()->setAnterior(anterior);
    }
    // el siguiente de nd sera null 
    nd->setSiguiente(NULL);
    // el anterior de nd sera null 
    nd->setAnterior(NULL);
}

// método para buscar mediante el numero de registro 
Nino* ProgramaDepartamental::buscar(int num_r)
{
    // se declara una variable de tipo Nino 
    Nino *temp;
    // se le asigna a temp el valor de la cabeza 
    temp = cabeza;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // entonces, si el registro civil del nodo temp es igual al valor de la variable num_r 
        if (temp->getRegistroCivil() == num_r)
        {
            // se rompe el ciclo 
            break;
        }
        else
        {
            // sino, se salta al siguiente nodo de temp 
            temp = temp->getSiguiente();
        }
    }
    // se retorna el nodo temp 
    return temp;
}

// método para contar los nodos de la lista 
int ProgramaDepartamental::contarNodos()
{
    // se inicializa la variable de tipo Nino temp en la cabeza 
    Nino *temp = cabeza;
    // se inicializa la variable de tipo entero contador en 0 
    int contador = 0;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // se incrementara la variable contador 
        contador++;
        // y se salta al siguiente nodo de temp 
        temp = temp->getSiguiente();
    }
    // se retorna el valor de la variable contador 
    return contador;
}

// método para contar los niños de cada municipio 
int ProgramaDepartamental::contarNinosMunicipio(int mun)
{
    // se inicializa la variable de tipo Nino temp en la cabeza 
    Nino *temp = cabeza;
    // se inicializa la variable de tipo entero contador en 0 
    int contador = 0;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // si el municipio del nodo temp es igual al valor de la variable mun 
        if (temp->getMunicipio() == mun)
        {
            // se incrementa el valor de la variable contador 
            contador++;
        }
        // se salta al siguiente nodo de temp 
        temp = temp->getSiguiente();
    }
    // se retorna el valor de la variable contador 
    return contador;
}

// método para contar los niños de cada municipio en condiciones de bajo peso 
int ProgramaDepartamental::contarNinosMunicipioPeso(int mun)
{
    // se inicializa la variable de tipo Nino temp en la cabeza 
    Nino *temp = cabeza;
    // se inicializa la variable de tipo entero contador en 0 
    int contador = 0;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // si el municipio del nodo temp es igual al valor de la variable mun y esta entre el rango de 2 a 3 años y tiene un peso menor a 15 kg
        // ó si el municipio del nodo temp es igual al valor de la variable num y esta tiene una edad entre 4 y 6 años y tiene un peso inferior a 25kg 
        if (temp->getMunicipio() == mun && ((temp->getEdad() >= 2 && temp->getEdad() <= 3) && temp->getPeso() < 15) || temp->getMunicipio() == mun && ((temp->getEdad() >= 4 && temp->getEdad() <= 6) && temp->getPeso() < 25))
        {
            // se incrementa el valor de la variable contador 
            contador++;
        }
        // se salta al siguiente nodo de temp 
        temp = temp->getSiguiente();
    }
    // se retorna el valor de la variable contador 
    return contador;
}

// método para contar la cantidad de niños que tienen una altura inferiro a 1m 
int ProgramaDepartamental::contarNinosPorAltura(int mun)
{
    // se inicializa la variable de tipo Nino temp en la cabeza 
    Nino *temp = cabeza;
    // se inicializa la variable de tipo entero contador en 0 
    int contador = 0;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // si el municipio del nodo temp es igual al valor de la variable num y si tiene una edad entre 4 y 6 años
        // y si tiene una altura menor a 1 
        if (temp->getMunicipio() == mun && ((temp->getEdad() >= 4 && temp->getEdad() <= 6) && temp->getAltura() < 1))
        {
            // se incrementa el valor de la variable contador 
            contador++;
        }
        // se salta al siguiente nodo de temp 
        temp = temp->getSiguiente();
    }
    // se retorna el valor de la variable contador 
    return contador;
}

// método para ordenar por intercambio 
void ProgramaDepartamental::ordenarIntercambio(Nino *n)
{
    // Se declaran dos variables de tipo Nino actual y siguiente 
    Nino *actual;
    Nino *siguiente;
    // se le asigna al nodo actual el valor del nodo n 
    actual = n;
    // mientras el siguiente nodo del actual sea diferente a null 
    while(actual->getSiguiente() != NULL)
    {
        // entonces, se le asignara al nodo siguiente el valor del siguiente nodo del actual 
        siguiente = actual->getSiguiente();
        // mientra el nodo siguiente sea diferente a null 
        while(siguiente != NULL)
        {
            // entonces si el peso del nodo actual es mayor al peso del siguiente nodo 
            if(actual->getPeso() > siguiente->getPeso())
            {
                // entonces se cambia el nodo actual por el siguiente 
                cambiar(actual, siguiente);
            }
            // se salta al siguiente nodo de siguiente 
            siguiente = siguiente->getSiguiente();
        }
        // se salta al siguiente nodo de actual 
        actual = actual->getSiguiente();
    }
}

// método para cambiar los nodos 
void ProgramaDepartamental::cambiar(Nino* p1, Nino* p2)
{
    // creo un nuevo nodo para poder realizar la copia 
    Nino *temp = new Nino();
    // le asigno al nodo temp los datos del nodo actual (p1) 
    temp->copiar(p1);
    // le asigno al nodo p1 los datos del nodo siguiente (p2) 
    p1->copiar(p2);
    // le asigno al nodo p2 los datos del temp 
    p2->copiar(temp);
}

// se importa paquete JOptionPane para dibujar un cuadro de dialogo en pantalla
// que muestre información o para llenar información 
import javax.swing.JOptionPane;

public class Main
{
    // método para llenar la lista 
    public static void llenar(Niño nod)
    {
        int e;
        // con el ciclo do while comprobare que la edad este entre el rango de 1 y 6 años 
        do
        {
            e = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese edad del niño:")); 
        }
        while (e < 1 || e > 6);
        // encapsulo la variable e 
        nod.setEdad(e); 
        // se pide el nombre del niño 
        String n = JOptionPane.showInputDialog(null,"Ingrese nombre del niño:");
        // encapsulo la variable n 
        nod.setNombre(n);
        // se pide el registro civil del niño 
        int n_r = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese número de registro civil del niño:")); 
        // encapsulo la variable n_r 
        nod.setRegistroCivil(n_r);
        // se pide la altura del niño 
        float a = Float.parseFloat(JOptionPane.showInputDialog(null,"Ingrese altura del niño:")); 
        // se encapsula la variable a 
        nod.setAltura(a);
        // se pide el peso del niño 
        int p = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese peso del niño:"));
        // se encapsula la variable p 
        nod.setPeso(p);
        // se pide el numero de identificacion del padre 
        int id = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese número de identificación del padre/madre del niño:"));
        // se encapsula la variable id 
        nod.setIdPadre(id);
        // se pide el nombre del padre o la madre del niño 
        String n_p = JOptionPane.showInputDialog(null,"Ingrese nombre del padre/madre del niño:"); 
        // se encapsula la variable n_p 
        nod.setNombrePadre(n_p);
        int m;
        // con el ciclo do while comprobare que se ingrese el municipio correcto 
        do
        {
            m = Integer.parseInt(JOptionPane.showInputDialog(null,
                "Ingrese municipio donde vive el niño\n" +
                "1. Sahagún\n" +
                "2. Montería\n" +
                "3. Lorica\n"));
        }
        while (m < 1 || m > 3);
        // se encapsula la variable m 
        nod.setMunicipio(m);
    }
    
    // método para mostrar el municipio 
    public static String mostrarMunicipio(int opc)
    {
        // mediante el valor que se pase como parametro opc, el switch escore el caso 
        switch (opc)
        {
            case 1:
                return "Sahagún";
            case 2:
                return "Montería";
            default:
                return "Lorica";
        }
    }
    
    // método para mostrar la informacion del niño 
    public static void mostrar(Niño nod)
    {
        // declaro una variable de tipo String datos y la inicializo en "" 
        String datos = ""; 
        // le acumulo a la variable datos los valores convertidos a String del niño 
        datos += String.valueOf(
                "Nombre: " + nod.getNombre() + "\n" +
                "Edad: " + nod.getEdad() + "\n" +
                "Registro Civil: " + nod.getRegistroCivil() + "\n" +
                "Altura: " + nod.getAltura() + "\n" +
                "Peso: " + nod.getPeso() + "\n" +
                "Nombre representante: " + nod.getNombrePadre() + "\n" +
                "ID representante: " + nod.getIdPadre() + "\n" +
                "Municipio: " + mostrarMunicipio(nod.getMunicipio()) + "\n\n");
        // muestro con mensaje de dialogo la variable datos 
        JOptionPane.showMessageDialog(null,datos); 
    } 
    
    // método para listar todos la lista 
    public static void listar(ProgramaDepartamental obj)
    {
        // declaro e inicializo la variable temp en el valor que tenga la cabeza 
        Niño temp = obj.getCabeza(); 
        // mientras haya un nodo en la lista 
        while (temp != null)
        {
            // entonces mostrara la informacion del nodo temp 
            mostrar(temp);
            // y se salta al siguiente nodo temp 
            temp = temp.getSiguiente();
        }
    }
    
    // método para listar los niños por municipio 
    public static void listarPorMunicipio(ProgramaDepartamental obj)
    {
        // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
        for (int i = 1; i <= 3; i++)
        {
            // muestro en un mensaje de dialogo, el municipio actual: mostrarMunicipio(i) 
            JOptionPane.showMessageDialog(null, "[Niños del municipio de " + mostrarMunicipio(i) + "]");
            // declaro e inicializo la variable temp con el valor de la cabeza 
            Niño temp = obj.getCabeza();
            // mientras haya un nodo en la lista 
            while (temp != null)
            {
                // entonces, si el nodo temp pertenece al municipio i (i = 0: Sahagún, i = 1: Montería, i = 2: Lorica) 
                if (temp.getMunicipio() == i)
                {
                    // se muestra la información del nodo temp 
                    mostrar(temp);
                }
                // se salta al siguiente nodo temporal 
                temp = temp.getSiguiente();
            }
            // muestro la cantidad de niños de cada municipio, llamando al metodo contarNiñosMunicipio y pasandole como parametro i 
            JOptionPane.showMessageDialog(null, "Hay " + obj.contarNiñosMunicipio(i) + " niño(s) en el municipio de " + mostrarMunicipio(i));
        }
    }
    
    // método para listar cada niño si cumple las condiciones de peso bajo 
    public static void listarPorCondicionesPeso(ProgramaDepartamental obj)
    {
        JOptionPane.showMessageDialog(null, "[Niños de 2 y 3 o 4 y 6 años en condiciones de bajo peso]");
        // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
        for (int i = 1; i <= 3; i++)
        {
            // declaro e inicializo la variable temp con el valor de la cabeza 
            Niño temp = obj.getCabeza();
            // mientras haya un nodo en la lista 
            while (temp != null)
            {
                // entonces, si el municipio es igual a i, y tiene una edad entre 2 y 3 años y pesa menos de 15 kg ó si tiene una edad entre 4 y 6 y pesa menos de 25 kg 
                if (temp.getMunicipio() == i && ((temp.getEdad() >= 2 && temp.getEdad() <= 3) && temp.getPeso() < 15) || temp.getMunicipio() == i && ((temp.getEdad() >= 4 && temp.getEdad() <= 6) && temp.getPeso() < 25))
                {
                    // se mostrara la informacion del nodo temp 
                    mostrar(temp);
                }
                // se salta al siguiente nodo temp 
                temp = temp.getSiguiente();
            }
            // se muestra la cantidad de niños en condiciones de bajo peso por municipio 
            JOptionPane.showMessageDialog(null, "Hay " + obj.contarNiñosMunicipioPeso(i) + " niño(s) en el municipio de " + mostrarMunicipio(i) + " en condiciones de bajo peso.");
        }
    }
    
    // método para listar cada niño si tiene una altura menor a 1 metro 
    public static void listarPorAltura(ProgramaDepartamental obj)
    {
        JOptionPane.showMessageDialog(null, "[Niños entre 4 y 6 años que miden menos de 1 metro]");
        // como son 3 municipios, entonces recorrere con el ciclo for desde 1 hasta 3 
        for (int i = 1; i <= 3; i++)
        {
            // declaro e inicializo la variable temp con el valor de la cabeza 
            Niño temp = obj.getCabeza();
            // mientras haya un nodo en la lista 
            while (temp != null)
            {
                // si el niño esta en el municipio i y tiene una edad entre 4 y 6 años y tiene una altura menor a 1 m 
                if (temp.getMunicipio() == i && ((temp.getEdad() >= 4 && temp.getEdad() <= 6) && temp.getAltura() < 1))
                {
                    // entonces se mostrara la información del nodo temp 
                    mostrar(temp);
                }
                // se salta al siguiente nodo temp 
                temp = temp.getSiguiente();
            }
            // se muestra la cantidad de niños con una estatura menor a 1m por municipio 
            JOptionPane.showMessageDialog(null, "Hay " + obj.contarNiñosPorAltura(i) + " niño(s) en el municipio de " + mostrarMunicipio(i) + " en condiciones de bajo peso.");
        }
    }
    
    // método para mostrar el menu de opciones 
    public static int menu()
    { 
        int opc; 
        do
        {
            opc = Integer.parseInt(JOptionPane.showInputDialog(null,
                "==================MENU==================\n" +
                "1. Agregar información del niño y su representante por el final.\n" +
                "2. Insertar entre dos nodos existentes.\n" +
                "3. Agregar información del niño y su representante por el principio.\n" +
                "4. Buscar por número de registro civil.\n" +
                "5. Ordenar la información, teniendo en cuenta el peso de los niños.\n" +
                "6. Eliminar la información de un niño y su representante.\n" +
                "7. Listado por municipios.\n" +
                "8. Listado por condiciones bajos de peso.\n" +
                "9. Listado por altura.\n" +
                "10. Mostrar toda la lista\n" +
                "11. Salir")); 
        }
        while (opc < 0 || opc > 11);
        return opc; 
    } 
    
    public static void main(String[] args)
    {
        // creo un objeto de la clase ProgramaDepartamental (instanciación) 
        ProgramaDepartamental obj = new ProgramaDepartamental();
        // declaro una variable de tipo Niño 
        Niño aux;
        // declaro dos variables de tipo entero opcion y num_reg 
        int opcion, num_reg;
        do
        { 
           // se le asigna a la variable opcion el valor que retorne el metodo menu 
           opcion = menu();
           // dependiendo del valor de la opcion se escogera un caso 
           switch(opcion)
           {
                case 1:
                    aux = new Niño();
                    llenar(aux);
                    obj.agregarFinal(aux);
                    JOptionPane.showMessageDialog(null,"Se ha agregado correctamente la información");
                    break;
                case 2:
                    num_reg = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese número de registro del nodo anterior al que desea agregar:")); 
                    aux = obj.buscar(num_reg);
                    if(aux != null)
                    {
                        aux = new Niño(); 
                        llenar(aux);
                        obj.agregarEntreNodos(obj.buscar(num_reg), aux); 
                        JOptionPane.showMessageDialog(null,"Se ha agregado correctamente la información");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"No se ha encontrado el nodo!"); 
                    }
                    break;
                case 3:
                    aux = new Niño();
                    llenar(aux);
                    obj.agregarInicio(aux);
                    JOptionPane.showMessageDialog(null,"Se ha agregado correctamente la información");
                    break;
                case 4:
                    num_reg = Integer.parseInt(JOptionPane.showInputDialog(null,"Ingrese número de registro del nodo anterior al que desea agregar:")); 
                    aux = obj.buscar(num_reg);
                    if(aux != null)
                    {
                        mostrar(obj.buscar(num_reg)); 
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"No se ha encontrado el nodo!"); 
                    }
                    break;
                case 5:
                    aux = obj.getCabeza();
                    if (aux != null)
                    {
                        if(obj.contarNodos() > 1)
                        {
                            aux = obj.getCabeza();
                            obj.ordenarIntercambio(aux);
                            listar(obj);
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null, "Solo hay un niño, agregue por lo menos 1 niño mas para ordenar.");
                        }
                    }
                    break;
                case 6:
                    aux = obj.getCabeza();
                    obj.eliminarNodo(aux);
                    JOptionPane.showMessageDialog(null, "Se elimino correctamente.");
                    break;
                case 7:
                    listarPorMunicipio(obj);
                    break;
                case 8:
                    listarPorCondicionesPeso(obj);
                    break;
                case 9:
                    listarPorAltura(obj);
                    break;
                case 10:
                    listar(obj);
                    break;
                default:
                    break;
           } 
        }
        while (opcion != 11);
    }
}

public class Niño
{
    // atributos privados de la clase Niño 
    private int edad;
    private String nombre;
    private int registro_civil;
    private float altura;
    private int peso;
    private int id_padre;
    private String nombre_padre;
    private int municipio;
    private Niño siguiente;
    private Niño anterior;
    
    public Niño()
    {
        // se le asigna valores por defecto en el constructor a los atributos de la clase Niño 
        edad = 0;
        nombre = "";
        registro_civil = 0;
        altura = 0;
        peso = 0;
        id_padre = 0;
        nombre_padre = "";
        municipio = 0;
        siguiente = null;
        anterior = null;
    }
    
    // metodos Setters y Getters de los atributos de la clase 
    public void setEdad(int val)
    {
        edad = val;
    }
    
    public int getEdad()
    {
        return edad;
    }
    
    public void setNombre(String val)
    {
        nombre = val;
    }
    
    public String getNombre()
    {
        return nombre;
    }
    
    public void setRegistroCivil(int val)
    {
        registro_civil = val;
    }
    
    public int getRegistroCivil()
    {
        return registro_civil;
    }
    
    public void setAltura(float val)
    {
        altura = val;
    }
    
    public float getAltura()
    {
        return altura;
    }
    
    public void setPeso(int val)
    {
        peso = val;
    }
    
    public int getPeso()
    {
        return peso;
    }
    
    public void setIdPadre(int val)
    {
        id_padre = val;
    }
    
    public int getIdPadre()
    {
        return id_padre;
    }
    
    public void setNombrePadre(String val)
    {
        nombre_padre = val;
    }
    
    public String getNombrePadre()
    {
        return nombre_padre;
    }
    
    public void setMunicipio(int val)
    {
        municipio = val;
    }
    
    public int getMunicipio()
    {
        return municipio;
    }
    
    public void setSiguiente(Niño val)
    {
        siguiente = val;
    }
    
    public Niño getSiguiente()
    {
        return siguiente;
    }
    
    public void setAnterior(Niño val)
    {
        anterior = val;
    }
    
    public Niño getAnterior()
    {
        return anterior;
    }
    
    // método para copiar toda la información de un nodo 
    public void copiar(Niño nd)
    {
        edad = nd.getEdad();
        nombre = nd.getNombre();
        registro_civil = nd.getRegistroCivil();
        altura = nd.getAltura();
        peso = nd.getPeso();
        id_padre = nd.getIdPadre();
        nombre_padre = nd.getNombrePadre();
    }
}

public class ProgramaDepartamental
{
    // se declara el atributo privado de la clase 
    private Niño cabeza;
    
    public ProgramaDepartamental()
    {
        // se le asigna un valor por defecto en el contructor al atributo de la clase ProgramaDepartamental 
        cabeza = null;
    }
    
    // metodo set y get del atributo de la clase 
    public void setCabeza(Niño val)
    {
        cabeza = val;
    }
    
    public Niño getCabeza()
    {
        return cabeza;
    }
    
    // método para retornar el ultimo nodo de la lista 
    public Niño ultimo()
    {
        // se inicializa una variable de tipo Niño en la cabeza 
        Niño temp = cabeza;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // entonces, si el siguiente nodo de temp es igual a null 
            if (temp.getSiguiente() == null)
            {
                // entonces, se rompe el ciclo 
                break; 
            }
            else
            {
                // sino, se salta al siguiente nodo del temp 
                temp = temp.getSiguiente(); 
            }
        }
        // se retorna el nodo temp 
        return temp; 
    }
    
    // método para agregar por el final 
    public void agregarFinal(Niño nuevo)
    { 
        // se inicializa una variable de tipo Niño en el valor que retorne el metodo ultimo 
        Niño temp = ultimo();
        // si la cabeza es diferente a null (si hay un nodo en la lista) 
        if (cabeza != null)
        {
            // entonces, el siguiente nodo de temp ahora sera el nuevo nodo 
            temp.setSiguiente(nuevo);
            // el nodo anterior de nuevo ahora sera el nodo temp 
            nuevo.setAnterior(temp);
            // y el siguiente de nodo ahora sera null 
            nuevo.setSiguiente(null);
        }
        else
        {
            // sino, entonces la cabeza apuntara al nuevo nuevo 
            cabeza = nuevo;
            // y el siguiente de nodo ahora sera null 
            nuevo.setAnterior(null); 
        }
    }
    
    // método para agregar entre nodos 
    public void agregarEntreNodos(Niño nd, Niño nuevo)
    {
        // el siguiente nodo del nuevo sera el siguiente nodo de nd 
        nuevo.setSiguiente(nd.getSiguiente()); 
        // si el siguiente nodo de nd es diferente a null 
        if (nd.getSiguiente() != null)
        {
            // entonces el nodo anterior del siguiente nodo de nd ahora sera el nuevo nodo 
            nd.getSiguiente().setAnterior(nuevo);
        }
        // el siguiente nodo de nd sera el nuevo nodo 
        nd.setSiguiente(nuevo);
        // el nodo anterior del nuevo nodo ahora sera el nodo nd 
        nuevo.setAnterior(nd);       
    }
    
    // método para agregar desde el inicio 
    public void agregarInicio(Niño nuevo)
    {
        // si la cabeza es diferente a null 
        if (cabeza != null)
        {
            // entonces, el siguiente nodo del nuevo ahora sera la cabeza 
            nuevo.setSiguiente(cabeza);
            // el nodo anterior de la cabeza sera el nuevo nodo 
            cabeza.setAnterior(nuevo); 
            // el nodo anterior del nuevo nodo sera null 
            nuevo.setAnterior(null);
            // la cabeza sera el nuevo nodo 
            setCabeza(nuevo);
        }
        else
        {
            // sino, la cabeza sera el nuevo nodo 
            cabeza = nuevo; 
            // el nodo anterior del nuevo nodo apuntara a null 
            nuevo.setAnterior(null);
        }
    }
    
    // método para eliminar nodo 
    public void eliminarNodo(Niño nd)
    {
        // se declara una variable de tipo Niño llamada anterior 
        Niño anterior;
        // si el nodo nd es igual a la cabeza 
        if (nd == cabeza)
        {
            // entonces, la cabeza saltara a su siguiente (saltaria a null) 
            cabeza = cabeza.getSiguiente(); 
        }
        else
        {
            // sino, el nodo anterior tendra el valor de la cabeza 
            anterior = cabeza;
            // mientras el siguiente nodo del anterior sea difente al nodo nd 
            while (anterior.getSiguiente() != nd)
            {
                // entonces se salta al siguiente nodo del anterior 
                anterior = anterior.getSiguiente(); 
            }
            // el siguiente del anterior ahora sera el siguiente nodo de nd 
            anterior.setSiguiente(nd.getSiguiente());
            // el anterior del siguiente nodo de nd ahora sera el nodo anterior 
            nd.getSiguiente().setAnterior(anterior); 
        }
        // el siguiente de nd sera null 
        nd.setSiguiente(null);
        // el anterior de nd sera null 
        nd.setAnterior(null);
    }
    
    // método para buscar mediante el numero de registro 
    public Niño buscar(int num_r)
    {
        // se declara una variable de tipo Niño 
        Niño temp;
        // se le asigna a temp el valor de la cabeza 
        temp = cabeza;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // entonces, si el registro civil del nodo temp es igual al valor de la variable num_r 
            if (temp.getRegistroCivil() == num_r)
            {
                // se rompe el ciclo 
                break; 
            }
            else
            {
                // sino, se salta al siguiente nodo de temp 
                temp = temp.getSiguiente(); 
            }
        }
        // se retorna el nodo temp 
        return temp; 
    } 
    
    // método para contar los nodos de la lista 
    public int contarNodos()
    {
        // se inicializa la variable de tipo Niño temp en la cabeza 
        Niño temp = cabeza;
        // se inicializa la variable de tipo entero contador en 0 
        int contador = 0;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // se incrementara la variable contador 
            contador++;
            // y se salta al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
        // se retorna el valor de la variable contador 
        return contador;
    }
    
    // método para contar los niños de cada municipio 
    public int contarNiñosMunicipio(int mun)
    {
        // se inicializa la variable de tipo Niño temp en la cabeza 
        Niño temp = cabeza;
        // se inicializa la variable de tipo entero contador en 0 
        int contador = 0;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el municipio del nodo temp es igual al valor de la variable mun 
            if (temp.getMunicipio() == mun)
            {
                // se incrementa el valor de la variable contador 
                contador++;
            }
            // se salta al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
        // se retorna el valor de la variable contador 
        return contador;
    }
    
    // método para contar los niños de cada municipio en condiciones de bajo peso 
    public int contarNiñosMunicipioPeso(int mun)
    {
        // se inicializa la variable de tipo Niño temp en la cabeza 
        Niño temp = cabeza;
        // se inicializa la variable de tipo entero contador en 0 
        int contador = 0;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el municipio del nodo temp es igual al valor de la variable mun y esta entre el rango de 2 a 3 años y tiene un peso menor a 15 kg
            // ó si el municipio del nodo temp es igual al valor de la variable num y esta tiene una edad entre 4 y 6 años y tiene un peso inferior a 25kg 
            if (temp.getMunicipio() == mun && ((temp.getEdad() >= 2 && temp.getEdad() <= 3) && temp.getPeso() < 15) || temp.getMunicipio() == mun && ((temp.getEdad() >= 4 && temp.getEdad() <= 6) && temp.getPeso() < 25))
            {
                // se incrementa el valor de la variable contador 
                contador++;
            }
            // se salta al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
        // se retorna el valor de la variable contador 
        return contador;
    }
    
    // método para contar la cantidad de niños que tienen una altura inferiro a 1m 
    public int contarNiñosPorAltura(int mun)
    {
        // se inicializa la variable de tipo Niño temp en la cabeza 
        Niño temp = cabeza;
        // se inicializa la variable de tipo entero contador en 0 
        int contador = 0;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el municipio del nodo temp es igual al valor de la variable num y si tiene una edad entre 4 y 6 años
            // y si tiene una altura menor a 1 
            if (temp.getMunicipio() == mun && ((temp.getEdad() >= 4 && temp.getEdad() <= 6) && temp.getAltura() < 1))
            {
                // se incrementa el valor de la variable contador 
                contador++;
            }
            // se salta al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
        // se retorna el valor de la variable contador 
        return contador;
    }
    
    // método para ordenar por intercambio 
    public void ordenarIntercambio(Niño n)
    {
        // Se declaran dos variables de tipo Niño actual y siguiente 
        Niño actual, siguiente;
        // se le asigna al nodo actual el valor del nodo n 
        actual = n;
        // mientras el siguiente nodo del actual sea diferente a null 
        while(actual.getSiguiente() != null)
        {
            // entonces, se le asignara al nodo siguiente el valor del siguiente nodo del actual 
            siguiente = actual.getSiguiente();
            // mientra el nodo siguiente sea diferente a null 
            while(siguiente != null)
            {
                // entonces si el peso del nodo actual es mayor al peso del siguiente nodo 
                if(actual.getPeso() > siguiente.getPeso())
                {
                    // entonces se cambia el nodo actual por el siguiente 
                    cambiar(actual, siguiente);
                }
                / se salta al siguiente nodo de siguiente 
                siguiente = siguiente.getSiguiente();
            }
            // se salta al siguiente nodo de actual 
            actual = actual.getSiguiente();
        }
    }
    
    // método para cambiar los nodos 
    public void cambiar(Niño p1, Niño p2)
    {
        // creo un nuevo nodo para poder realizar la copia 
        Niño temp = new Niño();
        // le asigno al nodo temp los datos del nodo actual (p1) 
        temp.copiar(p1);
        // le asigno al nodo p1 los datos del nodo siguiente (p2) 
        p1.copiar(p2);
        // le asigno al nodo p2 los datos del temp 
        p2.copiar(temp);
    }
}