3/14/2017

Ejercicio 44

Se desea registrar a los estudiantes de un colegio en una lista simple enlazada, se deben pedir su id, nombre y edad. Declare las clases necesarias para poder realizar las siguientes operaciones:

  • Añadir un nodo por el final.

  • Añadir un nodo entre el medio de dos nodos.

  • Añadir un nodo por el inicio.

  • Buscar un estudiante mediante su ID o por su Nombre

  • Mostrar la información de todos los nodos de la lista

  • Mostrar la cantidad de nodos que hay en la lista

  • Eliminar un nodo de la lista

  • Eliminar toda la lista

Matriz

#include <iostream>
// se incluye la clase Nodo para despues llamar a sus metodos 
#include "Nodo.h"
// se incluye la clase ListaSimple para despues llamar a sus metodos 
#include "ListaSimple.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 el nodo de la lista 
void llenar(Nodo *n, ListaSimple *obj)
{
    // declaramos una variable de tipo entero id  
    int id;
    // pedimos al usuario que ingrese la identificiación 
    cout << "Digite identificacion" << endl;
    cout << ">> ";
    // guardamos el valor en la variable id  
    cin >> id;
    // encapsulamos la variable id  
    n->setId(id);
    // declaramos una variable de tipo string nombre  
    string nom;
    // pedimos al usuario que ingrese el nombre 
    cout << "Digite nombre" << endl;
    cout << ">> ";
    // guardamos el valor en la variable nombre  
    cin >> nom;
    // encapsulamos la variable nombre  
    n->setNombre(nom);
    // declaramos una variable de tipo entero edad  
    int edad;
    // pedimos al usuario que ingrese la edad 
    cout << "Digite edad" << endl;
    cout << ">> ";
    // guardamos el valor en la variable edad  
    cin >> edad;
    // encapsulamos la variable edad  
    n->setEdad(edad);
}

// método para mostrar la informacion de un nodo 
void mostrar(Nodo *n)
{
    cout << "ID: " << n->getId() << endl;
    cout << "Nombre: " << n->getNombre() << endl;
    cout << "Edad: " << n->getEdad() << endl << endl;
}

// método para mostrar la informacion de todos los nodos 
void listarTodos(Nodo *n)
{
    // declaramos una variable temp de tipo Nodo y le asignamos n  
    Nodo *temp = n;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // se mostrara el nodo temp  
        mostrar(temp);
        // se saltara al siguiente nodo de temp  
        temp = temp->getSiguiente();
    }
}

// método para el menu 
int menu()
{
    int opcion = 0;
    do
    {
        cout << "1. Agregar estudiante al final de la Lista" << endl;
        cout << "2. Agregar estudiante entre dos Nodos existentes" << endl;
        cout << "3. Agregar estudiante al principio de la lista" << endl;
        cout << "4. Buscar estudiante por ID o por Nombre" << endl;
        cout << "5. Mostrar nodos de la lista" << endl;
        cout << "6. Cantidad de nodos que hay en la lista" << endl;
        cout << "7. Eliminar nodo de la lista" << endl;
        cout << "8. Eliminar toda la lista" << endl;
        cout << "9. Salir" << endl;
        cout << ">> ";
        cin >> opcion;
        system("cls");

    }
    while(opcion < 1 || opcion > 9);
    return opcion;
}

