Пример #1
0
Файл: Nodo.cs Проект: Jocagi/EDI
        public void Fusionar(Nodo n1)
        {
            int totalLlaves = n1.Llaves.Count;
            int totalHijos  = n1.Hijos.Count;

            totalLlaves += this.Llaves.Count;
            totalHijos  += this.Hijos.Count;

            for (int x = 0; x < n1.Llaves.Count; x++)
            {
                Medicamento valor = n1.Llaves[x];
                this.Push(valor);
            }

            for (int x = Hijos.Count - 1; x >= 0; x--)
            {
                Nodo e = n1.eliminarHijo(x);
                this.insertarNodo(e);
            }
        }
Пример #2
0
        void Busca(Nodo nNodo, Medicamento item)
        {
            Nodo recorre = null;

            recorre = Raiz;
            while (recorre.Medicamento.Nombre != item.Nombre && recorre != null)
            {
                int comparison = String.Compare(item.Nombre, recorre.Medicamento.Nombre, comparisonType: StringComparison.OrdinalIgnoreCase);

                if (comparison < 1)
                {
                    recorre = recorre.izquierdo;
                }
                else
                {
                    recorre = recorre.Derecho;
                }
            }
            AuxBusqueda = recorre;
        }
Пример #3
0
        //AGREGA UN NUEVO ELEMENTO
        public void AgregarElemento(Medicamento item)
        {
            Nodo nuevo = new Nodo(item);

            nuevo.izquierdo = null;
            nuevo.Derecho   = null;
            if (Raiz == null)
            {
                Raiz = nuevo;
            }
            else
            {
                Nodo anterior = null;
                Nodo recorre  = null;
                recorre = Raiz;
                while (recorre != null)
                {
                    anterior = recorre;
                    int comparison = String.Compare(item.Nombre, recorre.Medicamento.Nombre, comparisonType: StringComparison.OrdinalIgnoreCase);

                    if (comparison < 1)
                    {
                        recorre = recorre.izquierdo;
                    }
                    else
                    {
                        recorre = recorre.Derecho;
                    }
                }
                int comparison2 = String.Compare(item.Nombre, anterior.Medicamento.Nombre, comparisonType: StringComparison.OrdinalIgnoreCase);
                if (comparison2 < 1)
                {
                    anterior.izquierdo = nuevo;
                }
                else
                {
                    anterior.Derecho = nuevo;
                }
            }
        }
Пример #4
0
        public void Eliminar(string k)
        {
            Nodo actual = Raiz;
            Nodo papa   = null;

            while (actual != null)
            {
                if (actual.Llaves.Count == 1)
                {
                    if (actual != Raiz)
                    {
                        string nombre       = actual.Llaves[0].nombre;
                        int    posicionHijo = papa.posicionHijo(nombre);

                        bool?caminoDerecho = null;
                        Nodo hermano       = null;

                        if (posicionHijo > -1)
                        {
                            if (posicionHijo < 3)
                            {
                                hermano = papa.obtenerHijo(posicionHijo + 1);
                                if (hermano.Llaves.Count > 1)
                                {
                                    caminoDerecho = true;
                                }
                            }

                            if (caminoDerecho == null)
                            {
                                if (posicionHijo > 0)
                                {
                                    hermano = papa.obtenerHijo(posicionHijo - 1);
                                    if (hermano.Llaves.Count > 1)
                                    {
                                        caminoDerecho = false;
                                    }
                                }
                            }

                            if (caminoDerecho != null)
                            {
                                Medicamento tmp;
                                Medicamento tmp2;

                                if (caminoDerecho.Value)
                                {
                                    tmp  = papa.Pop(posicionHijo);
                                    tmp2 = hermano.Pop(0);

                                    if (hermano.Hijos.Count > 0)
                                    {
                                        Nodo nod = hermano.eliminarHijo(0);
                                        actual.insertarNodo(nod);
                                    }
                                }
                                else
                                {
                                    tmp  = papa.Pop(posicionHijo);
                                    tmp2 = hermano.Pop(hermano.Llaves.Count - 1);

                                    if (hermano.Hijos.Count > 0)
                                    {
                                        Nodo nod = hermano.eliminarHijo(hermano.Hijos.Count - 1);
                                        actual.insertarNodo(nod);
                                    }
                                }

                                papa.Push(tmp2);
                                actual.Push(tmp);
                            }
                            else
                            {
                                Medicamento tmp = null;

                                if (papa.Hijos.Count >= 2)
                                {
                                    if (posicionHijo == 0)
                                    {
                                        tmp = papa.Pop(0);
                                    }
                                    else if (posicionHijo == papa.Hijos.Count)
                                    {
                                        tmp = papa.Pop(papa.Llaves.Count - 1);
                                    }
                                    else//take papa's middle key
                                    {
                                        tmp = papa.Pop(1);
                                    }

                                    if (tmp != null)
                                    {
                                        actual.Push(tmp);
                                        Nodo sib = null;
                                        if (posicionHijo != papa.Hijos.Count)
                                        {
                                            sib = papa.eliminarHijo(posicionHijo + 1);
                                        }
                                        else
                                        {
                                            sib = papa.eliminarHijo(papa.Hijos.Count - 1);
                                        }

                                        actual.Fusionar(sib);
                                    }
                                }
                                else
                                {
                                    actual.Fusionar(papa, hermano);
                                    Raiz = actual;
                                    papa = null;
                                }
                            }
                        }
                    }
                }

                {
                    //Verificar si el nodo actual tiene el valor buscado
                    int rmPos = -1;
                    if ((rmPos = actual.tieneLlave(k)) >= 0) //Si se encontro una llave
                    {
                        //Si es una hoja, simplemente remover la llave
                        if (actual.Hijos.Count == 0)
                        {
                            actual.Pop(rmPos); //Remover valor en la posicion encontrada
                        }
                        //Si no es hoja, reemplazar con la siguiente llave de mayor valor
                        else
                        {
                            Nodo Siguiente = Min(actual.Hijos[rmPos]);


                            if (Siguiente.Llaves.Count > 1)
                            {
                                Siguiente.Pop(0);
                            }
                            else
                            {
                                Siguiente.Padre.eliminarHijo(Siguiente);
                            }
                        }

                        actual = null;
                    }
                    //Si no se encontro el valor buscado, seguir recorriendo arbol
                    else
                    {
                        int p = actual.posicionHijo(k);
                        papa   = actual;
                        actual = actual.obtenerHijo(p);
                    }
                }
            }
        }
