Estructuras lineales

31
ESTRUCTURAS LINEALES (LISTAS)

Transcript of Estructuras lineales

Page 1: Estructuras lineales

ESTRUCTURAS LINEALES(LISTAS)

Page 2: Estructuras lineales

LISTAS

Una lista es una estructura de datos homogénea y dinámica, que va a estar formada por una secuencia de elementos, donde cada uno de ellos va seguido de otro o de ninguno.

Page 3: Estructuras lineales

OPERACIONES BASICAS CON LISTAS

INSERTAR. La operación insertar consiste en la introducción de un nuevo elemento en la lista.En una lista no ordenada no es necesario mantener ningún orden, por lo tanto la inserción de elementos se puede realizar en cualquier lugar de la lista, al principio, al final, en una posición aleatoria.La operación más sencilla depende de la implementación de la estructura de datos, en unos casos puede ser la inserción al inicio, en otros la inserción al final y en este caso la inserción la realiza en el segundo nodo de la lista.

Si tenemos la lista...

Si insertamos el elemento 0, la lista quedaría de la siguiente forma:

Page 4: Estructuras lineales

BORRAR. La operación borrar consiste en la eliminación de la lista de un elemento concreto. La eliminación en una lista no conlleva ningún trabajo adicional más que el propio de la eliminación del elemento en sí. Para borrar un elemento cualquiera habría que realizar un recorrido secuencial de la lista hasta encontrar el nodo buscado y una vez localizado reestructurar los punteros para saltarse el nodo a borrar y así poder eliminarlo.

Paso 1: Localizar el elemento a borrar.

Paso 2: Reestructurar punteros y eliminar nodo.

Page 5: Estructuras lineales

TIPOS DE LISTAS

Listas enlazadas lineales

Listas simples enlazadasLa lista enlazada básica es la lista enlazada simple  tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo.Una lista enlazada simple contiene dos valores: • El valor actual del nodo • Un enlace al siguiente nodo

Lista Doblemente Enlazada

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• Otro que apunta al nodo siguiente, o apunta al

valor NULL si es el último nodo.

Page 6: Estructuras lineales

Listas enlazadas circulares

En una lista enlazada circular, el primer y el último nodo están unidos juntos. 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, 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.

Listas enlazadas circulares simples

Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del último apunta al primero, esto nos permite rápidas inserciones al principio, y también permite accesos al primer nodo desde el puntero del último nodo. 1

Page 7: Estructuras lineales

LISTAS SIMPLEMENTE ENLAZADAS

La lista enlazada es un TDA que nos permite almacenar datos de una forma organizada, al igual que los vectores pero, a diferencia de estos, esta estructura es dinámica, por lo que no tenemos que saber los elementos que puede contener.

En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen recibir también el nombre de nodos de la lista.

Page 8: Estructuras lineales

  struct lista {                   int dato;                   lista *siguiente;                   };

Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores asociados que permitan la manipulación de los datos que contiene. Los operadores básicos de una lista enlazada son:•Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta inserción al principio o final de la lista o bien en orden.•Eliminar: elimina un nodo de la lista, puede ser según la posición o por el dato.•Buscar: busca un elemento en la lista.•Localizar: obtiene la posición del nodo en la lista.•Vaciar: borra todos los elementos de la lista

Page 9: Estructuras lineales

LISTAS DOBLEMENTE ENLAZADAS

Son listas que tienen un enlace con el elemento siguiente y con el anterior. Ventaja; Pueden recorrerse en ambos sentidos para efectuar una operación

con cada elemento o para insertar/actualizar y borrar. Las búsquedas son algo más rápidas puesto que no hace falta

hacer referencia al elemento anterior. Desventaja; Su inconveniente es que ocupan más memoria por nodo que una

lista simple.

Page 10: Estructuras lineales

struct lista_doble { gint dato; lista_doble *siguiente; lista_doble *anterior;

}; I. Representa el dato a almacenar, que puede ser de