int main(void)
{
    // se crea un objeto de la clase ListaSimple (Instanciaciación) 
    ListaSimple *obj = new ListaSimple();
    // declaro dos variable de tipo entero opcion e id  
    int opcion, id;
    // declaro una variable de tipo string nombre  
    string nombre;
    // declaro una variable de tipo Nodo aux  
    Nodo *aux;
    // declaro una variable de tipo Nodo nd  
    Nodo *nd;
    do
    {
        // le asignare a la variable opcion el valor que retorne el método menu  
        opcion = menu();
        switch(opcion)
        {
            case 1:
                aux = new Nodo();
                llenar(aux, obj);
                system("cls");
                obj->agregarFinal(aux);
                break;
            case 2:
                cout << "Digite ID del estudiante que quiere agregar" << endl;
                cout << ">> ";
                cin >> id;
                system("cls");
                nd = obj->buscarId(id);
                if(nd != NULL)
                {
                    aux = new Nodo();
                    llenar(aux, obj);
                    obj->agregarEntreNodos(nd, aux);
                }
                else
                {
                    cout << "La ID NO se encuentra en la lista" << endl << endl;
                }
                break;
            case 3:
                aux = new Nodo();
                llenar(aux, obj);
                obj->agregarInicio(aux);

                if(obj->getCabeza() != NULL)
                {
                    listarTodos(obj->getCabeza());
                }
                else
                {
                    cout << "La Lista Está Vacía." << endl << endl;
                }
                break;
            case 4:
                int opc;
                do
                {
                    cout << "Como desea realizar la busqueda:" << endl;
                    cout << "1. ID" << endl;
                    cout << "2. Nombre" << endl;
                    cout << ">> ";
                    cin >> opc;
                    system("cls");
                }
                while(opc < 1 || opc > 2);
                if(opc == 1)
                {
                    cout << "Digite ID del estudiante a Buscar" << endl;
                    cout << ">> ";
                    cin >> id;
                    aux = obj->buscarId(id);
                    if(aux != NULL)
                    {
                        mostrar(aux);
                    }
                    else
                    {
                        cout << "La información del estudiante No se encuentra en la lista" << endl << endl;
                    }
                }
                else
                {
                    cout << "Digite Nombre del estudiante a Buscar" << endl;
                    cout << ">> ";
                    cin >> nombre;
                    aux = obj->buscarNombre(nombre);
                    if(aux != NULL)
                    {
                        mostrar(aux);
                    }
                    else
                    {
                        cout << "La información del estudiante No se encuentra en la lista" << endl << endl;
                    }
                }
                break;
            case 5:
                aux = obj->getCabeza();
                if (aux != NULL)
                {
                    listarTodos(aux);
                }
                else
                {
                    cout << "No hay nodos en la lista." << endl << endl;
                }
                break;
            case 6:
                cout << "Hay " << obj->contarNodos() << " nodos en la lista." << endl << endl;
                break;
            case 7:
                aux = obj->getCabeza();
                if (aux != NULL)
                {
                    obj->eliminar(aux);
                    cout << "Se elimino un nodo correctamente." << endl << endl;
                }
                else
                {
                    cout << "No hay nodos en la lista." << endl << endl;
                }
                break;
            case 8:
                obj->limpiar();
                cout << "La lista se ha eliminado." << endl << endl;
                break;
            default:
                break;
        }
    }
    while(opcion != 9);
}

#ifndef NODO_H
#define NODO_H
#include <iostream>

using namespace std;

class Nodo
{
    public:
        Nodo();
        virtual ~Nodo();
        // se declaran los metodos publicos 
        void setId(int n);
        int getId();
        void setNombre(string n);
        string getNombre();
        void setEdad(int n);
        int getEdad();
        void setSiguiente(Nodo *n);
        Nodo *getSiguiente();

    protected:

    private:
        // se declaran los atributos privados 
        int id;
        string nombre;
        int edad;
        Nodo *siguiente;
};

#endif // NODO_H 

#include "Nodo.h"

Nodo::Nodo()
{
    // al inicializar el constructor se definiran los valores iniciales de los atributos 
    id = 0;
    nombre = "";
    siguiente = NULL;
}

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

// métodos setters y getters de la clase Nodo 
void Nodo::setId(int n)
{
    id = n;
}

int Nodo::getId()
{
    return id;
}

void Nodo::setNombre(string n)
{
    nombre = n;
}

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

void Nodo::setEdad(int n)
{
    edad = n;
}

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

void Nodo::setSiguiente(Nodo* n)
{
    siguiente = n;
}

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

#ifndef LISTASIMPLE_H
#define LISTASIMPLE_H
#include "Nodo.h"
#include <iostream>

using namespace std;

class ListaSimple
{
    public:
        ListaSimple();
        virtual ~ListaSimple();
        // se declaran los metodos publicos 
        void setCabeza(Nodo *n);
        Nodo *getCabeza();
        Nodo *ultimo();
        int contarNodos();
        void agregarFinal(Nodo *n);
        void agregarEntreNodos(Nodo *nd, Nodo *nuevo);
        void agregarInicio(Nodo *n);
        Nodo *buscarId(int c);
        Nodo *buscarNombre(string n);
        void eliminar(Nodo *nd);
        void limpiar();
    protected:

    private:
        // se declaran los atributos privados 
        Nodo *cabeza;

};

#endif // LISTASIMPLE_H 

#include "ListaSimple.h"
#include <string>

ListaSimple::ListaSimple()
{
    // al inicializar el constructor se definiran los valores iniciales de los atributos 
    cabeza = NULL;
}

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

// método set y get del atributo de la clase 
void ListaSimple::setCabeza(Nodo* n)
{
    cabeza = n;
}

Nodo* ListaSimple::getCabeza()
{
    return cabeza;
}

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