Пример #5
0
 public Nodo(Medicamento Medicamento)
 {
     this.Medicamento = Medicamento;
 }
Пример #6
0
Файл: Nodo.cs Проект: Jocagi/EDI
 private int compararmedicamentos(Medicamento med1, Medicamento med2)
 {
     return(String.Compare(med1.nombre, med2.nombre));
 }
Пример #7
0
Файл: Nodo.cs Проект: Jocagi/EDI
 public bool compararMedicamentos(Medicamento med1, Medicamento med2)
 {
     return(String.Compare(med1.nombre, med2.nombre) > 0);
 }
Пример #8
0
 public Nodo(Medicamento Medicamento, Nodo anterior)
 {
     this.medicamento = Medicamento;
     this.indice      = Medicamento.id;
     this.padre       = anterior;
 }
Пример #9
0
 public Nodo(Medicamento Medicamento)
 {
     this.medicamento = Medicamento;
     this.indice      = Medicamento.id;
 }
Пример #10
0
        public void EliminarElemento(Medicamento item)
        {
            Nodo anterior = null;
            Nodo recorre  = null;
            Nodo AUX      = null;

            recorre = Raiz;
            while (recorre != null && recorre.Medicamento != null && recorre.Medicamento.Nombre != item.Nombre)
            {
                anterior = recorre;
                int comparison = String.Compare(item.Nombre, recorre.Medicamento.Nombre, comparisonType: StringComparison.OrdinalIgnoreCase);

                if (comparison < 1)
                {
                    recorre = recorre.izquierdo;
                }
                else
                {
                    recorre = recorre.Derecho;
                }
            }
            Nodo guarda = null;

            if (recorre != null && recorre.izquierdo == null && recorre.Derecho == null)
            {
                recorre.Medicamento = null;
            }

            if (recorre != null && recorre.izquierdo == null && recorre.Derecho != null)
            {
                guarda = recorre.Derecho;
                recorre.Derecho.Medicamento = null;
                recorre.Medicamento         = guarda.Medicamento;
            }


            if (recorre != null && recorre.izquierdo != null && recorre.Derecho == null)
            {
                guarda = recorre.izquierdo;
                recorre.izquierdo.Medicamento = null;
                recorre.Medicamento           = guarda.Medicamento;
            }

            if (recorre != null && recorre.izquierdo != null && recorre.Derecho != null)
            {
                Nodo recorre2 = null;
                Nodo ant2     = null;
                recorre2 = recorre.Derecho;
                while (recorre2 != null)
                {
                    ant2     = recorre2;
                    recorre2 = recorre2.izquierdo;
                }
                AUX = ant2;
                if (ant2.Derecho != null)
                {
                    guarda              = ant2.Derecho;
                    ant2.Derecho        = null;
                    recorre.Derecho     = guarda;
                    recorre.Medicamento = AUX.Medicamento;
                }
                else
                {
                    recorre.Medicamento = AUX.Medicamento;
                    ant2.Medicamento    = null;
                }
            }
        }
Пример #11
0
 //BUSCA UN ELEMENTO PARA ACTUALIZAR SUS DATOS
 public void ActualizaDatos(Medicamento data)
 {
     BuscaActualiza(Raiz, data);
 }
Пример #12
0
 Nodo AuxBusqueda; // VARIABLE PARA GUARDAR EL ELEMENTO ENCONTRADO
 public Nodo BuscaRegresa(Medicamento data)
 {
     AuxBusqueda = null;
     Busca(Raiz, data);
     return(AuxBusqueda);
 }