cualquier tipo. En este ejemplo se trataría de una lista de enteros.

II. Se trata de un puntero al siguiente elemento de la lista. Con este puntero se enlaza con el sucesor, de forma que podamos construir la lista.

III. Es un puntero al elemento anterior de la lista. Este puntero enlaza con el elemento predecesor de la lista y permite recorrerla en sentido inverso.

Declaración del tipo lista doblemente enlazada

Page 11: Estructuras lineales

struct GList {gpointer data; GList *next;GList *prev;

};

I. Representa el dato que se va a almacenar. Se utiliza un puntero genérico por lo que puede almacenar un puntero a cualquier tipo de dato o bien almacenar un entero utilizando las macros de conversión de tipos.

II. Se trata de un puntero al siguiente elemento de la lista.III. Se trata de un puntero al elemento anterior de la lista.

Declaración de la estructura

GList

Page 12: Estructuras lineales

Las listas circulares tienen la característica de que el último elemento de la misma apunta al primeroLa siguiente figura es una representación gráfica de una lista circular.En las listas circulares se pueden realizar las mismas operaciones que en las listas simplemente ligadas, como son:

 Insertar elemento en una lista  Insertar elemento único  Insertar ordenadamente Eliminar elemento Buscar elemento

LISTAS CIRCULARES

Page 13: Estructuras lineales

public class ListaCircular {

private NodoCircular inicio;

// constructor de listaCircular

public ListaCircular(){

inicio= null ;

}}

Declaración de una lista circular

Page 14: Estructuras lineales

APLICACIONES

Mediante este mecanismo, podemos construir muchas estructuras de datos enlazadas con listas; esta práctica tiene su origen en el lenguaje de programación Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la única), y ahora es una característica común en el estilo de programación funcional.

A veces, las listas enlazadas son usadas para implementar arrays asociativos, y estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras, por ejemplo con árboles binarios de búsqueda equilibrados.

Page 15: Estructuras lineales

PILAS

Page 16: Estructuras lineales

Pilas

Estructura de datos lineal donde los elementos pueden ser añadidos o removidos solo por un extremo.

Esta estructura tiene una filosofia LIFO (last-in, first-out), ultimo en entrar, primero en salir

Ejemplos:•Pila de platos.•Pila de monedas.•Pila de discos.

Page 17: Estructuras lineales

Una pila (stack en inglés) es una lista ordenada o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.

Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.

En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.

Page 18: Estructuras lineales

Representación básica en memoria estática y dinámica

Arreglos (memoria estática)

Una vez definido el tamaño del arreglo no se cambia su tamaño

Listas enlazadas (memoria dinámica)

Se almacenan los elementos como nodos y el tamaño se ajusta exactamente a los elementos de la pila

c

b

a

tope

pila

Max = 5

abc

pilad

tope

Page 19: Estructuras lineales

Operaciones básicas con pilas.

PUSH (insertar).- Agrega un elementos a la pila en el extremo llamado tope.

-POP (remover).- Remueve el elemento de la pila que se encuentra en el extremo llamado tope.

-VACIA.- Indica si la pila contiene o no contiene elementos.

-LLENA.- Indica si es posible o no agregar nuevos elementos a la pila.

Page 20: Estructuras lineales

Ejemplo:

Inicio:

Insertar

A:

Tope Null

Insertar

B:

Insertar

C:

Eliminar

Tope

A A

B

Tope

A

B

Tope

C

A

B

Topetope tope tope tope tope

Page 21: Estructuras lineales

Métodos básicos para implementar la pila son: Pila_llena()

Devuelve verdadero si la pila esta llena Pila_vacia();

Devuelve verdadero si la pila esta vacia Insertar_push (int elem);

Agrega el elemento a la pila Retirar_pop();

Elimina el elemento que esta en la cima de la pila