// método para contar los nodos que hay en la lista 
int ListaSimple::contarNodos()
{
    // se inicializa una variable temp de tipo Nodo en la cabeza 
    Nodo *temp = cabeza;
    // se inicializa una variable contador en 0 
    int contador = 0;
    // mientras haya un nodo en la lista 
    while (temp != NULL)
    {
        // se incrementa la variable contador  
        contador++;
        // se salta al siguiente nodo de temp  
        temp = temp->getSiguiente();
    }
    // se retorna la variable contador  
    return contador;
}

// metodo para agregar al final de la lista 
void ListaSimple::agregarFinal(Nodo* n)
{
    // si la cabeza apunta a null 
    if (cabeza == NULL)
    {
        // entonces, la cabeza apuntara al nodo n  
        setCabeza(n);
    }
    else
    {
        // el ultimo nodo apuntara al nodo n  
        ultimo()->setSiguiente(n);
    }
}

// método para agregar un nodo entre dos nodos de la lista 
void ListaSimple::agregarEntreNodos(Nodo* nd, Nodo* nuevo)
{
    // donde nd es el Nodo anterior (A) y nuevo es el NUEVO NODO
    // se necesita dos nodos A & B por ejemplo
    // A debe apuntar al nuevo nodo auxiliar y el nodo auxiliar
    // apuntara al nodo B. 
    nuevo->setSiguiente(nd->getSiguiente());
    // el siguiente de nuevo sera el siguiente de A (B). 
    nd->setSiguiente(nuevo);
    // el NODO nd (A) apunta al nodo nuevo. 
}

// método para agregar al inicio de la lista 
void ListaSimple::agregarInicio(Nodo* n)
{
    // el nodo n apuntara a la cabeza 
    n->setSiguiente(cabeza);
    // la cabeza apuntara al nodo n  
    setCabeza(n);
}

// método para buscar por id 
Nodo* ListaSimple::buscarId(int c)
{
    // se inicializa una variable temp de tipo Nodo en la cabeza 
    Nodo *temp = cabeza;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // si el id del nodo temp es igual al parametro c 
        if(temp->getId() == c)
        {
            // se rompe el ciclo 
            break;
        }
        else
        {
            // sino el nodo temp apuntara a su siguiente nodo 
            temp = temp->getSiguiente();
        }
    }
    // se retorna el nodo temp  
    return temp;
}

// método para buscar por nombre 
Nodo* ListaSimple::buscarNombre(string n)
{
    // se inicializa una variable temp de tipo Nodo en la cabeza 
    Nodo *temp = cabeza;
    // mientras haya un nodo en la lista 
    while(temp != NULL)
    {
        // si el nombre del nodo temp es igual al parametro n 
        if(temp->getNombre().compare(n) == 0)
        {
            // se rompe el ciclo 
            break;
        }
        else
        {
            // sino el nodo temp apuntara a su siguiente nodo 
            temp = temp->getSiguiente();
        }
    }
    return temp;
}

// método para eliminar un nodo de la lista 
void ListaSimple::eliminar(Nodo* nd)
{
    Nodo *anterior;
    // si el nodo a eliminar en la lista es el primero entonces 
    if (nd == cabeza)
    {
        // la cabeza apuntara a su siguiente 
        cabeza = cabeza->getSiguiente();
    }
    else
    {
        // se busca el nodo anterior al que se quiere eliminar (nd) 
        anterior = cabeza;
        while (anterior->getSiguiente() != nd)
        {
            anterior = anterior->getSiguiente();
        }
        // el nodo anterior ahora apuntara al siguiente nodo de nd  
        anterior->setSiguiente(nd->getSiguiente());
    }
    nd->setSiguiente(NULL);
}

// método para limpiar toda la lista 
void ListaSimple::limpiar()
{
    while(cabeza != NULL)
    {
        eliminar(cabeza);
    }
}

