jueves, 27 de noviembre de 2014

Unidad V Y VI MÉTODOS DE ORDENAMIENTO Y DE BÚSQUEDA.

                                  MÉTODOS DE ORDENAMIENTO. 


Es la operación de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de ordenamiento. El ordenamiento se efectúa con base en el valor de algún campo en un registro.

El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado.

Ej. De ordenamientos: 
Dir. Telefónico, tablas de contenido, bibliotecas y diccionarios, etc.

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente. 

¿Cuándo conviene usar un método de ordenamiento? 

Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo. 

Tipos de ordenamientos:



Los 2 tipos de ordenamientos que se pueden realizar son:
ü  Los internos: 
Son aquellos en los que los valores a ordenar están en memoria principal, por lo que se asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo (a[1], a[500], etc). 
ü  Los externos: 

Son aquellos en los que los valores a ordenar están en memoria secundaria (disco, cinta, cilindro magnético, etc), por lo que se asume que el tiempo que se requiere para acceder a cualquier elemento depende de la última posición accesada (posición 1, posición 500, etc).



MÉTODOS DE BÚSQUEDA.

La búsqueda es la operación más importante en el procesamiento de información, ya que permite recuperar datos previamente almacenados. El resultado de una búsqueda puede ser un éxito, si se encuentra la información o un fracaso, si no la encuentra.
 La búsqueda se puede aplicar sobre elementos previamente ordenados o sobre elementos desordenados, en el primer caso la búsqueda es más fácil, en cambio en el segundo se dificulta un poco más el proceso, sobre todo cuando de se trata de encontrar una cantidad de elementos similares.
Los métodos de búsqueda se clasifican en:
Búsqueda interna.
Búsqueda externa.

Búsqueda interna.

La búsqueda interna es aquella en la que todos los elementos de la estructura estática (arreglo) o dinámica (lista ligada o árbol) se encuentran almacenados en la memoria principal de la computadora.
Los métodos de búsqueda interna más importantes son:
ü  Secuencial o lineal.
ü  Binaria.
ü  Hash (transformación de claves).

Búsqueda externa.

La búsqueda externa es aquella en la que todos los elementos se encuentran almacenados en un archivo, el cual se encuentra en un dispositivo de almacenamiento secundario como un disco duro, una cinta o una memoria usb.
Los métodos de búsqueda externa más importantes son:
ü  Secuencial.
ü  Binaria.
ü  Hash (transformación de claves).

  • Algoritmo Burbuja
  • Algoritmo Quicksort
  • Algoritmo Shellsort
  • Algoritmo Radix



Algoritmo Burbuja.

