Está en la página 1de 24

República Bolivariana de Venezuela

Ministerio del Poder Popular para la Defensa


Universidad Nacional Experimental
Politécnica de la Fuerza Armada.
UNEFA- APURE

LISTAS
Tutor: Autores:
Laryenso Gutiérrez García Jasneyka
C.I. 19.405.985
España Silvia
C.I. 18.727.135

San Fernando de Apure, Julio de 2009.


CONTENIDO
DEFINICIÓN DE LISTA
LISTAS SIMPLEMENTE ENCADENADAS
LISTAS ABIERTAS
Declaraciones de Tipos para Manejar Listas en C
Operaciones Básicas con Listas
Localizar Elementos en una Lista Abierta
Eliminar Elementos en una Lista Abierta
Moverse a Través de una Lista Abierta
Borrar una Lista Completa

LISTAS DOBLEMENTE ENLAZADAS


Declaraciones de Tipos para Manejar
Operaciones Básicas con Listas Doblemente Enlazadas
Buscar o Localizar un Elemento de una Lista Doblemente
Enlazada
Eliminar un Elemento de una lista Doblemente Enlazada

LISTAS CIRCULARES
Declaraciones de Tipos para Manejar Listas circulares en C
Operaciones Básicas con Listas circulares
Localizar Elementos en una Lista circulares
Eliminar Elementos en una Lista circulares

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Hay dos desventajas
serias con respecto a las
estructuras estáticas de
pilas y colas usando

porque es posible que


accedamos a una localidad Estas desventajas son que
de memoria de la cual no tienen un espacio limitado
deseábamos cambiar su de memoria y la otra
contenido.

LISTA
desventaja es que es
posible no ocupar toda la
memoria disponible,

Sin embargo, hay una


advertencia. Como regla
general siempre hay
que tener cuidado al
Una solución es usar listas.
manejar direcciones de
Las listas son estructuras
espacios de memoria,
de datos que son dinámicas,
esto significa que adquieren
espacio y liberan espacio a
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
medida que se necesita.
LISTAS SIMPLEMENTE
ENCADENADAS

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


LISTAS ABIERTAS
El nodo típico para
construir listas tiene
esta forma:

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Declaraciones de
Tipos para Manejar
Listas en C Es muy
importante que
nuestro
programa nunca
typedef struct _nodo pierda el valor
{ del puntero al
int dato; primer elemento,
struct _nodo ya que si no
*siguiente; existe ninguna
} tipoNodo; copia de ese
valor, y se pierde,
typedef tipoNodo será imposible
*pNodo;

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Insertar Elementos en
una Lista Abierta

Este es,
evidentemente,
el caso más
Operaciones sencillo.
Básicas con Partiremos de
que ya tenemos
Listas
Insertar un Elemento en la
el nodo a insertar
y, por supuesto
Primera Posición de una un puntero que
Lista: apunte a él,
además el

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Localizar Elementos en
una Lista Abierta
typedef struct
_nodo {
Para recorrer una lista int dato;
A menudo se
procederemos siempre del struct _nodo
recorre a una lista,
mismo modo, usaremos un *siguiente;
ya sea buscando } tipoNodo;
puntero auxiliar como
un valor particular
índice:
o un nodo typedef tipoNodo
concreto. Las listas *pNodo;
Asignamos al puntero typedef tipoNodo
abiertas sólo
índice el valor de Lista. *Lista;
pueden recorrerse
...
en un sentido, ya
Abrimos un bucle que al pNodo indice;
que cada nodo ...
menos debe tener una
apunta al indice = Lista;
condición, que el índice no
siguiente, pero no while(indice) {
sea NULL.
se puede obtener, printf("%d\n",
por ejemplo, un indice->dato);
Dentro del bucle indice = indice-
puntero al nodo
asignamos al índice el >siguiente;
valor del nodo siguiente al
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA }
índice actual.
Eliminar un Nodo Eliminar Elementos en una Lista
O Cualquiera de una Lista Abierta 
P Abierta:
E
R
A
Hacemos que nodo apunte
C al primer elemento de la
I Hacemos que nodo apunte al
lista, es decir a Lista.
nodo que queremos borrar.
O
Asignamos a Lista la
N Ahora, asignamos como nodo
dirección del segundo nodo
E siguiente del nodo anterior,
de la lista: Lista->siguiente.
el siguiente al que queremos
S
eliminar: anterior->siguiente
Liberamos la memoria
= nodo->siguiente.
asignada al primer nodo, el
B que queremos eliminar.
Á Eliminamos la memoria
asociada al nodo que
S queremos eliminar.
I
C
A
s
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
Saber si una Lista está Primer Elemento de una
Vacía: Lista:

Moverse a Través de
una Lista Abierta

Último Elemento de una


Lista: Elemento Siguiente a
uno Cualquiera:

Elemento Anterior a
uno Cualquiera:

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


struct nodo {
int dato; Una lista doblemente
struct nodo enlazada es una lista
*siguiente; lineal en la que cada
struct nodo nodo tiene dos enlaces,
*anterior; uno al nodo siguiente, y
}; otro al anterior.

LISTAS DOBLEMENTE
ENLAZADAS

 
El nodo típico es el Las listas doblemente
mismo que para enlazadas no necesitan un
construir las listas, nodo especial para acceder a
salvo que tienen ellas, pueden recorrerse en
otro puntero al ambos sentidos a partir de
nodo anterior: cualquier nodo, esto es porque
  a partir de cualquier nodo,
siempre es posible alcanzar
cualquier nodo de la lista,
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
hasta que se llega a uno de los
typedef struct _nodo {
int dato;
El movimiento a través de struct _nodo *siguiente;
listas doblemente enlazadas struct _nodo *anterior;
es más sencillo, y como } tipoNodo;
veremos las operaciones de typedef tipoNodo *pNodo;
búsqueda, inserción y typedef tipoNodo *Lista;
borrado, también tienen
Declaraciones
más ventajas. de
Tipos para tipoNodo, es el
Manejar tipo para
declarar nodos,
evidentemente.

pNodo, es el tipo
para declarar
También es posible, y punteros a un
potencialmente útil, nodo.
crear listas doblemente
enlazadas y circulares. Lista, es el tipo
para declarar
listas abiertas
doblemente
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
Operaciones Básicas con Listas Doblemente
Enlazadas

AñADIR ELEMENTO EN
UNA LISTA DOBLEMENTE
ENLAZADA VACíA:

Partiremos de que ya
tenemos el nodo a
insertar y, por supuesto
un puntero que apunte a
él, además el puntero
INSERTAR UN ELEMENTO EN que define la lista, que
LA PRIMERA POSICIóN DE
LA LISTA

lista apunta a
nodo.
lista->siguiente y
lista->anterior
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
apunten a null.
O El proceso es el
P siguiente:
E nodo->siguiente
R debe apuntar a
A Lista.
C nodo->anterior
apuntará a Lista-
I
>anterior.
O Lista->anterior debe
N nodo->siguiente debe
E apuntar a Lista-
S >siguiente (NULL).
Lista->siguiente debe
B apuntar a nodo. INSERTAR UN ELEMENTO EN LA
Á nodo->anterior ÚLTIMA POSICIóN DE LA LISTA
apuntará a Lista.
S
I
Igual que en el caso
C anterior, partiremos de
A una lista no vacía, y de
s nuevo para simplificar,
que Lista está apuntando
al último
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA elemento de la
Pero parece que la
aplicación más sencilla de
listas doblemente
En muchos aspectos, una
enlazadas es hacer arrays
lista doblemente
dinámicos ordenados,
enlazada se comporta
donde buscar un elemento
como dos listas abiertas
concreto a partir de que comparten los datos.
cualquier otro es más

Buscar o Localizar un
Elemento de una Lista
Doblemente Enlazada
Por supuesto, se
pueden hacer listas
doblemente enlazadas Tenemos la ventaja de
no ordenadas, existen que podemos avanzar
cientos de problemas y retroceder desde
que pueden requerir de cualquier nodo, sin
necesidad de volver a
uno de los extremos

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Analizaremos cuatro casos
diferentes:
Eliminar el Único Nodo
en una Lista
Doblemente Enlazada

Eliminar un Elemento de una lista


Doblemente Enlazada
Eliminar el Último
Nodo de una Lista
Doblemente Eliminar el Primer Nodo
Enlazada de una Lista
Doblemente Enlazada

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Eliminar un Nodo de una Eliminar un Nodo Intermedio de
Lista Doblemente Enlazada una Lista Doblemente Enlazada

De nuevo tenemos los


De nuevo tenemos los dos casos posibles, que
dos casos posibles, el nodo a borrar esté
que el nodo a borrar apuntado por Lista o que
esté apuntado por no. Si lo está,
Lista o que no. Si lo simplemente hacemos
está, simplemente que Lista sea Lista-
hacemos que Lista sea >anterior o Lista-
Lista->anterior, si no
es NULL o Lista-

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


LISTAS
CIRCULAR
ES

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


Declaraciones de Tipos para Manejar
Listas
Circulares en C
Lista es el tipo para declarar
listas, tanto abiertas como
circulares. En el caso de las Los tipos que
circulares, apuntará a un nodo definiremos
cualquiera de la lista. normalmente para
manejar listas
cerradas son los
mismos que para

typedef struct _nodo


A pesar de que las listas
{
circulares simplifiquen las
int dato; struct
operaciones sobre ellas, también
_nodo *siguiente;
introducen algunas
} tipoNodo; typedef
complicaciones. Por ejemplo, en
tipoNodo
un proceso de búsqueda, no es
*pNodo;typedef
tan sencillo dar por terminada la
búsqueda cuando el elemento
buscadoAUTORAS:
no existe.
JASNEYKA GARCIA ESPAÑA SILVIA
OPERACIONES
BáSICAS CON LISTAS
CIRCULARES A todos los efectos, las listas
circulares son como las listas
abiertas en cuanto a las
operaciones que se pueden
realizar sobre ellas:

Añadir o insertar elementos.


Buscar o localizar elementos.
Borrar elementos.
Moverse a través de la lista,
siguiente.

Cada una de éstas operaciones podrá


tener varios casos especiales, por
ejemplo, tendremos que tener en
cuenta cuando se inserte un nodo en
una lista vacía, o cuando se elimina el

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


OPERACIONES
BáSICAS CON LISTAS
CIRCULARES
Añadir Elemento en una Lista Circular Vacía

Partiremos de que ya
tenemos el nodo a insertar
y, por supuesto un puntero
que apunte a él, además el
Añadir Elemento en una Lista puntero que define la lista,
Circular No Vacía que valdrá NULL:

El proceso es muy
simple, bastará con
que:
lista apunta a nodo.
lista->siguiente
apunte a nodo.
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
OPERACIONES
BáSICAS CON LISTAS
CIRCULARES BUSCAR O LOCALIZAR UN
ELEMENTO DE UNA LISTA
CIRCULAR

A la hora de buscar elementos en una


lista circular sólo hay que tener una
precaución, es necesario almacenar
el puntero del nodo en que se
empezó la búsqueda, para poder
detectar el caso en que no exista el
valor que se busca. Por lo demás, la búsqueda es
igual que en el caso de las
listas abiertas, salvo que
podemos empezar en
cualquier punto de la lista.

AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA


OPERACIONES
BáSICAS CON LISTAS
CIRCULARES Eliminar un Elemento de
una Lista Circular

Esto elimina la
excepción del segundo Para ésta operación podemos
caso, ya que lista encontrar tres casos diferentes:
nunca será el nodo a Eliminar un nodo cualquiera,
eliminar, salvo que sea que no sea el apuntado por
el único nodo de la lista.
Eliminar el nodo apuntado por
lista, y que no sea el único
nodo.
En el primer caso necesitamos Eliminar el único nodo de la
localizar el nodo anterior al que
queremos borrar. Como el
principio de la lista puede ser
cualquier nodo, haremos que sea
precisamente lista quien apunte
al nodo anterior al que queremos
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
Gracias por su
atención
Gracias por su
Graciasatención
por su atención
Gracias por su atención
Gracias por su atención

Gracias por su atención


Gracias por su atención

Cuando se nos otorga la enseñanza se


debe percibir como un valioso regalo y
no como una dura tarea.
AUTORAS: JASNEYKA GARCIA ESPAÑA SILVIA
Pensamientos de Albert Einstein

También podría gustarte