// 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(Nodo n, ListaSimple obj)
    {
        // pedimos el ID 
        int id = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite identificación:"));
        // encapsulamos la variable id 
        n.setId(id);
        // pedimos el nombre 
        String nom = JOptionPane.showInputDialog(null, "Digite nombre:");
        // encapsulamos la variable nom 
        n.setNombre(nom);
        // pedimos la edad 
        int edad = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite edad:"));
        // encapsulamos la variable edad 
        n.setEdad(edad);
    }
    
    // método para mostrar un nodo de la lista 
    public static void mostrar(Nodo n)
    {
        // se inicializa una variable de tipo entero datos en "" 
        String datos = "";
        datos += String.valueOf("ID: " + n.getId()+ "\n" +
                                "Nombre: " + n.getNombre() + "\n" +
                                "Edad: " + n.getEdad());
        // se muestra los datos 
        JOptionPane.showMessageDialog(null, "=========== INFORMACÓN DE LOS NODOS DE LA LISTA =========== \n"+ datos);
    }
    
    // método para listar toda la lista 
    public static void listarTodos(Nodo n)
    {
        // inicializo una variable de tipo nodo temp en n 
        Nodo temp = n;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // muestro el nodo temp 
            mostrar(temp);
            // salto al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
    }
    
    // método para el menu del programa 
    public static int menu()
    {
        int opcion = 0;
        do
        {
            opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== SELECCIONE UNA OPCIÓN DEL MENÚ =========== \n" +
            "1. Agregar estudiante al final de la Lista \n" +
            "2. Agregar estudiante entre dos Nodos existentes\n" +
            "3. Agregar estudiante al principio de la lista\n" +
            "4. Buscar estudiante por ID o por Nombre\n" +
            "5. Mostrar nodos de la lista\n" +
            "6. Cantidad de nodos que hay en la lista\n" +
            "7. Eliminar nodo de la lista\n" + 
            "8. Eliminar toda la lista\n" +
            "9. Salir\n\n" +
            " Seleccione una opción del 1 al 9:"));
        }
        while(opcion < 1 || opcion > 9);
        return opcion;
    }
    
    public static void main(String[] args)
    {
        // se crea un objeto de la clase Triangulo (Instanciaciación) 
        ListaSimple obj = new ListaSimple();
        // se declaran dos variables: opcion e id de tipo entero 
        int opcion, id;
        // se declara una variable de tipo String nombre 
        String nombre;
        // se declara una variable de tipo nodo aux 
        Nodo aux;
        do
        {
            opcion = menu();
            switch(opcion) 
            {
                case 1:
                    aux = new Nodo();
                    llenar(aux, obj);
                    obj.agregarFinal(aux);
                    break;
                case 2:
                    id = Integer.parseInt(JOptionPane.showInputDialog("Digite ID del estudiante que quiere agregar: "));
                    Nodo nd = obj.buscarId(id);
                    if(nd != null)
                    {
                        aux = new Nodo();
                        llenar(aux, obj);
                        obj.agregarEntreNodos(nd, aux);
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "La ID NO se encuentra en la lista");
                    }
                    break;
                case 3:
                    aux = new Nodo();
                    llenar(aux, obj);
                    obj.agregarInicio(aux);
                    
                    if(obj.getCabeza() != null)
                    {
                        listarTodos(obj.getCabeza());
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "La Lista Está Vacía....");
                    }
                    break;
                case 4:
                    int opc;
                    do
                    {
                        opc = Integer.parseInt(JOptionPane.showInputDialog("Como desea realizar la busqueda:\n 1. ID\n 2. Nombre"));
                    }
                    while(opc < 1 || opc > 2);
                    if(opc == 1)
                    {
                        id = Integer.parseInt(JOptionPane.showInputDialog("Digite ID del estudiante a Buscar: "));
                        aux = obj.buscarId(id);
                        if(aux != null)
                        {
                            mostrar(aux);
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null, "La información del estudiante No se encuentra en la lista");
                        }
                    }
                    else
                    {
                        nombre = JOptionPane.showInputDialog("Digite Nombre del estudiante a Buscar: ");
                        aux = obj.buscarNombre(nombre);
                        if(aux != null)
                        {
                            mostrar(aux);
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null, "La información del estudiante No se encuentra en la lista");
                        }
                    }
                    break;
                case 5:
                    aux = obj.getCabeza();
                    if (aux != null)
                    {
                        listarTodos(aux);
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "No hay nodos en la lista.");
                    }
                    break;
                case 6:
                    JOptionPane.showMessageDialog(null, "Hay " + obj.contarNodos() + " nodos en la lista.");
                    break;
                case 7:
                    aux = obj.getCabeza();
                    if (aux != null)
                    {
                        obj.eliminar(aux);
                        JOptionPane.showMessageDialog(null, "Se elimino un nodo correctamente.");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "No hay nodo en la lista.");
                    }
                    break;
                case 8:
                    obj.limpiar();
                    JOptionPane.showMessageDialog(null, "La lista se ha eliminado.");
                    break;
                default:
                    break;
            }
        }
        while(opcion != 9);
    }
}

public class Nodo
{
    // se declaran los atributos privados 
    private int id;
    private String nombre;
    private int edad;
    private Nodo siguiente;
    