El método de ordenación por intercambio directo o método de la burbuja, es el más simple y consiste en comparar dos elementos adyacentes para determinar si se realiza un intercambio entre los mismos, esto en caso de que el primero sea mayor que el segundo (forma ascendente) o el caso de que el primero sea menor que el segundo (forma descendente).
El primer procedimiento del método de la burbuja es:
ü  Generar un ciclo que inicie desde uno hasta el número de elementos del arreglo.
ü  Generar un segundo ciclo dentro del anterior que inicie desde cero hasta el número de elementos del arreglo menos dos.
Dentro del segundo ciclo debe existir una comparación que determina el tipo de ordenamiento (ascendente o descendente) entre el primer elemento (posición generado por el segundo ciclo) y el segundo elemento (el que le  sigue), si la respuesta a la condición es verdadera se realiza un intercambio entre los dos elementos.
Para realizar el intercambio se genera un almacenamiento temporal, el cual guarda el dato del primer elemento, el segundo elemento toma el lugar del primero y en el lugar del segundo se coloca lo que contiene el almacenamiento temporal. Una vez que los ciclos terminan la estructura debe quedar ordenada de forma ascendente o descendente, pero este procedimiento es considerado como el peor de los casos ya que si el número de elementos de la estructura es de 100, se tienen que realizar 9900 comparaciones entes de terminar la ejecución del método.
Un segundo procedimiento del método de la burbuja es:
ü  Generar un ciclo que inicie desde cero hasta el número de elementos menos dos.
ü  Generar un segundo ciclo desde el valor del ciclo anterior más uno hasta el número de elementos menos uno;
Dentro del segundo ciclo debe existir una comparación que determina el tipo de ordenamiento (ascendente o descendente) entre el primer elemento (posición generada por el primer ciclo) y el segundo elemento (posición generada por el segundo ciclo), si la respuesta a la condición es verdadera se realiza un intercambio entre los dos elementos.
Para realizar el intercambio se genera un almacenamiento temporal, el cual guarda el dato del primer elemento, el segundo elemento toma el lugar del primero y en el lugar del segundo se coloca lo que contiene el almacenamiento temporal.
Una vez que los ciclos terminan la estructura debe quedar ordenada, la diferencia con el procedimiento anterior radica en el número de comparaciones y posibles intercambios que se presentan, en este segundo procedimiento, es menor ya que cada pasada que se le da al arreglo se realiza una comparación menos que en la pasada anterior.
Un tercer procedimiento del método de la burbuja es el siguiente:
ü  Generar un ciclo que inicie desde uno hasta el número de elementos menos uno.
ü  Generar un segundo ciclo que inicie desde el número de elementos menos uno y mientras que ese valor sea mayor o igual al del ciclo anterior (con decrementos).
Dentro del segundo ciclo debe existir una comparación que determina el tipo de ordenamiento (ascendente o descendente) entre el primer elemento (posición generada por el segundo ciclo) y el segundo elemento (posición generada por el segundo ciclo menos uno), si la respuesta a la condición es verdadera se realiza un intercambio entre los dos elementos.
Para realizar el intercambio se genera un almacenamiento temporal, el cual guarda el dato del primer elemento, el segundo elemento toma el lugar del primero y en el lugar del segundo se coloca lo que contiene el almacenamiento temporal. Este tercer procedimiento es muy similar al anterior con la diferencia que el elemento que va quedando es su lugar el primero no el último como en el caso anterior.
Algoritmo QuickSort.

El método de ordenamiento rápido o método quicksort, es una técnica basada en otra conocida con el nombre divide y vencerás, que permite ordenar una cantidad de elementos en un tiempo proporcional a n2 en el peor de los casos o a n log n en el mejor de los casos. El algoritmo original es recursivo, como la técnica en la que se basa.
La descripción del algoritmo para el método de ordenamiento quicksort es la siguiente:
ü  Debe elegir uno de los elementos del arreglo al que llamaremos pivote.
ü  Debe acomodar los elementos del arreglo a cada lado del pivote, de manera que del lado izquierdo queden todos los menores al pivote y del lado derecho los mayores al pivote; considere que en este momento, el pivote ocupa exactamente el lugar que le corresponderá en el arreglo ordenado.
Colocado el pivote en su lugar, el arreglo queda separado en dos subarreglos, uno formado por los elementos del lado izquierdo del pivote, y otro por los elementos del lado derecho del pivote.
Repetir este proceso de forma recursiva para cada subarreglo mientras éstos contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.
 Para elegir un pivote se puede aplicar cualquiera de las siguientes tres opciones:
ü  El pivote será el primer elemento del arreglo,
ü  El pivote será el elemento que está a la mitad del arreglo, o
ü  Que el pivote se elija de entre tres elementos del arreglo (cualesquiera), los cuales se deben comparar para seleccionar el valor intermedio de los tres y considerarlo como el pivote.
La forma o técnica de reacomodo de los elementos del lado izquierdo y derecho del pivote, aplica el siguiente procedimiento que es muy efectivo. Se utilizan dos índices: izq, al que llamaremos índice inicial, y der, al que llamaremos índice final. Conociendo estos elementos el algoritmo quedaría de la siguiente manera:
Recorrer el arreglo simultáneamente con izq y der: por la izquierda con izq (desde el primer elemento), y por la derecha con der (desde el último elemento).
ü  Mientras el arreglo en su posición izq (arreglo[izq]) sea menor que el pivote, continuamos el movimiento a la derecha.
ü  Mientras el arreglo en su posición der (arreglo[der]) sea mayor que el pivote, continuamos el movimiento a la izquierda.
Terminando los movimientos se compara los índices y si izq es menor o igual al der, se intercambian los elementos en esas posiciones y las posiciones se cambian izq a la derecha y der a la izquierda.
Repetir los pasos anteriores hasta que se crucen los índices (izq sea menor o igual a der).
El punto en que se cruzan los índices es la posición adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados).
Algoritmo ShellSort.

