jueves, 2 de octubre de 2014

3.3.4 Cola de Prioridad: Definición y Aplicaciones

Una Cola de Prioridad es una estructura de datos que: permite:
1. La inserción de elementos en la cola con una determinada prioridad .
2. Consultar el siguiente elemento de la cola de acuerdo a la prioridad de sus elementos.
3. Obtener y eliminar el siguiente elemento de la cola de acuerdo a la prioridad de sus elementos.
 Particularidades de Java:
La prioridad de los elementos no es explícita, viene implícita de acuerdo al criterio de comparación de los elementos. El mínimo elemento es el más prioritario
Estructura de Datos: Cola de Prioridad
 Cola de Prioridad: Colección de Datos
que tienen Asociado cierta información (prioridad) que determina el orden en el que se accede a dichos datos.
package modelos;
public interface ColaPrioridad<E extends Comparable<E>> {
void insertar(E x);
E recuperarMin();
E eliminarMin();
boolean esVacia();
}
Precondición: Los métodos recuperarMin() y eliminarMin()

se tienen que aplicar sobre Cola Prioridad no vacías.

3.3.3 Tipos De Colas Cola Simple Cola Circular Y Colas Dobles

Cola dobles

La bicola o doble cola es un tipo de cola especial que permiten la inserción y eliminación de elementos de ambos extremos de la cola. Puede representarse a partir de un vector y dos índices, siendo su representación más frecuente una lista circular doblemente enlazada.
Esta estructura es una cola bidimensional en que las inserciones y eliminaciones se pueden realizar en cualquiera de los dos extremos de la bicola. Gráficamente representamos una bicola de la siguiente manera:





Existen dos variantes de la doble cola:
Doble cola de entrada restringida.
Doble cola de salida restringida.
La primera variante sólo acepta inserciones al final de la cola, y la segunda acepta eliminaciones sólo al frente de la cola
Algoritmo de Inicialización
F < -- 1
A <-- 0

Algoritmo para Insertar
Si A=máximo entonces mensaje (overflow) en caso contrario
 A <--A+1
cola[A]<-- valor

Algoritmo para Extraer
Si F&gtA entonces
mensaje (underflow)
en caso contrario
mensaje (frente/atrás)
si frente entonces
x <-- cola[F]
F <-- F+1
en caso contrario
x <-- cola[A]
A <-- A-1


Esta estructura es un conjunto de elementos donde a cada uno de ellos se les asigna una prioridad, y la forma en que son procesados es la siguiente:
Un elemento de mayor prioridad es procesado al principio.
Dos elementos con la misma prioridad son procesados de acuerdo al orden en que fueron insertados en la cola.

Algoritmo para Insertar
x <--1
final<--verdadero
para i desde 1 hasta n haz
Si cola[i]&gtprioridad entonces
x <--i
final <--falso
salir
si final entonces
x <--n+1
para i desde n+1 hasta x+1
cola[i] <--prioridad
n <-- n+1

Algoritmo para Extraer
Si cola[1]=0 entonces
mensaje(overflow)
en caso contrario
procesar <--cola[1]
para i desde 2 hasta n haz
cola[i-1] <--cola[1]
n <-- n-1


Las operaciones que nosotros podemos realizar sobre una cola son las siguientes:
·         Inserción.
·         Extracción.
Las inserciones en la cola se llevarán a cabo por atrás de la cola, mientras que las eliminaciones se realizarán por el frente de la cola (hay que recordar que el primero en entrar es el primero en salir).

Existen dos variantes de la doble cola:

Doble cola de entrada restringida.-
Este tipo de doble cola acepta solamente la inserción de elementos por un extremo; mientras que puede eliminar por ambos.

Doble cola de salida restringida.-
Este tipo de doble cola acepta solamente la eliminación de elementos por un extremo; mientras que puede insertar por ambos.
Cola Circular