    public void Nodo()
    {
        // le asigno valores por defecto a los atributos en el constructor de la clase Nodo 
        id = 0;
        nombre = "";
        edad = 0;
        siguiente = null;
    }
    
    // metodos setters y getters de la clase Nodo 
    public void setId(int n)
    {
        id  = n;
    }
    
    public int getId()
    {
        return id;
    }
    
    public void setNombre(String n)
    {
        nombre = n;
    }
    
    public String getNombre()
    {
        return nombre;
    }
    
    public void setEdad(int n)
    {
        edad = n;
    }
    
    public int getEdad()
    {
        return edad;
    }
    
    public void setSiguiente(Nodo n)
    {
        siguiente = n;
    }
    
    public Nodo getSiguiente()
    {
        return siguiente;
    }
}

public class ListaSimple
{
    // se define un atributo privado de tipo Nodo 
    private Nodo cabeza;
    
    public ListaSimple()
    {
        // le asigno un valor por defecto al atributo cabeza en el constructor de la clase ListaSimple 
        cabeza = null;
    }
    
    // método set y get del atributo de la clase ListaSimple 
    public void setCabeza(Nodo n)
    {
        cabeza = n;
    }
    
    public Nodo getCabeza()
    {
        return cabeza;
    }
    
    // método para obtener al ultimo nodo de la lista 
    public Nodo ultimo()
    {
        // se inicializa una variable temp de tipo Nodo en la cabeza 
        Nodo temp = cabeza;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el siguiente nodo de temp apunta o es igual a null 
            if(temp.getSiguiente() == null)
            {
                // se rompe el ciclo 
                break;
            }
            else
            {
                // sino se salta al siguiente nodo de siguiente 
                temp = temp.getSiguiente();
            }
        }
        // se retorna el nodo temp 
        return temp;
    }
    
    // método para contar los nodos que hay en la lista 
    public int contarNodos()
    {
        // se inicializa una variable temp de tipo Nodo en la cabeza 
        Nodo temp = cabeza;
        // se inicializa una variable contador en 0 
        int contador = 0;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // se incrementa la variable contador 
            contador++;
            // se salta al siguiente nodo de temp 
            temp = temp.getSiguiente();
        }
        // se retorna la variable contador 
        return contador;
    }
    
    // metodo para agregar al final de la lista 
    public void agregarFinal(Nodo n)
    {
        // si la cabeza apunta a null 
        if(cabeza == null)
        {
            // entonces, la cabeza apuntara al nodo n 
            setCabeza(n);
        }
        else
        {
            // el ultimo nodo apuntara al nodo n 
            ultimo().setSiguiente(n);
        }
    }
    
    // método para agregar un nodo entre dos nodos de la lista 
    public void agregarEntreNodos(Nodo nd, Nodo nuevo)
    {
        // donde nd es el Nodo anterior (A) y nuevo es el NUEVO NODO
        // se necesita dos nodos A & B por ejemplo
        // A debe apuntar al nuevo nodo auxiliar y el nodo auxiliar
        // apuntara al nodo B. 
        nuevo.setSiguiente(nd.getSiguiente());
        // el siguiente de nuevo sera el siguiente de A (B).  
        nd.setSiguiente(nuevo);
        // el nodo nd (A) apunta al nodo nuevo. 
    }
    
    // método para agregar al inicio de la lista 
    public void agregarInicio(Nodo n)
    {
        // el nodo n apuntara a la cabeza 
        n.setSiguiente(cabeza);
        // la cabeza apuntara al nodo n 
        setCabeza(n);
    }
    
    // método para buscar por id 
    Nodo buscarId(int c)
    {
        // se inicializa una variable temp de tipo Nodo en la cabeza 
        Nodo temp = cabeza;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el id del nodo temp es igual al parametro c 
            if(temp.getId() == c)
            {
                // se rompe el ciclo 
                break;
            }
            else
            {
                // sino el nodo temp apuntara a su siguiente nodo 
                temp = temp.getSiguiente();
            }
        }
        // se retorna el nodo temp 
        return temp;
    }
    
    // método para buscar por nombre 
    Nodo buscarNombre(String n)
    {
        // se inicializa una variable temp de tipo Nodo en la cabeza 
        Nodo temp = cabeza;
        // mientras haya un nodo en la lista 
        while(temp != null)
        {
            // si el nombre del nodo temp es igual al parametro n 
            if(temp.getNombre().equals(n))
            {
                // se rompe el ciclo 
                break;
            }
            else
            {
                // sino el nodo temp apuntara a su siguiente nodo 
                temp = temp.getSiguiente();
            }
        }
        return temp;
    }
}