martes, 13 de diciembre de 2011

Colecciones Genéricas : "listas","pilas","colas" en C#

Listas.- Para crear una lista en colecciones genéricas tenemos que llamar al "linkedlist" que crea una lista enlazada de objetos,enteros,doubles o cadenas.
En la lista como se sabe su logica se puede insertar nodos en el frente,atras,ultimo,y de igual forma se puede eliminar en cualquier posicion.
Pilas.-  Para crear una pila en colecciones genéricas tenemos que llamar al "stack" que crea una pila de objetos,enteros,doubles o cadenas.
En la pila como sabemos su logica solo se puede insertar al comienzo y se elimina al comienzo.
cola.-  Para crear una cola en colecciones genéricas tenemos que llamar al "queue" que crea una pila de objetos,enteros,doubles o cadenas.
 En la cola como sabemos solo podemos insertar a lo ultimo y se elimina al principio.

Bueno aqui les mostrare como insertar,eliminar,invertir,mostrar el maximo elemento,el minimo elemento,y contar los objetos de una lista,pila y cola.

FrmColecciones:


public partial class btninvertir : Form
    {
        //codigo del progrmador
        //crear la lista enlazada con la coleccion generica LinkedList

        LinkedList<object> lista = new LinkedList<object> { };
        //listas de enteros
        LinkedList<int> lista2 = new LinkedList<int>();
        //pila de objetos
        Stack<object> pila = new Stack<object> { };
        object j, k, l, f;
        int b, c, d;
       
        /// <summary>
        /// /
        /// </summary>
        public btninvertir()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //añadir haciendo uso de los metodos atras y adelante de la clase LinkedList

            //inserta a lo ultimo
            lista.AddLast(23);
            //inserta al principio
            lista.AddFirst("jose");
            lista.AddFirst("maria");
            lista.AddFirst("pedro");
            lista.AddLast(100000);
            lista.AddLast(20);
            lista.AddFirst("ana");
            //elimina el objeto jose
            lista.Remove("jose");
            lista2.AddLast(5);
            lista2.AddFirst(8);
            lista2.AddLast(30);
            lista2.AddLast(23);
            // agrega el objeto juana antes del primero
            lista.AddBefore(lista.First, "juana");

            //lista.Reverse();

            // busca el minimo,maximo y suma los elementos de la lista2
            b = lista2.Max();
            c = lista2.Sum();
            d = lista2.Min();
            // cuenta los objetos agregados en la lista 1

            f = lista.Count();


            //añadir nodos creandolos primero y luego añadiendolos
            //LinkedListNode<object> nodo1 = lista.Find("maria");

            //muestra el minimo,maximo,la suma de los elementos de la lista2 y la cantidad de objetos de la lista1




        }


        private void button2_Click_1(object sender, EventArgs e)
        {

            listBox1.Items.Add("Lista1 :");
            foreach (var item in lista)
            {

                listBox1.Items.Add(item);
            }
            listBox1.Items.Add("la lista1 tiene  " + f + "  objetos");

            listBox1.Items.Add("Lista2:");
           
            foreach (var item in lista2)
            {
               
                listBox1.Items.Add(item);
            }
            listBox1.Items.Add("El maximo es:\n" + b);
            listBox1.Items.Add("la suma de la lista2 es:\n" + c);
            listBox1.Items.Add("el minimo de la lista2 es :\n" + d);

        }
        //muestra la lista invertida
        private void btninvertirlista_Click(object sender, EventArgs e)
        {
            lista = listareversa(lista);
            listBox2.Items.Add("lista invertida:");
            foreach (var s in lista)
            {
                listBox2.Items.Add(s);
            }
        }
        //invierte la lista1 y la carga
        private LinkedList<object> listareversa(LinkedList<object> listareversa)
        {
               LinkedList<object> tempa = new LinkedList<object>();
            foreach (var s in listareversa)
            {
                tempa.AddFirst(s);

            }
            return tempa;
        }
   
        //metodo que nos limpia el listbox
        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();

            listBox2.Items.Clear();
        }

        private void btnsalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btncargarpila_Click(object sender, EventArgs e)
        {
            // el ultimo en agrergar es el primero de la pila
            pila.Push(45);
            pila.Push(12);
            pila.Push(67);
            pila.Push(123);
            pila.Push(65);
            pila.Push(111);
           
           

            //elimina el ultimo en ingresar
            pila.Pop();
            //pila.Pop();

         
            //cuenta los objetos,busca el maximo y busca el minimo
            j = pila.Count();
            k = pila.Max();
            l = pila.Min();


           


        }

        private void btnmostrarpila_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add("Pila :");
            foreach (var item in pila)
            {
                listBox1.Items.Add(item);

            }
            listBox1.Items.Add("objetos de la pila : " + j);
            listBox1.Items.Add("mayor es : " + k);
            listBox1.Items.Add("menor es : " + l);
           
        }
        //muestra la pila invertida
        private void button4_Click(object sender, EventArgs e)
        {
            pila = reversa(pila);
            listBox2.Items.Add("pila invertida:");
            foreach (var s in pila)
            {
                listBox2.Items.Add(s);
            }
           
        }
            //invierte la pila y la carga
        private Stack<object> reversa(Stack<object> pilareversa)
        {

            Stack<object> temp = new Stack<object>();
            foreach (var s in pilareversa)
            {
                temp.Push(s);

            }
            return temp;
        }

       
        }

 private void btncargarcola_Click(object sender, EventArgs e)
        {
            cola.Enqueue(7);
            cola.Enqueue(8);
            cola.Enqueue(9);
            cola.Enqueue(10);


           
        }

        private void btnmostrarcola_Click(object sender, EventArgs e)
        {
            foreach (var i in cola) {
                listBox1.Items.Add(i);
            }
            listBox1.Items.Add("#######################################");
        }