El método de ordenación shellsort es una versión mejorada del método de ordenación por inserción directa, que se utiliza cuando el número de elementos es grande. Este método recibe su nombre gracias a su creados Donald L. Shell, también se conoce con el nombre inserción con incrementos decrecientes.
En el método de ordenación por inserción directa, cada elemento se compara con los elementos contiguos de su izquierda de uno por uno, para lograr su ordenamiento; si por ejemplo, el elemento a comparar  es el más pequeño y se encuentra en la última posición del arreglo, hay que ejecutar muchas comparaciones antes de colocar el elemento en su lugar de forma definitiva.
El método de ordenación shellsort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga pasos más grandes hacia la posición que debe ocupar. Los pasos múltiples sobre los elementos se hacen con tamaños de espacio cada vez más pequeños y el último paso del método es un simple ordenamiento por inserción directa, pero para entonces, los elementos de arreglo ya casi están ordenados.
Para determinar el tamaño de los incrementos (saltos) constantes, el primero debe ser generado a partir del tamaño del arreglo entre dos, obteniendo solo su parte entera de la división o redondeando el resultado de la misma, y posteriormente ir reduciendo a la mitad el incremento en cada repetición, hasta que el incremento sea un uno.
El procedimiento para aplicar el algoritmo de shellsort es el siguiente:
ü  Generar un ciclo que se encargue de controlar el tamaño que deben tener los incrementos.
Este ciclo debe iniciar con la división del tamaño del arreglo entre dos.
ü  Mientras que el incremento sea mayor a cero debe continuar.
ü  Y el cambio de incremento se elige de entre dos opciones: un uno o la división del incremento anterior entre dos.

Un segundo ciclo dentro del anterior, controla el número de comparaciones que se deben hacer según el tamaño del incremento.
ü  El control de este ciclo debe iniciar con el incremento generado anteriormente.
ü  Mientras el control del ciclo sea menor que el tamaño del arreglo.
ü  El control debe cambiar de uno en uno.
Un tercer ciclo dentro del segundo controla en qué momento se detienen las comparaciones o se hacen los posibles intercambios entre los elementos.
ü  El control de este ciclo debe iniciar con el valor del ciclo anterior.
ü  Mientras que el control sea mayor o igual al incremento del primer ciclo y el elemento del arreglo de la posición del control de este ciclo menos el incremento, sea mayor que el elemento del arreglo de la posición control de este ciclo, realice los intercambios entre estas posiciones.
Y el control se decremente con el valor del incremento.
 Algoritmos de ordenamiento por distribución.
Los algoritmos de ordenamiento por distribución, ordenan el arreglo tomando cada número e insertándolo en la posición que toma su valor, es decir, si se tiene un cinco se coloca en la posición cinco del arreglo, algo así como: “lo que valgas en esa posición te pongo”. Esto indica que no se podrán ordenar los arreglos que tengan valores repetidos y el arreglo necesita el tamaño del número más grande que se encuentre en él.
Lo que debemos hacer cuando se repitan los datos es incrementar la capacidad de la posición (urna). Para lograrlo podemos hacer lo siguiente:
Definir un arreglo en el que cada posición puede ser ocupada por más de un elemento (arreglo bidimensional) puede darse la situación de ser insuficiente la cantidad de posiciones adicionales o de existir demasiado desperdicio de memoria.
Definir el tamaño de la urna variable a través del uso de estructuras de datos como las listas simples enlazadas.
Los algoritmos de ordenamiento por distribución se clasifican en:
ü  CountingSort.
ü  RadixSort.
ü  BucketSort.
Algoritmo Radix.