Una cola circular o anillo es una estructura de datos en la que los elementos están de forma circular y cada elemento tiene un sucesor y un predecesor. Los elementos pueden cosultarse, añadirse y eliminarse unicamente desde la cabeza del anillo que es una posición distinguida. Existen dos operaciones de rotaciones, una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor, respectivamente, de la cabeza actual.
Para solucionar el problema de desperdicio de memoria se implementaron las colas circulares, en las cuales existe un apuntador desde el último elemento al primero de la cola.
La representación gráfica de esta estructura es la siguiente:






La condición de vacío en este tipo de cola es que el apuntador F sea igual a cero.
Las condiciones que debemos tener presentes al trabajar con este tipo de estructura son las siguientes:
·         Over flow, cuando se realice una inserción.
·         Under flow, cuando se requiera de una extracción en la cola.
·         Vacio

ALGORITMO DE INICIALIZACIÓN
F < -- 0
A<-- 0

ALGORITMO PARA INSERTAR
Si (F+1=A) ó (F=1 y A=máximo) entonces
mensaje (overflow)
en caso contrario
inicio
si A=máximo entonces
A<--1
cola[A]<-- valor
en caso contrario
A <--A+1
cola[A]<-- valor
si F=0 entonces
F <-- 1
fin

ALGORITMO PARA EXTRAER
Si F=0 entonces
mensaje (underflow) en caso contrario
x <-- cola[F]
si F=A entonces
F <-- 0
A<-- 0
en caso contrario
si F=máximo entonces

F <--1 en caso contrario F <-- F+1

3.3.2 Operaciones básicas de las colas

Pues en las colas como en toda estructura de datos las operaciones principales son insertar y eliminar, aunque en varias implementaciones de colas puedan recibir nombres diferentes.
Insertar
La inserción en las colas se realiza por la cola de las mismas, es decir, se inserta al final de la estructura.
Para llevar a cabo esta operación únicamente hay que reestructurar un par de punteros, el último nodo debe pasar a apuntar al nuevo nodo (que pasará a ser el último) y el nuevo nodo pasa a ser la nueva cola de la cola.

Vamos a verlo gráficamente sobre la siguiente cola:
Si a esta cola le añadimos el elemento 0, la cola resultante sería:
Borrar
El borrado es una operación muy simple en las colas. Esta operación supone extraer la cabeza de la cola, ya que es el elemento que más tiempo lleva en la estructura. Para llevar a cabo esta operación únicamente hay que extraer el elemento situado en la cabeza de la cola y avanzar el puntero cabeza una posición, para que de esta forma la nueva cabeza sea el segundo elemento que más tiempo lleva en la cola.
Si realizamos la operación eliminar sobre la colas de 4 elementos del último gráfico el resultado sería el siguiente:


Una diferencia importante entre las colas y las listas, es que en las colas no se puede borrar un elemento cualquiera, se borra siempre el que está en la cabeza de la cola.

3.3.1 MEMORIA ESTATICA Y DINAMICA

.
memoria