Page 22: Estructuras lineales

Notaciones NOTACION INFIJA: es la forma habitual de escribir operacionesaritméticas es la de situar el operador entre sus dosoperandos. El operador se evalúa dentro de losOperandos.Los operadores aparecen en medio de los operandos. A + B, A – 1, E/F, A * C , A + B + CNOTACION PREFIJA: (polaca)El operador aparece antes de los operandos. + AB, - A1, /EF, *AC, ++ABC, +- ABCNOTACION POSTFIJA: (polaca)El operador aparece al final de los operandos. AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-

Page 23: Estructuras lineales

Reglas para convertir de infija a posfija o prefija La ventaja de utilizar expresiones en notación

polaca (posfija o prefija) radica en que no son necesarios los paréntesis para indicar el orden de operación, ya que esto queda establecido por la ubicación de los operadores de más alta prioridad se ejecuta primero.

Si hubiera en una expresión 2 o mas operadores de igual precedencia, se procesa de izquierda a derecha.

Las expresiones con paréntesis se ejecutan primero

Page 24: Estructuras lineales

De infija a prefijaA*B/(A+C) (infija) -> A*B/+AC -> *AB/+AC -> /*AB+AC (prefija)

A*B/A+C -> *AB/A+C -> /*ABA+C -> +/*ABAC

(A-B)ˆC+D -> -ABˆC+D -> ˆ-ABC+D -> +ˆ-ABCD

De infija a postfija

A*B/(A+C) (infija) -> A*B/AC+ -> AB*/AC+ -> AB*AC+/ (postfija)

A*B/A+C -> AB*/A+C -> AB*A/+C -> AB*A/C+

(A-B)ˆC+D -> AB-ˆC+D -> AB-Cˆ+D -> AB-CˆD+

Page 25: Estructuras lineales

COLAS

Page 26: Estructuras lineales

Colas

Es una lista lineal de elementos en la que las operaciones de insertar y eliminar se realizan en diferentes extremos de la cola.

Trabajan con filosofía FIFO ( First In - First out), el primer elemento en entrar es el primer elemento en salir.

Page 27: Estructuras lineales

Cola simple: Estructura lineal donde los elementos salen en el mismo orden en que llegan.

Cola circular: Representación lógica de una cola simple en un arreglo.

Cola Doble: Estructura lineal en la que los elementos se pueden añadir o quitar por cualquier extremo de la cola (cola bidireccional).

Tipos de Colas

Page 28: Estructuras lineales

Operaciones básicas con colas

Insertar.- Almacena al final de la cola el elemento que se recibe como parámetro.

Eliminar.- Saca de la cola el elemento que se encuentra al frente.

Vacía.- Regresa un valor booleano indicando si la cola tiene o no elementos (true – si la cola esta vacía, false – si la cola tiene al menos un elemento).

Llena.- Regresa un valor booleano indicando si la cola tiene espacio disponible para insertar nuevos elementos ( true – si esta llena y false si existen espacios disponibles).

Page 29: Estructuras lineales

Representación usando arreglos

Las colas pueden ser representadas en arreglos de una dimensión (vector) manteniendo dos variables que indiquen el FRENTE y FINAL de los elementos de la cola.

A F S D Z

Frente Final

0 1 2 3 4 5

Page 30: Estructuras lineales

Cuando la cola esta vacía las variables frente y final son nulos y no es posible remover elementos.

Cuando la cola esta llena ( frente = 0 y final = n-1) no es posible insertar elementos nuevos a la cola.

Page 31: Estructuras lineales

Cola Circular

Es una representación lógica de la cola en un arreglo.

El frente y final son movibles.

Cuando el frente o final llegan al extremo se regresan a la primera posición del arreglo.

C D E

Frente

Final

F C D E

Frente

Final

C D

Frente

Final

B C D

Frente

Final

Remover

Insertar E

Insertar F

Cola inicial