El método de ordenación radix es un algoritmo que ordena datos procesando sus elementos de forma individual, según la posición que ocupan dentro del dato. Los datos numéricos los por dígitos y los datos alfabéticos por letras.

El método radix se clasifica en dos tipos según el orden en el que procesan los datos:
ü   De derecha a izquierda y
ü   De izquierda a derecha.

Si aplicamos este método solo a enteros, el método se clasificaría de la siguiente manera:

ü   El digito menos significativo (LSD, Least Significat Digit) y
ü   El digito más significativo (MSD, More Significat Digit).

El radix LSD procesa los enteros iniciando por el digito menos significativo y moviéndose al digito más significativo (de derecha a izquierda).
El radix MSD procesa los enteros iniciando por el digito más significativo y moviéndose al digito menos significativo (de izquierda a derecha).
El método más aplicado de radix, es el LSD, y se encarga de colocar los números en una de las 10 colas que representan un digito cada una de ella, iniciando desde la cola que controla el digito 0 hasta la cola que controla el digito 9, en estas colas se colocan los números dependiendo del digito que se esté analizando en ese momento, hasta que termine con el número que contenga la mayor cantidad de dígitos, en cada cambio de digito los elementos se integran al arreglo nuevamente desde la cola 0 hasta la cola 9, para elegir el siguiente digito de ordenamiento. Cuando se efectúa este proceso para cada dígito  al arreglo  está ordenado.
El procedimiento para aplicar el algoritmo de radix es el siguiente:
Determinar cuál es la mayor cantidad de dígitos del elemento mayor del arreglo.
Crear un arreglo de colas, que permita almacenar cana uno de los dígitos del 0 al 9.
Crear cada posición del arreglo como un objeto que permita almacenar los elementos en cada cola, según el índice que le corresponde.
Generar un ciclo que determine el número de digito que se está procesando y el factor que permite encontrar el digito.
Inicializar el número de digito y el factor en uno;
Mientras el digito sea menor o igual a la cantidad de dígitos encontrados en el paso uno.
El número de digito se debe incrementar de uno en uno.
Crear un segundo ciclo que se encuentra dentro del anterior y que se encarga de recorrer todo el arreglo desde la posición inicial hasta la final del arreglo.
Iniciar el control del ciclo en cero.
Mientras el control sea menor al tamaño del arreglo, continuamos en el ciclo.
El control del ciclo se cambia de uno en uno.
 Generar un segundo ciclo que se encuentra dentro del primero, al igual que el anterior y este controla el paso de los elementos de las colas al arreglo nuevamente.
El control de este ciclo inicia desde la cola cero, al igual que el índice que controla el arreglo de los elementos.
Mientras el control sea menor a diez continua dentro del ciclo.
El control del ciclo se incrementa de uno en uno.

Dentro del ciclo anterior se genera otro ciclo que se encarga de colocar el contenido de cada cola dentro del arreglo original y su condición es que mientras la cola no este vacía retire los elementos guardándolos en el arreglo e incrementar el índice que controla el arreglo.

Unidad IV ESTRUCTURAS NO LINEALES


¿Qué es un árbol (En Estructura de datos)?



Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.

También se suele dar una definición recursiva: un árbol es una estructura en compuesta por un dato y varios árboles.
Esto son definiciones simples. Pero las características que implican no lo son tanto.



Las partes que conforman un árbol son:

  • Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En el ejemplo, 'L' y 'M' son hijos de 'G'.
  • Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo 'A' es padre de 'B', 'C' y 'D'.
  • Los árboles también tienen características importantes como lo son que cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.
En cuanto a la posición dentro del árbol:

  • Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al árbol. En el ejemplo, ese nodo es el 'A'.
  • Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M', 'N' y 'O'.
  • Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no pertenecen a ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.