//invierte la cola
        private void button1_Click_1(object sender, EventArgs e)
        {
            foreach (var i in cola.Reverse())
            {
                listBox2.Items.Add(i);
            }
            listBox2.Items.Add("#######################################");  
        }



    }

Interfaz Grafica:




Estructuras Dinámicas "Listas Enlazadas"

Listas enlazadas.- Estructura dinámica formada por un conjunto de nodos interconectados entre si.


Esta es un aplicación creada en el lenguaje de programación C# la cual consiste en registrar los datos de un hotel,ya cea las reservas activas o las reservas canceladas y que de igual forma podamos eliminar y insertar en la parte cea necesario de la lista por ej:
insertar atrás
eliminar atrás
insertar al frente
eliminar al frente
insertar en una posición n
eliminar en una posición n
en el cual hacemos uso de varios componentes como los listbox,radiobutton,textbox,datatimepicker etc.
Para empezar crearemos el formulario reserva,luego la clase nodo,reserva,lista enlazada y por ultimo programaremos nuestros componentes que hemos utilizado en el formulario.


Clase nodo:



 public class Nodo
    {
        Object datos;//clase
        Nodo izq;
        Nodo der;
        public Nodo()
        {//nodo nulo
            datos = izq = der = null;
        }
        public Nodo(object ob)
        {// nodo solitario
            datos = ob;
            izq = der = null;


        }


        public Nodo(object ob, Nodo enlace)
        {
            datos = ob;
            der = enlace;


        }
        public void setDatos(object ob)
        {
            datos = ob;
        }
        public void setizq(Nodo ob)
        {
            izq = ob;
        }
        public void setder(Nodo ob)
        {
            der = ob;
        }


        public object getdatos()
        {
            return datos;
        }
        public Nodo getizq()
        {
            return izq; 
        }
        public Nodo getDer()
        {
            return der; 
        }
    }
}


Clase Reserva:



class Reserva
    {
        public int nro;
        public String cliente;
        public DateTime fecha_r;
        public String f_reserva;
        public String t_habitacion;
        public String f_pago;
        public String servicios;
        


        public Reserva() {
            nro = 0;
            fecha_r = DateTime.MinValue;
            cliente = t_habitacion = f_pago = servicios = "";
            
        }
        public Reserva(int n,String cli,DateTime fr,String th,String fp,String ser) {
            nro = n;
            cliente = cli;
            fecha_r = fr;
            t_habitacion = th;
            f_pago = fp;
            servicios = ser;
        }
        public void  SetReserva(int n, String cli, DateTime fr, String th, String fp, String ser)
        {
            nro = n;
            cliente = cli;
            fecha_r = fr;
            t_habitacion = th;
            f_pago = fp;
            servicios = ser;
        }
        public void setnro(int n) { nro = n; }
        public void setcliente(String cli) { cliente = cli; }
        public void setfechareserva(DateTime fr) { fecha_r = fr; }
        public void setthabitacion(String th) { t_habitacion = th; }
        public void setfpago(String fp) {f_pago = fp; }
        public void setservicios(String ser) { servicios = ser; }


        public String GetReserva() {
            return "Nro:" + nro + "\nCliente:" + cliente + "\nFecha de Reserva:" + f_reserva + "Tipo de Habitacon:" + t_habitacion +
                    "\nForma de Pago:" + f_pago + "\nServicios:" + servicios;
        }


        public int getnro() { return nro; }
        public String getcliente() { return cliente;}
        public String getfechareserva() { return f_reserva; }
        public String getthabitacion() { return t_habitacion; }
        public String getfpago() { return f_pago; }
        public String getservicios() { return servicios; }
    }
}

