48 - Estructuras dinámicas: Listas genéricas ordenadas |
Una lista genérica es ordenada si cuando insertamos información en la lista queda ordenada respecto al campo info (sea de menor a mayor o a la inversa)
Ejemplo:
listaOrdenada.Insertar(10)
listaOrdenada.Insertar(5)
listaOrdenada.Insertar(7)
listaOrdenada.Insertar(50)
Podemos observar que si recorremos la lista podemos acceder a la información de menor a mayor.
No se requiere un método para ordenar la lista, sino que siempre permanece ordenada, ya que se inserta ordenada.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListaOrdenada1 { class ListaOrdenada { class Nodo { public int info; public Nodo sig; } private Nodo raiz; public ListaOrdenada() { raiz = null; } void Insertar(int x) { Nodo nuevo = new Nodo(); nuevo.info = x; if (raiz == null) { raiz = nuevo; } else { if (x < raiz.info) { nuevo.sig = raiz; raiz = nuevo; } else { Nodo reco = raiz; Nodo atras = raiz; while (x >= reco.info && reco.sig != null) { atras = reco; reco = reco.sig; } if (x >= reco.info) { reco.sig = nuevo; } else { nuevo.sig = reco; atras.sig = nuevo; } } } } public void Imprimir() { Nodo reco = raiz; while (reco != null) { Console.Write (reco.info + "-"); reco = reco.sig; } Console.WriteLine(); } static void Main(string[] args) { ListaOrdenada lo = new ListaOrdenada(); lo.Insertar(10); lo.Insertar(5); lo.Insertar(7); lo.Insertar(50); lo.Imprimir(); Console.ReadKey(); } } }
El método insertar lo resolvemos de la siguiente forma:
Creamos primeramente el nodo, ya que siempre se insertará la información en la lista:
Nodo nuevo = new Nodo (); nuevo.info = x;
Se puede presentar las siguientes situaciones, si está vacía, lo insertamos inmediatamente:
if (raiz==null) { raiz=nuevo; } else {
Si no está vacía la lista, verificamos si lo debemos insertar en la primera posición de la lista (analizamos si la información a insertar es menor a lo apuntado por raiz en el campo info):
if (x<raiz.info) { nuevo.sig=raiz; raiz=nuevo; } else {
Sino analizamos si lo debemos insertar en medio o al final de la lista.
Mientras la información a insertar sea mayor o igual a la información del nodo que visitamos ( x>=reco.info) y no lleguemos al final de la lista (reco.sig!=null) avanzamos reco al siguiente nodo y fijamos un puntero en el nodo anterior (atras)
Nodo reco=raiz; Nodo atras=raiz; while (x>=reco.info && reco.sig!=null) { atras=reco; reco=reco.sig; }
Cuando salimos del while si la condición (x>=reco.info) continua siendo verdadera significa que se inserta al final de la lista, en caso contrario se inserta en medio de la lista:
if (x>=reco.info) { reco.sig=nuevo; } else { nuevo.sig=reco; atras.sig=nuevo; }