Otra característica que normalmente tendrán los árboles es que todos los nodos contengan el mismo número de punteros, es decir,  la misma estructura para todos los nodos del árbol. Esto hace que la estructura sea más sencilla, y por lo tanto también los programas para trabajar con ellos.
Tampoco es necesario que todos los nodos hijos de un nodo concreto existan. Es decir, que pueden usarse todos, algunos o ninguno de los punteros de cada nodo.
Un árbol en el que en cada nodo o bien todos o ninguno de los hijos existe, se llama árbol completo.
En una cosa, los árboles se parecen al resto de las estructuras que hemos visto: dado un nodo cualquiera de la estructura, podemos considerarlo como una estructura independiente. Es decir, un nodo cualquiera puede ser considerado como la raíz de un árbol completo.
Existen otros conceptos que definen las características del árbol, en relación a su tamaño:
  • Orden: es el número potencial de hijos que puede tener cada elemento de árbol. De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede apuntar a tres será de orden tres, etc.
  • Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En el árbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no existen elementos con más de tres hijos.
  • Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.
  • Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.

Los árboles de orden dos son bastante especiales, estos árboles se conocen también como árboles binarios.

                                    MÉTODOS DE RECORRIDO DE UN ÁRBOL:

ü  PREORDEN: (RAÍZ, IZQUIERDO, DERECHO).

Para recorrer un árbol binario no vacío en preorden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raíz:

Visite la raíz
Atraviese el sub-árbol izquierdo
Atraviese el sub-árbol derecho

ü  INORDEN: (IZQUIERDO, RAÍZ, DERECHO).

Para recorrer un árbol binario no vacío en inorden (simétrico), hay que realizar las siguientes operaciones recursivamente en cada nodo:

Atraviese el sub-árbol izquierdo
Visite la raíz
Atraviese el sub-árbol derecho


ü  POSTORDEN: (IZQUIERDO, DERECHO, RAÍZ).

Para recorrer un árbol binario No vacío en postorden, hay que realizar las siguientes operaciones recursivamente en cada nodo:

Atraviese el sub-árbol izquierdo
Atraviese el sub-árbol derecho
Visite la raíz

En general, la diferencia entre preorden, inorden y postorden es cuándo se recorre la raíz. En los tres, se recorre primero el sub-árbol izquierdo y luego el derecho.
En preorden, la raíz se recorre antes que los recorridos de los subárboles izquierdo y derecho, en inorden, la raíz se recorre entre los recorridos de los árboles izquierdo y derecho, y en postorden, la raíz se recorre después de los recorridos por el subárbol izquierdo y el derecho.

Preorden (antes), inorden (en medio), postorden (después).





Unidad III ESTRUCTURAS LINEALES.

PILA


Una pila es un TDA que se caracteriza por el hecho de que el último elemento en entrar es el primero en salir
La definición de pila nos indica que todas las operaciones trabajan sobre el mismo extremo de la secuencia. En otras palabras, los elementos se sacan de la estructura en el orden inverso al orden en que se han insertado, ya que el único elemento de la secuencia que se puede obtener es el último (figura 1).

EJEMPLOS DE PILAS


En nuestra vida diaria podemos ver este comportamiento muy a menudo. Por ejemplo, si apilamos los platos de una vajilla, únicamente podremos coger el último plato añadido a la pila, porque cualquier intento de coger un plato del medio de la pila (como el plato oscuro de la figura 2) acabará en un destrozo. Otro ejemplo lo tenemos en los juegos de cartas, en los que generalmente robamos las cartas (de una en una) de la parte superior del mazo (figura 2).