Clase Lista Enlazada:

class ListaEnlazada
    {
        protected String nombre;
        protected Nodo primero;
        protected Nodo ultimo;

        public ListaEnlazada(String n) {
            nombre = n;
            primero = ultimo = null;  
        }
        public ListaEnlazada() {
            this.nombre = "Lista";
        }
        //metodos
        public Boolean Lvacia() {
            return primero == null;
        }
        public String getnombre(){
        return nombre;
        }
        public Nodo getprimero() {
            return primero;
        }
        public Nodo getultimo() {
            return ultimo;
        }
        public void InsertFrente(Object obj) {

            if (Lvacia())
                primero = ultimo = new Nodo(obj);
            else
                primero= new Nodo(obj,primero);
        }
        public void InsertarAtras(Object obj) {
            if (Lvacia())
                primero = ultimo = new Nodo(obj);
            else
                ultimo = ultimo.Sgte = new Nodo(obj);
        
        }
        public Object DeleteFrente() {
            Object DatoRemovido = null;
            if (Lvacia())
                Console.WriteLine("Vacia");
                primero = primero.datos;
                if (primero.Equals(ultimo))
                    primero = ultimo = null;
                else
                    primero = primero.Sgte;
                return DatoRemovido;
        }
        public Object DeleteAtras() {
            Object DatoRemovido = null;
            if (Lvacia()) {
                Console.WriteLine("Vacia");
            }
            DatoRemovido = ultimo.Datos;
            if (primero.Equals(ultimo))
            {
                primero = ultimo = null;
            }
            else {
                Nodo Actual = primero;
                while (Actual.Sgte != ultimo)
                    Actual = Actual.Sgte;
                ultimo = Actual;
                Actual.Sgte = null;
            }
            return DatoRemovido;
        }
        public Object getElementoIndice(int posicion) {
            if (Lvacia())
            {
                return null;
            }
            else {
                Nodo Actual = primero;
                int cont = 1;
                while ((Actual != null) && (cont < posicion)){
                    Actual = Actual.Sgte;
                    cont++;
                }
                if ((Actual != null) && (cont == posicion))
                {
                    return Actual.Datos;
                }
                else {
                    return null;
                }


            }
        
        }

        public void InsertarElementoEnIndice(int posicion,Object obj){
        Nodo nuevo;
        Nodo actual;
        if (Lvacia())
        {
            return;
        }
        else {
            actual = primero;
            int cont = 1;
            while((actual !=null) && (cont < posicion-1)){
                actual = actual.Sgte;
                cont++;
            }
            if((actual != null) && (cont== posicion-1)){
                nuevo = new Nodo(obj,actual.Sgte);
                actual.Sgte = nuevo;
            
            }
          }
        
        }
        public Object DeleteElementoDeIndice(int posicion) {
            Object DatoRemovido;
            Nodo actual;

            if (Lvacia() == true)
            {
                return null;
            }
            else {
                if (posicion == 1)
                {
                    DatoRemovido = primero.Datos;
                    primero = primero.Sgte;
                    return DatoRemovido;
                }
                else {
                    actual = primero;
                    int cont = 1;

                    while((actual != null) && (cont < posicion-1)){
                        actual = actual.Sgte;
                        cont++;
                    }
                    if ((actual != null ) && (cont == posicion -1)){
                        DatoRemovido = actual.Sgte.Datos;
                        actual.Sgte = actual.Sgte.Sgte;
                        return DatoRemovido;
                    }

                }
                return null;
            }
        
        }

    }
}