Es un espacio lógico para guardar información.
La memoria (también llamada almacenamiento) se refiere a parte de los componentes que forman parte de una COMPUTADORA, Son dispositivos que retienen DATOS informáticos durante algún intervalo de tiempo. Las memorias de computadora proporcionan unas de las principales funciones de la computación moderna, la retención o almacenamiento de información. Es uno de los componentes fundamentales de todas las computadoras modernas que, acoplados al CPU.
ESTÁTICA
La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de ejecución es en memoria estática o permanente a lo largo de toda la ejecución del programa. O sea,  que no se modifica al menos en tiempo de ejecución.
No todos los objetos (variables) pueden ser almacenados estáticamente.
Para que un objeto pueda ser almacenado en memoria estática su tamaño (número de bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación, como consecuencia de esta condición no podrán almacenarse en memoria estática:

dinámica
Su tamaño puede variar durante la ejecución del programa y puede ser liberado mediante la función free. O sea que se modifica permanentemente.
Memoria estática.-
Las técnicas de asignación de memoria estática son sencillas.
La asignación de memoria puede hacerse en tiempo de compilación y los objetos están vigentes desde que comienza la ejecución del programa hasta que termina.
En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de estos subprogramas puedan almacenarse estáticamente se aloja en la memoria estática un registro de activación correspondiente a cada uno de los subprogramas.

Estos registros de activación contendrán las variables locales, parámetros formales y valor devuelto por la función.

miércoles, 1 de octubre de 2014

3.3 Colas

Son aquellas que solo tiene 2 operaciones, Push(Inserción) y Pop(Eliminación). Push solo se puede efectuar por un extremo llamado Frente y Pop por el extremo Llamado Final. Sin Embargo se le pueden aplicar todas las operación al igual que a las listas.
Recorrido
Definición:
Ya que las colas son FIFO(First in - First Out) el Recorrido se hace sacando el primer dato que se inserto hasta que llegue al extremo llamado Final.
Detalle:
En un principio se compara para saber si tiene algún dato en la Cola, si no es así desplegara “Cola Vacía…”. De otra forma compara si Frente es mayor o igual a Final, de esta forma simplemente hace un Recorrido lineal como los anteriores. De otra forma usar Max como bandera para saber cuando empezar a contar de 0 a Final (Ya que sabemos que el Frente después del nodo Final).
Algoritmo:
Recorrido(Cola, Frente, Final, Max)

Si Frente ≠ Nulo

Si Frente ≤ Final, entonces:

Apuntador <-- Frente

Repetir mientras Apuntador ≤ Final

Imprimir Cola[Apuntador]

Apuntador <-- Apuntador + 1

Fin del ciclo

Si no, si Frente > Final, entonces:

Apuntador <-- Frente

Repetir mientras Apuntador ≠ Final

Si Apuntador > Max, entonces:

Apuntador <-- 0

Imprimir Cola[Apuntador]

Apuntador <-- Apuntador + 1

Fin del ciclo

Si no:

Imprimir "Cola Vacía"

Salir
ama:


Corrida:


Push
Definición:
Push es simplemente el método por el cual va agregando un Dato nuevo a la Cola tomando en cuenta el Tamaño Máximo de Capacidad (Max), el Frente y el Final de la Cola.
Detalle:
Primer nos aseguramos que la Cola no este Llena, para que de esta manera sea capaz de insertar un Elemento nuevo. Si no desplegara Cola Llena. Después compara para determinar las posiciones de Frente y Final y de esta manera poder moverlo con libertad. Ya que determina los valores de Frente y Final, nos Indica que Cola[Final] tomara el valor de Elemento.
Algoritmo:
Push(Cola, Frente, Final, Max, Elemento)

Si Frente = 0 y Final =9, o si Frente = (Final + 1)

Imprimir "Cola Llena" y Salir

Si Frente = Nulo

Frente <-- 0

Final <-- 0

Si no, si Final = Max

Final <-- 0

Si no:

Final <-- Final + 1

Cola[Final] = Elemento

Salir


corrida:


Pop
Definición:
Pop es simplemente el método por el cual va sacando el primer Dato de la Cola (esto se comprueba ya que las Colas son FIFO), para esto toma en cuenta el Frente.
Detalle:
Compara para determinar si la cola esta vacía, de otra forma lo que hace es Imprimir “Eliminando el Dato…”. Después se hacen una series de comparaciones para determinar la nueva posición de Frente, de esa forma el Dato que existía en Frente es Eliminado.
Algoritmo:
Pop(Cola, Frente, Final, Max)

Si Frente ≠ Nulo

Imprimir "Eliminado el Dato..."

Si Frente = Final

Frente = Nulo

Final = Nulo

Si no, si Frente = Max

Frente = 0

Si no:

Frente <-- Frente + 1

Si no:

Imprimir "Cola Vacía"

Salir

diagrama:



corrida:



Búsqueda
Definición:
Este método usa el recorrido para encontrar Elemento y desplegar un mensaje si la búsqueda es exitosa.
Detalle:
El algoritmo usa básicamente la misma estructura del Recorrido, la única diferencia es que compara cada uno de los Datos con Elemento, de esta forma se da cuenta si este Dato existe en la Cola.
Algoritmo:
Busqueda(Cola, Frente, Fin, Max, Elemento)

Si Frente ≠ Nulo

Si Frente ≤ Final, entonces:

Apuntador <-- Frente

Repetir mientras Apuntador ≤ Final

Si Elemento = Cola[Apuntador]

Imprimir "Dato encontrado..." y Salir

Apuntador <-- Apuntador + 1

Fin del ciclo

Si no, si Frente > Final, entonces:

Apuntador <-- Frente

Repetir mientras Apuntador ≠ Final

Si Apuntador > Max, entonces:

Apuntador <-- 0

Si Elemento = Cola[Apuntador]

Imprimir "Dato encontrado..." y Salir

Apuntador <-- Apuntador + 1

Fin del ciclo

Imprimir "Dato no encontrado..."

Si no:

Imprimir "Cola Vacía"

Salir

diagrama:


corrida:

Eliminacion
Definición:
Este método busca un Dato dentro de la cola y lo elimina.
Detalle:
Este Método es la mezcla de todos en uno, Recorrido, Búsqueda, Pop y Push. Debido que a busca el Dato haciendo un Recorrido, y en el proceso copia todos los Datos que no son en un Arreglo Temp, para después meterlos a la Cola original, esto lo hace hasta encontrar el dato deseado que posteriormente lo Elimina.

Diagrama:

corrida:



3.2.5 Recursividad con ayuda de pilas.

Las pilas se usan comúnmente para indicar en que punto se encuentra un programa cuando contiene procedimientos que se llaman a si mismos. Estos procedimientos se conocen como procedimientos recursivos.
La recursividad es una técnica en la que un procedimiento o función se hace llamadas a si mismo en el proceso de realización de sus tareas. La recursividad se puede definir mediante un clásico ejemplo de la función factorial. La recursividad es una técnica de programación muy potente que puede ser usada en lugar de una iteración (Bucles o ciclos). Ello implica una forma diferente de ver las acciones repetitivas permitiendo que un subprograma se llame a si mismo para resolver una operación mas pequeña del programa original.

4!= 4*3*2*1=24

3.2.4 Notación infija y postfija

 La notación infija es la forma natural de escribir expresiones aritméticas por ejemplo (A+B)*C y  A+ (B*C), en esta notación se sitúa el operador entre sus operandos.
 El inconveniente de esta notación es que muchas veces se necesita de paréntesis para indicar el orden de evaluación: A*B/(A+C) <>A*B/A+C (diferente resultado).
 Suponga que queremos evaluar la siguiente expresión aritmética sin paréntesis:
2 ˆ 3   + 5 * 2 ˆ 2 – 12 / 6
Primero evaluamos las potencias para obtener
8 + 5 * 4 – 12 / 6
Entonces evaluamos la multiplicación y división y se obtiene 8 + 20 -2.
Evaluamos la suma y la resta y se obtiene 26 realizándola en 3 niveles de precedencia
 La notación postfija (Polaca inversa) debe su nombre al matemático polaco Jan Lukasiewicz, y en esta notación el símbolo operador se coloca delante de sus operandos. 
 La ventaja de la notación postfija es que no se requieren de paréntesis para su evaluación, además es más utilizada por las computadoras ya que permite una forma muy sencilla y eficiente de evaluar expresiones aritméticas (con pilas).

Infija
Postfija
a/b+c*d-e*f
ab/cd*+ef*-
a*b / (a+c)
ab*ac+/

Conversión de Infija a Postfija a través de pilas.
 Primero hay que saber que en una expresión se tienen operadores y que estos tienen cierta prioridad.
 Operadores

Operador
Símbolo
Prioridad
Paréntesis
( )
Mas alta
Potencia
^
Multiplicación / División
*  /
Suma / Resta
+ -
Mas Baja

En caso de una igualdad en una expresión:
·         Son evaluados de izquierda a derecha (se evalúa primero el que primero aparece)  5*4/2 = (5*4)/2 = 10
·       Cuando aparecen varios operadores de potenciación juntos la expresión se evalúa de derecha a izquierda  2^3^2 = 2^(3^2) = 2^9 = 512.


3.2.3 Aplicaciones

Las operaciones que se presentan en esta aplicación son las siguientes:
OPERACIÓN PUSH
Esta operación sirve para insertar un elemento e en la pila S, lo vamos a escribir como:
push(S,e)
Después de hacer esta operación sucede que:
El elemento en la cima de la pila S ahora es e
LA OPERACIÓN POP
Para retirar un elemento de la pila S y asignarlo a una variable del mismo tipo que el tipo de los elementos de la pila, usaremos la operación pop escribiéndola como:
v=pop(S);
En donde v es una variable que almacena el valor del elemento que estaba en la cima de S. Hacer esta operación tiene algunas implicaciones:
La variable v debe ser del mismo tipo que los elementos almacenados en la pila.
Solamente se puede retirar un elemento de la pila a la vez.
Antes de la operación, e era el elemento en la cima, ahora ya no lo es más. El apuntador ``cima'' decrece en una unidad.
LA OPERACIÓN STACKEMPTY
Esta operación toma como argumento una estructura del tipo stack (pila) y devuelve un valor booleano, devuelve un true si la pila está vacía y devuelve un false si la pila tiene al menos un elemento.
LA OPERACIÓN STACKTOP
La operación stacktop(S) devuelve el valor del elemento en la cima de la pila S. Para hacer esta operación escribiremos:
v=stacktop(S)
Las implicaciones de usar esta operación son:
Se hace una copia del elemento que está en la cima
En realidad se hacen dos operaciones, primero se hace v=pop(S), luego un push(S,v), porque después de la operación stacktop, la pila S queda sin cambio alguno.
Para ver aplicaciones con pilas, en pseudocódigo queda de la siguiente forma:
// Inserción en Pilas de forma tradicional

principal()
{
  // declaracion de variables
   top = 0; Pila[10]=0; Dato=0;N=10;

   do
   {
      pedir " de el numero a insertar :";
      Leer Dato;
      // Verificar si hay lugar en pila
        si(top >= N) entonces
         { Desplegar " Pila llena";}
        sino
           {     pila[top]=Dato;
                 top = top + 1;
            }
      preguntar " Desea otra insercion en pila :",
      Leer otro;
    }while(otro != "No");

}

3.2.2 Operaciones Básicas con pilas.

Las dos operaciones principales de una pila a añadir elementos a la pila y tomando elementos de la pila.
La operación de inserción agrega un elemento a una pila.
Tomamos un elemento de la pila con una operación de pop.
La otra operación principal para llevar a cabo en una pila está viendo el primer elemento.
La operación Pop devuelve el primer elemento, pero la operación también se elimina de la pila. Queremos ver sólo el primer elemento sin llegar a eliminar. Esta operación se llama ojeada en C#.

La otra operación principal para llevar a cabo en una pila está viendo el primer elemento. La operación Pop devuelve el primer elemento, pero la operación también se elimina de la pila. Queremos ver sólo el primer elemento sin llegar a eliminar. Esta operación se llama ojeada en C#.

3.2.1 Representación en memoria estática y dinámica

Definición de Pila: Es una lista lineal en la que las inserciones y supresiones, se hacen en un extremo de la lista.

Ejemplos clásicos de la vida cotidiana seria una pila de platos, una pila de monedas, una pila de billetes, en cada pila se va tomando el de arriba, es decir el de encima, así mismo pasa con las pilas se inserta y se elimina por arriba.

Las Operaciones básicas que se realizan con pilas son meter elementos en la pila, y sacar elementos de la pila, a esto se le conoce como Push y Pop.

A las pilas también se les conoce como LIFO, por sus siglas en ingles last in firt out, que significa ultimo en entrar, primero en salir. 

Operaciones asociadas con la pila
Crear la pila
Ver si la pila esta vacía
Insertar elementos en la pila
Eliminar un elemento de la pila
Vaciar la pila





3.2. Pilas

La pila es una de las estructuras de uso más frecuente de datos, como acabamos de mencionar.
Se define una pila como una lista de elementos que sólo son accesibles desde el final de la lista, que se llama la parte superior de la pila.
El modelo estándar de una pila es la pila de bandejas en una cafetería. Las bandejas son retiradas de la parte superior, y el que la lavadora de platos o ayudante de camarero pone una bandeja en la pila, se coloca en la parte superior también
• Una pila es conocido como un último en entrar, primero en salir (LIFO) estructura de datos.
Las dos operaciones principales de una pila a añadir elementos a la pila y tomando elementos de la pila.
La operación de inserción agrega un elemento a una pila.
Tomamos un elemento de la pila con una operación de pop.
La otra operación principal para llevar a cabo en una pila está viendo el primer elemento.
La operación Pop devuelve el primer elemento, pero la operación también se elimina de la pila. Queremos ver sólo el primer elemento sin llegar a eliminar. Esta operación se llama ojeada en C#.
La otra operación principal para llevar a cabo en una pila está viendo el primer elemento. La operación Pop devuelve el primer elemento, pero la operación también se elimina de la pila. Queremos ver sólo el primer elemento sin llegar a eliminar. Esta operación se llama ojeada en C#.
Para ver aplicaciones con pilas, en pseudocódigo queda de la siguiente forma:
//Inserción en Pilas de forma tradicional
 principal()
{
  // declaración de variables
   top = 0; Pila[10]=0; Dato=0;N=10;

   do
   {
      pedir " de el numero a insertar :";
      Leer Dato;
      // Verificar si hay lugar en pila
        si(top >= N) entonces
         { Desplegar " Pila llena";}
        sino
           {     pila[top]=Dato;
                 top = top + 1;
            }
      preguntar " Desea otra inserción en pila :",
      Leer otro;
    }while(otro != "No");

}

3.1.6.Aplicaciones con Listas

Las aplicaciones puede ser una infinidad de procesos, entre ellos podemos encontrar:
La lista de pasajeros de una aerolínea.
Un directorio telefónico electrónico.


Estos son ejemplos de aplicaciones con listas.

3.1.5 listas circulares

Para este tipo de listas se dice que aquí las lista ligada circular es aquella donde el último dato se enlaza con el primero, es decir, es similar a la lista enlazada simple solo que este se enlaza el último dato con el primero.
Donde:
Dato
Es el valor de la lista.
Siguiente
Es el enlace, posición que nos da el siguiente.
Ultimo

Es la última posición que enlaza al primer elemento.

3.1.4 lista doblemente enlazadas

Para este tipo de Lista se dice que es el dato que se liga con el anterior y el siguiente.
En el siguiente ejemplo gráfico se muestra cómo funciona una lista doblemente ligada.
Donde:
Información
Es el dato de la lista.
Anterior
Es la Posición donde se encuentra el dato anterior.
Siguiente
Es la Posición donde se encuentra el dato siguiente.
Las listas doblemente enlazadas consisten en datos y enlaces tanto al elemento siguiente como al elemento anterior. Con lo que se consiguen dos grandes ventajas, primero la lista se puede leer en cualquier dirección, la segunda es que se pueden leer los enlaces hacia delante como hacia atrás, con lo que si un enlace resulta no valido se puede reconstruir utilizando el otro enlace.
Como en las listas simplemente enlazadas, las doblemente enlazadas pueden contener una función que almacene cada elemento en una posición específica de la lista a medida que esta se construye, en lugar de colocar cada elemento al final de la lista.

Una lista doblemente enlazada es una lista lineal en la que cada nodo tiene 2 enlaces un nodo llamado siguiente y otro nodo llamado anterior.

3.1.3 listas simplemente enlazadas

Una Lista Enlazada Simple es aquella donde el primer dato está ligado con el siguiente.
Un ejemplo gráfico es el siguiente.
Donde:
Dato: Es el valor de la lista
Enlace: Es la posición donde se encuentra el siguiente dato.
Un ejemplo de una lista enlazada es el siguiente:
Elemento
Enlace
Gloria
4
0
Raul
5
0
Paco
1
Donde
INICIO = 3
DISPONIBLE = 4
El arreglo consta de 5 posiciones, de las cuales son DE LA 1 A LA 5. Podemos observar que el arreglo de elementos contiene VALORES STRING, en cambio el arreglo Enlace, contiene LAS POSICIONES del siguiente enlace.
Esto nos da como resultado si queremos visualizar (desplegar la lista enlazada simple:
Queda de la siguiente forma: Raul,Paco,Gloria.

Esto es como si los ordenara de forma descendente pero sin hacerlo en realidad.

3.1.2 tipos de listas

Existen varios tipos de listas, entre ellos tenemos:
Listas Lineales (Listas y tablas)
Listas Enlazadas
Listas Enlazadas Simples
Listas Enlazadas Dobles
Listas Enlazadas Circulares
Listas Enlazadas Dobles-Circular

En esta unidad solo veremos los tres primeros tipos de listas enlazadas (simples, dobles y circulares).

3.1.1 operaciones básicas con listas

Las operaciones sobre este tipo de listas son las siguientes:
Añadir un elemento a una lista doblemente enlazada vacía.
Insertar un elemento en la primera posición de la lista.
Insertar un elemento en la última posición en la lista.
Insertar un elemento a continuación de un nodo cualquiera de una lista.
Buscar o localizar elementos.
Borrado de elementos.
Eliminar único elemento de una lista doblemente enlazada
Eliminar el primer elemento de la lista doblemente enlazada.
Eliminar el último elemento de una liara doblemente enlazada.
Eliminar un elemento intermedio de una lista doblemente enlazada.

BUSCAR O LOCALIZAR ELEMENTOS
Para recorrer una lista se procederá de un modo parecido al que se usa con las listas lineales, pero se tiene que tener encuentra que la lista no siempre tiene que estar en uno de sus extremos.

LOS PASOS DE LA BÚSQUEDA SON LOS SIGUIENTES
Retroceder hasta el comienzo de la lista, asignar el valor de la lista anterior mientras lista anterior no sea NULL.
WHILE (ANTERIOR! = NULL O -999).
Se abre un ciclo en donde al menos la condición debe de ser que el índice no sea NULL.(ciclos pasos repetitivos).

Dentro del bucle (ciclo) asignaremos a la lista el valor del nodo siguiente al actual.

3.1 Listas

Una lista lineal es una estructura en la que las inserciones, supresiones, y la recuperación puede ocurrir en cualquier posición en la lista.
Por lo tanto, cuando la lista es estática, se puede implementar mediante el uso de un arreglo lineal  Cuando la lista se lleva a cabo o realizado mediante el uso de una matriz, que es una lista contigua. 
Por contiguas, queremos decir que los elementos se colocarán consecutivamente uno tras otro a partir de alguna dirección, llamada dirección base. La ventaja de una lista implementada mediante una matriz es que es accesible al azar. 
La desventaja de esta lista es que las inserciones y de supresiones requieren movimiento de las entradas, por lo que es más costoso. Una lista estática se puede implementar utilizando una matriz mediante la asignación del i-ésimo elemento de la lista en la entrada i de la matriz.
Estas son consideradas como los arreglos, dentro de estos tenemos:
Arreglos Unidimensionales: 
Son aquellos que tienen una sola dimensión, conocidos también como vectores o listas.
Arreglos Bidimensionales: 

Son aquellos que tienen dos dimensiones. Conocidos también como Matriz o Tabla.