En el mundo informático también encontramos pilas, como por ejemplo, en los navegadores web. Cada vez que accedemos a una nueva página, el navegador la añade a una pila de páginas visitadas de manera que cuando seleccionamos la opción “Anterior” el navegador coge la página que se encuentra en la cima de la pila, porque es justamente la última página visitada.
Otro ejemplo lo tenemos en los procesadores de texto, en los que los cambios introducidos en el texto tambbien se almacenan en una pila. Cada vez que apretamos la combinacion de teclas Ctrl+Z deshacemos el ultimo cambio introducido, mientras que cada vez que apretamos la combinacion Ctrl+Y volvemos a añadir a la pila el cambio deshecho.

EJEMPLO MAS ESTRUCTURADO.

Se pide definir una nueva operación, denominada intersección, que amplíe el TAD cola. Esta operación recibirá como entrada dos colas con los elementos ordenados de manera creciente y devolverá una cola ordenada de forma estrictamente creciente solo con los elementos que aparezcan en las dos colas de entrada (fig.13).

                                   Fig. 13. Ejemplo de la operación intersección


El hecho que la cola esté ordenada nos evita tener que recorrer toda la cola cada vez que queramos comprobar si contiene un elemento dado. En otras palabras, si el primer elemento de la cola a es más pequeño que el primer elemento de la cola b, ya es seguro que no encontraremos un elemento igual en toda la cola b, porque todos los elementos de la cola b serán mayores que el primero de la cola a.
Por tanto con la información establecemos que la estrategia de la operación intersección será la siguiente:
1.- Crear la cola en la que se encolarán los elementos comunes a ambas colas de entrada.
2.- Mientras las dos colas no estén vacías, leer el primer elemento de ambas.
3.- si los 2 elementos son iguales, encolar el elemento en la cola resultado y desencolarlo de las 2 colas de entrada. En caso contrario si los 2 elementos no son iguales, desencolar solo el elemento más pequeño.
4.- Volver al punto 2 mientras no se haya vaciado ninguna de las dos colas.


OPERACIONES BÁSICAS PARA TRABAJAR CON PILAS.
Nombre
Descripción
Crear
Crea una pila vacía
Apilar
Inserta un elemento en la pila
Desapilar
Extrae el elemento situado en la cima de la pila
Cima
Devuelve el elemento situado en la cima de la pila
Vacía
Devuelve cierto si la pila está vacía y falso en caso contrario

Las operaciones del TAD pila se clasifican en:
      Operaciones constructoras: crear, apilar y desapilar.
      Operaciones consultoras: cima y vacía.           
Igualmente, las operaciones constructoras se clasifican en:
·         Operaciones generadoras: Crear y Apilar, porque son imprescindibles para conseguir cualquier estado de la pila.
·         Operaciones modificadoras: Desapilar, porque modifica el estado de la pila extrayendo el elemento de la cima, pero no es una operación imprescindible  para construir una pila.

LISTAS


Una lista es un TAD caracterizado por el hecho de que permite añadir, borrar o consultar cualquier elemento de la secuencia. Es la estructura lineal más flexible, hasta el punto de considerar los TAD pila y cola casos particulares del TAD lista.

OPERACIONES BÁSICAS CON LISTAS
Nombre
Descripción
Crear
Crea una lista vacía
Insertar
Inserta un elemento en la lista delante del punto de interés
Borrar
Extrae el elemento distinguido y desplaza el punto de interés al elemento siguiente
Actual
Devuelve el elemento distinguido
Vacía
Devuelve cierto si la lista está vacía y falso en caso contrario
Principio
Sitúa el punto de interés sobre el primer elemento de la lista
Avanzar
Desplaza el punto de interés al elemento siguiente
Fin
Devuelve cierto si el punto de interés está en el extremo derecho (final) de la lista y falso en caso contrario



TIPOS DE LISTAS


LISTAS ENLAZADAS LINEALES: LISTAS SIMPLES ENLAZADAS

La lista enlazada básica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta al siguiente nodo (o indica que tiene la dirección en memoria del siguiente nodo) en la lista, o al valor NULL o a la lista vacía, si es el último nodo.

LISTAS DOBLEMENTE ENLAZADAS

Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL si es el primer nodo; y otro que apunta al nodo siguiente, o apunta al valor NULL si es el último nodo.

LISTAS ENLAZADAS CIRCULARES

En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer una lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.


Una lista enlazada circular que contiene tres valores enteros.

LISTAS ENLAZADAS SIMPLES CIRCULARES
Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del último apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente insertados después de uno que ya tengamos referenciado.

LISTAS ENLAZADAS DOBLEMENTE CIRCULARES

En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al último y el enlace siguiente del último nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden ser hechas desde cualquier punto con acceso a algún nodo cercano. Aunque estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso externo puede establecer el nodo apuntado que está en la cabeza o al nodo cola, y así mantener el orden tan bien como en una lista doblemente enlazada.
NODOS CENTINELAS
A veces las listas enlazadas tienen un nodo centinela (también llamado falso nodo o nodo ficticio) al principio o al final de la lista, el cual no es usado para guardar datos. Su propósito es simplificar o agilizar algunas operaciones, asegurando que cualquier nodo tiene otro anterior o posterior, y que toda la lista (incluso alguna que no contenga datos) siempre tenga un “primer y último” nodo.

COLA

Una cola es un TDA caracterizado por el hecho que el primer elemento en entrar es el primero en salir.
La definición de cola nos indica que las operaciones trabajan sobre ambos extremos de la secuencia: un extremo para añadir los elementos y el otro para consultarlos o extraerlos. En otras palabras, los elementos se extraen en el mismo orden en que se han insertado previamente, ya que se insertan por el final de la secuencia y se extraen por la cabecera (figura 6).


La mayoría de nuestra vida nos la pasamos haciendo colas: para comprar la entrada en un cine, para pagar en la caja de un supermercado, para visitarnos por el médico, etc. La idea siempre es la misma: se atiende la primera persona de la cola, que es la que hace más rato que espera, y una vez atendida sale de la cola y la persona siguiente pasa a ser la primera de la cola (figura 7).

Si en el mundo real es habitual ver colas, en el mundo informático todavía lo es más, cuando el sistema operativo ha de gestionar el acceso a un recurso compartido (procesos que quieren ejecutarse en la CPU, trabajos que se envían a una impresora, descarga de ficheros etc.) una de las estrategias más utilizadas es organizar las peticiones por medio de colas. Por ejemplo, la figura 8 nos muestra una captura de una cola de impresión en un instante dado, en este caso la tarea 321 se está imprimiendo porque es la primera en la cola, mientras que la tarea 326 será la última en imprimirse porque ha sido la última en llegar


Nombre
Descripción
Crear
Crea una cola vacía
Encolar
Inserta un elemento en la cola
Desencolar
Extrae el elemento situado al principio de la cola
Cabeza
Devuelve el elemento situado al principio de la cola
Vacía
Devuelve cierto si la cola está vacía y falso en caso contrario
OPERACIONES BASICAS CON COLAS


APLICACIONES DE LAS COLAS
Esta estructura de datos se usa en muchos sistemas operativos, por ejemplo Unix, para llevar el control  de la ejecución de procesos, cada proceso en el sistema es almacenado en una lista y esta se va recorriendo, dándole un pequeño tiempo del microprocesador a cada proceso, durante la fracción de segundo de cada proceso este asume que tiene el control total del procesador. Las Colas también se utilizan en muchas maneras en los sistemas operativos para planificar el uso de los distintos recursos de la computadora. Uno de estos recursos es la propia CPU (Unidad Central de Procesamiento).Si está trabajando en un sistema multiusuario, cuando le dice a la computadora que ejecute un programa concreto, el sistema operativo añade su petición a su "cola de trabajo".

Cuando su petición llega al frente de la cola, el programa solicitado pasa a ejecutarse. Igualmente, las colas se utilizan para asignar tiempo a los distintos usuarios de los dispositivos de entrada/salida (E/S), impresoras, discos, cintas y demás. El sistema operativo mantiene colas para peticiones de imprimir, leer o escribir en cada uno de estos dispositivos.