FrmReserva:

public partial class FrmReserva : Form
    {

        public void combohabitacion() {
            cbthabitacion.Items.Add("Simple");
            cbthabitacion.Items.Add("doble");
            cbthabitacion.Items.Add("Suite");
        }
        public String formapago() {
            String fp = "";
            if (rbefectivo.Checked == true)
                fp = rbefectivo.Text;
            else
                fp = rbtargeta.Text;
            return fp;
         }
        public String obtenerservicios() {
            String serv = "";
            if (chkinternet.Checked == true)
                serv = serv + chkinternet.Text + ",";
            if (chkpiscina.Checked == true)
                serv = serv + chkpiscina.Text + ",";
            if (chkrestaurant.Checked == true)
                serv = serv + chkrestaurant.Text + ",";
            return serv;
        }
        public void limpiardatos() {
            txtnro.Text = "";
            txtcliente.Text = "";
        }
        public void mostrarlista() {
            if (Lista.Lvacia() == true)
            {
                lbactivas.Items.Clear();
                lbactivas.Items.Insert(0, "Lista vacia");
            }
            else {
                Nodo auxnodo = Lista.getprimero();

                lbactivas.Items.Clear();
                while (auxnodo != null) { 
                auxdatos = (Reserva)auxnodo.getdatos();
                String separador = "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$.";
                lbactivas.Items.Insert(0,auxdadatos.getnro());
                lbactivas.Items.Insert(1, auxdadatos.getcliente());
                lbactivas.Items.Insert(2, auxdadatos.getthabitacion());
                lbactivas.Items.Insert(3, auxdadatos.getfechareserva());
                lbactivas.Items.Insert(4, auxdadatos.getfpago());
                lbactivas.Items.Insert(5, auxdadatos.getservicios());
                lbactivas.Items.Insert(6, separador);
                auxnodo = auxnodo.sgte;

                
                }
            
            }

        
        }

        public FrmReserva()
        {
            InitializeComponent();
        }

        private void FrmReserva_Load(object sender, EventArgs e)
        {
            combohabitacion();

        }

        private void groupBox2_Enter(object sender, EventArgs e)
        {

        }

        private void groupBox4_Enter(object sender, EventArgs e)
        {

        }

        private void btnsalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btninsertarfrente_Click(object sender, EventArgs e)
        {
            String nro = "";
            String cliente = "";
            String tipohab = "";
            DateTime fecha = DateTime.MinValue;
            String formapago = "";
            String serv = "";

            int centinela = 1;
            try
            {

                nro = txtnro.Text;
                cliente = txtcliente.Text;
                tipohab = cbthabitacion.Text;
                fecha = DateTime.Parse(dtpfreserva.Text);
                formapago = ObtenerFormaPago();
                serv = obtenerservicios();
            }
            catch (Exception Ex)
            {
                centinela = 0;
                if (MessageBox.Show(Ex.ToString() + "Ocurrio un error verifique los campos ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK) { 
                

                }
            }
            if (centinela == 1) {
                Lista.InsertFrente(new Reserva(nro,cliente,tipohab,fecha,formapago,serv));
            }
            limpiardatos();
            mostrarlista();
        }

        private void btnmostrar_Click(object sender, EventArgs e)
        {
            mostrarlista();
        }

        private void btnborrarfrente_Click(object sender, EventArgs e)
        {
            if (Lista.Lvacia() == true) {
                lbcanceladas.Items.Clear();
                lbcanceladas.Items.Insert(0,"Lista Vacia"):
            
            }
            else{
            Reserva aux;
                aux=(Reserva)Lista.DeleteFrente();

                String separador="$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
                lbcanceladas.Items.Insert(0, aux.getnro());
                lbcanceladas.Items.Insert(1, aux.getcliente());
                lbcanceladas.Items.Insert(2, aux.getthabitacion());
                lbcanceladas.Items.Insert(4, aux.getfechareserva());
                lbcanceladas.Items.Insert(3, aux.getfpago());
                lbcanceladas.Items.Insert(5, aux.getservicios());
                lbcanceladas.Items.Insert(6, separador);
            
            }
            limpiardatos();
            mostrarlista();
        }

        private void btninsertaratras_Click(object sender, EventArgs e)
        {
            String nro = "";
            String cliente = "";
            String tipohab = "";
            DateTime fecha = DateTime.MinValue;
            String formapago = "";
            String serv = "";
            int centinela = 1;
            try
            {

                nro = txtnro.Text;
                cliente = txtcliente.Text;
                tipohab = cbthabitacion.Text;
                fecha = DateTime.Parse(dtpfreserva.Text);
                formapago = ObtenerFormaPago();
                serv = obtenerservicios();
            }
            catch (Exception Ex)
            {
                centinela = 0;
                if (MessageBox.Show(Ex.ToString() + "Ocurrio un error verifique los campos ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                {
                }
              }
            if (centinela == 1) {
                Lista.InsertarAtras(nro,cliente,tipohab,fecha,formapago,serv);
            
            }
            limpiardatos();
            mostrarlista();


        }

        private void btnborraratras_Click(object sender, EventArgs e)
        {
            if (Lista.Lvacia() == true)
            {
                lbcanceladas.Items.Clear();//limpia por completo el listbox
                lbcanceladas.Items.Insert(0, "Lista vacia");//inserta el object al indice 0
            }
            else {
                Reserva aux;
                aux = (Reserva)Lista.DeleteAtras();//elimina el ultimo dato introducido en la pila

                String separador = "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
                lbcanceladas.Items.Insert(0, aux.getnro());
                lbcanceladas.Items.Insert(1, aux.getcliente());
                lbcanceladas.Items.Insert(2, aux.getthabitacion());
                lbcanceladas.Items.Insert(4, aux.getfechareserva());
                lbcanceladas.Items.Insert(3, aux.getfpago());
                lbcanceladas.Items.Insert(5, aux.getservicios());
                lbcanceladas.Items.Insert(6, separador);
            }
            limpiardatos();
            mostrarlista();
        }

        private void btninsertarpos_Click(object sender, EventArgs e)
        {
            String nro = "";
            String cliente = "";
            String tipohab = "";
            DateTime fecha = DateTime.MinValue;
            String formapago = "";
            String serv = "";
            int centinela = 1;
            try
            {

                nro = txtnro.Text;
                cliente = txtcliente.Text;
                tipohab = cbthabitacion.Text;
                fecha = DateTime.Parse(dtpfreserva.Text);
                formapago = ObtenerFormaPago();
                serv = obtenerservicios();
            }
            catch (Exception Ex) {
                centinela = 0;
                if (MessageBox.Show(Ex.ToString() + "Ocurrio un error verifique los datos ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                {
                }
                }
            if (centinela == 1) {

                lista.insertarElementoEnIndice(indice, (new Reserva(nro,cliente,tipohab,fecha,formapago,ser)));
             //se introduce el objeto de tipo de datos

            }
            limpiardatos();
            mostrarlista();

        }

        private void btnborrarposicion_Click(object sender, EventArgs e)
        {

            if (Lista.Lvacia() == true)
            {
                lbcanceladas.Items.Clear();//limpia por completo el listbox
                lbcanceladas.Items.Insert(0, "Lista vacia");//inserta el object al indice 0
            }
            else {
                Reserva aux = new Reserva();
                int centinela ==1;
                try{
                
                   aux=(Reserva)lista.DeleteElementoDeIndice(int.Parse(txtposicion.Text));
                }
                catch(Exception Ex){


                if (MessageBox.Show(Ex.ToString() + "Ocurrio un error verifique los datos ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                {
                }
                }
                if(centinela==1){
                tring separador = "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
                lbcanceladas.Items.Insert(0, aux.getnro());
                lbcanceladas.Items.Insert(1, aux.getcliente());
                lbcanceladas.Items.Insert(2, aux.getthabitacion());
                lbcanceladas.Items.Insert(4, aux.getfechareserva());
                lbcanceladas.Items.Insert(3, aux.getfpago());
                lbcanceladas.Items.Insert(5, aux.getservicios());
                lbcanceladas.Items.Insert(6, separador
                }
            }
            limpiardatos();
            mostrarlista();
        }

        private void btnreservar_Click(object sender, EventArgs e)
        {
            btninsertaratras_Click(sender,e);
        }

        private void btncancelar_Click(object sender, EventArgs e)
        {
            btnborraratras_Click(sender ,e);
        }


    }
}

Bueno ese seria todo nuestro código fuente de nuestro programa para terminar con nuestra aplicación les mostrare la interfaz gráfica: