You are on page 1of 43

UNIDAD IV

LISTAS

INTRODUCCION
Los arreglos, pilas y colas son estructura de datos estticas, porque durante el tiempo de compilacin se asigna espacio en la memoria, permaneciendo inalterable a lo largo de la ejecucin del programa. En esta unidad veremos estructuras de datos dinmicas. Estos se generan a partir de un elemento conocido como Puntero o Referencia. Por lo tanto hay que distinguir la variable que apunta, la variable

MANEJANDO PUNTEROS
Se usar la notacin: P = ^D Nos indica que P es un puntero al tipo de dato D Se usar Crea(P), para indicar asignacin en memoria. Se usar Quita (P), para liberar el espacio en memoria dinamicamente. La principal ventaja es que se puede asignar o liberar espacio en memoria en tiempo de ejecucin cuando se requiera. Solucionando el problema de Cul es el espacio optimo?. Se usar la palabra NILL para indicar un

Variables P = ^Cadena
una cadena}

Ejemplo
{declarando un puntero a

Nombre = cadena {varible estandart } Inicio Crea(P) {asignando en memoria} P= ^nombre {enlace a la variable} Imprimir P^ {Despliega el contenido a puntado} Imprimir P {despliega la direccin de memoria} QUITA(P) {libera el espacio en memoria} Fin

Concepto de Lista
Coleccin de elementos llamados generalmente nodos. El orden de los nodos se establece mediante punteros, es decir referencias o direcciones a otrosUN NODO ESTRUCTURA DE nodos.
INFORMACION LIGA Enlace a oto nodo de la Lista, si fuera el ultimo Elemento su valor seria NILL o NULL

Dato almacenado en la lista Al relacionarse con punteros los nodos, no es necesario Almacenarlos en forma continua.

Ejemplo de lista, que almacena apellidos


GARCIA PEREZ LOPEZ SANT OS nill

Operaciones con Listas Recorrido de la lista Insercin de un elemento Borrado de un elemento

CREAINICIO(P) 1. CREA(P) 2. LEER P^.INFORMACION 3.- P^.LIGA = NILL 4.- REPETIR CREAR(Q) LEER Q^.INFORMACION Q^.LIGA = P P=Q 5.- HASTA QUE NO H AY INFORMACION

Algoritmo para crear una lista

P GARCIA

INSERCION INVERSA
P
nill Q PEREZ P GARCIA nill b) Al insertar el segundo nodo PEREZ P LOPEZ PEREZ GARCIA nill

a) Luego de insertar El primer nodo Q

c) Luego de insertar LOPEZ P Q

SANTOS

LOPEZ

PEREZ

GARCIA nill

d) Al insertar el ltimo nodo

lneas discontinuas nos indicaran los cambios que se realizan

CREAFINAL(P) 1. CREA(P) 2. LEER P^.INFORMACION 3.- P^.LIGA = NILL Y T= P 4.- REPETIR CREAR(Q) LEER Q^.INFORMACION Q^.LIGA = NILL T^.LIGA=Q T= Q 5.- HASTA QUE NO H AY INFORMACION

Algoritmo para crear una lista en forma correcta

P=T GARCIA

INSERCION CORRECTA
P=T
nill T GARCIA nill PEREZ

nill

a) Luego de insertar El primer nodo T

b) Al insertar el segundo nodo PEREZ T PEREZ nill T LOPEZ nill T SANTOS nill nill Q Q

GARCIA

c) Luego de insertar LOPEZ

GARCIA

PEREZ

LOPEZ

d) Luego de insertar el ltimo elemento

lneas discontinuas nos indicaran los cambios que se realizan

Consiste en visitar cada uno de los nodos que forman parte de la lista, la visita se puede definir como una operacin simple, como puede ser una impresin, actualizacin, etc. 1. 1. Q=P 2. REPETIR MIENTRAS Q<> NILL 3. ESCRIBIR Q^.INFORMACION 4. Q= Q^.LIGA 5. FIN_CICLO

RECORRIDO DE UNA LISTA

Algoritmo para el recorrido

INSERCION DE UN ELEMENTO Consiste en agregar un nuevo nodo a las lista, se partir de la suposicin que la lista ya existe (omitiendo la lista vaca) Se presenta de las siguientes formas
1. Insertar un nodo al inicio de la lista 2. Insertar un nodo al final de la

1. 2. 3. 4.

1.Insertar un nodo al inicio de la lista


CREAR(Q) Q^.INFORMACION=DATO Q^.LIGA= P P=Q

Ejemplo grfico.
P Q
DATO nill

eas discontinuas nos indicaran los cambios que se realizan

1.Insertar un nodo al final de la lista


1. 2. 3. 4. 5. 6. T=P Repetir mientras T^.LIGA <> NILL {RECORRIDO HASTA LLEGAR AL FINAL DE LA
LISTA}

T=T^.LIGA FIN_CICLO CREAR(Q) Q^.INFORMACION=DATO, Q^LIGA=NILL, T^.LIGA=Q P

Ejemplo grfico.
T

Q
DATO nill

nil l eas discontinuas nos indicaran los cambios que se realizan

3. Inserta un nodo antes de un dato 1. Q=P ,BAND=TRUE como referencia


2.

REPETIR MIENTRAS (Q^.INFORMACION <> REF) Y (BAND= TRUE)

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

SI Q^.LIGA<> NILL ENTONCES T=Q, Q=Q^.LIGA SI_NO BAND= FALSE FIN_CONDICIONAL FIN_CICLO SI BAND= TRUE ENTONCES CREAR(X) ; X^.INFORMACION=DATO SI P=Q ENTONCES X^.LIGA=P, P=X SI_NO T^.LIGA=X y X^.LIGA=Q FIN_CONDICIONAL FIN_CONDICIONAL

DATO TOMADO COMO REFERENCIA

Q REF nill DATO

INSERTAR EL NUEVO NODO ANTES DE LA REFERENCIA

neas discontinuas nos indicaran los cambios que se realizan

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

Insertar un nodo despus de un dato como referencia Q=P y BAND=TRUE


REPETIR MIENTRAS (Q^.INFORMACION<> REF) Y (BAND = TRUE) SI Q^.LIGA <> NILL ENTONCES Q= Q^.LIGA SI_NO BAND= FALSE FIN_CONDICIONAL FIN_DEL_CICLO SI BAND= TRUE ENTONCES CREA(T) T^.INFORMACION =DATO T^.LIGA = Q^.LIGA Q^.LIGA=T FINCONDICIONAL

DATO TOMADO COMO REFERENCIA

REF nill DATO T

INSERTAR EL NUEVO NODO DESPUES DE LA REFERENCIA

neas discontinuas nos indicaran los cambios que se realizan

BORRADO DE UN ELEMENTO
Consiste en quitar un nodo de la lista, redefiniendo las ligas correspondientes. Se puede presentar cuatro casos en esta operacin: 1. Eliminar el primer nodo 2. Eliminar el ltimo nodo 3. Eliminar un nodo con informacin X 4. Eliminar el nodo anterior/posterior al nodo con informacin X

1. 2. 3. 4. 5. 6. 7.

Eliminar el primer nodo

Q=P Si Q^.liga <>nill {se verifica si la lista tiene un solo nodo} entonces P=Q^.LIGA {se redefine el puntero al inicio} SI_NO P=NILL QUITA(Q)
P P

nill

eas discontinuas nos indicaran los cambios que se realizan

Eliminar el ltimo nodo


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. SI P^.LIGA=NILL ENTONCES QUITA(P) P=NILL SI_NO Q=P REPETIR MIENTRAS Q^.LIGA<>NILL T=Q y Q=Q^.LIGA FIN_CICLO T^.LIGA=NILL QUITA(Q) FINCONDICIONAL P T Q

nill

eas discontinuas nos indicaran los cambios que se realizan

nill

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

ELIMINAR UN NODO CON INFORMACION X Q=P y BAND=TRUE


REPETIR MIENTRAS (Q^.INFORMACION <>X) Y (BAND=TRUE) SI Q^.LIGA <> NILL ENTONCES T=Q y Q=Q^.LIGA SI_NO BAND= FALSE FIN_CONDICIONAL FIN_CICLO SI BAND = FALSO ENTONCES ESCRIBIR ELEMENTO NO ENCONTRADO SI_NO SI P=Q ENTONCES P=Q^.LIGA SI_NO T^.LIGA = Q^.LIGA FIN_CONDICIONAL QUITA(Q) FIN_CONDICIONAL

REPRESENTACIN GRAFICA DE LA ELIMINACION

Q
X

NILL

ELIMINAR EL NODO ANTERIOR AL NODO CON INFORMACION X


1.SI P^.INFORMACION =X 2. ENTONCES 3. ESCRIBIR NO HAY NODO QUE PRECEDA A X 4. SI_NO 5. Q=P, T=P y BAND =FALSO 6. REPETIR MIENTRAS(Q^.INFORMACION <> X) y (BAND= FALSO) 7. SI Q^.LIGA <>NIL 8. ENTONCES 9. R=T, T=Q y Q=Q^.LIGA 10. SI_NO 11. BAND= TRUE 12. FIN_CONDICIONAL 13. FIN_CICLO 14.SI BAND= TRUE 15. ENTONCES 16.ESCRIBIR EL ELEMENTO NO FUE ENCONTRADO 17. SI_NO 18. SI P^.LIGA =Q 19. ENTONCES QUITA(P) y P=Q 20. SI_NO 21. R^.LIGA =Q 22. QUITA(T) 23. FIN_CONDICIONAL 24. FIN_CONDICIONAL 25.FIN_CONDICIONAL

ELIMINAR EL NODO POSTERIOR AL NODO CON INFORMACION X


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. SI P^.INFORMACION =X Y P^LIGA= NILL ENTONCES ESCRIBIR NO HAY NODO POSTERIOR QUE PRECEDA A X SI_NO Q=P, T=P y BAND =FALSO REPETIR MIENTRAS(Q^.INFORMACION <> X) y (BAND= FALSO) SI Q^.LIGA <>NIL ENTONCES R=T, T=Q y Q=Q^.LIGA SI_NO BAND= TRUE FIN_CONDICIONAL FIN_CICLO SI BAND= TRUE ENTONCES ESCRIBIR EL ELEMENTO NO FUE ENCONTRADO SI_NO SI P^.LIGA =Q ENTONCES QUITA(P) y P=Q SI_NO R^.LIGA =Q QUITA(T) FIN_CONDICIONAL FIN_CONDICIONAL FIN_CONDICIONAL

Q
X

NILL

ELIMINAR EL NODO ANTERIOR AL NODO CON INFORMACION X

BUSQUEDA DE UN ELEMENTOEN LISTA DESORDENADA 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Q=P y BAND= TRUE REPETIR MIENTRAS (Q^.INFORMACION <> X) y (BAND = TRUE) SI Q^.LIGA <> NILL ENTONCES Q=Q^.LIGA SI_NO BAND= FALSO FIN_CONDICIONAL FIN_CICLO SI BAND= FALSO ENTONCES ESCRIBIR ELEMENTO NO FUE ENCONTRADO SI_NO ESCRIBIR EL ELEMENTO ESTA EN LA LISTA FIN_CONDICIONAL

BUSQUEDA DE UN ELEMENTO EN LISTA ORDENADA 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Q=P y BAND= TRUE REPETIR MIENTRAS (Q^.INFORMACION < X) y (BAND = TRUE) SI Q^.LIGA <> NILL ENTONCES Q=Q^.LIGA SI_NO BAND= FALSO FIN_CONDICIONAL FIN_CICLO SI Q^.LIGA =X ENTONCES ESCRIBIR EL ELEMENTO ESTA EN LA LISTA SI_NO ESCRIBIR EL ELEMENTO NO FUE ENCONTRADO FIN_CONDICIONAL

LISTAS CIRCULARES
Tienen las caractersticas de que el ltimo nodo apunta al primero
P

GARCIA

PEREZ

LOPEZ

SANT OS

Al implementar el recorrido en listas circulares es necesario definir un NODO CABECERA para no caer en una operacin cclica. Este contendr

GARCIA

PEREZ

LOPEZ

SANT OS

NODO CABECERA CON INFORMACION ADICIONAL INDICA EL INCIO DE LA LISTA

LISTAS DOBLEMENTE LIGADAS Es una coleccin de nodos en las


LIGAIZQ INFORMACION LIGADER

cuales cada nodo tiene la siguiente estructura.

EJEMPLO
GARCIA PEREZ LOPEZ SANTOS

NILL

NILL

1. 2. 3. 4. 5. 6.

INSERTAR AL INICIO suposicion de la lista ya CREA(Q) creada Q^.INFOMACION = DATO


Q^.LIGADER =P P^.LIGAIZQ = Q Q^.LIGAIZQ =NILL P= Q
P P

EJEMPLO

DATO NILL Q NILL NILL

1. 2. 3. 4. 5. 6.

CREA(Q) Q^.INFOMACION = DATO F^.LIGADER =Q Q^.LIGAIZQ = F Q^.LIGADER =NILL F= Q


P

INSERTAR AL FINAL

EJEMPLO

DATO NILL NILL Q NILL

INSERTAR UN NODO ANTES/DEPUES QUE OTRO


Q=P BAND= FALSE REPETIR MIENTRAS (Q^.INFORMACION<>REF) y (BAND= FALSE) SI Q^.LIGADER <> NILL ENTONCES Q=Q^.LIDADER SI_NO BAND = TRUE FIN_CONDICIONAL FIN_CICLO SI BAND = TRUE ENTONCES ESCRIBIR EL ELEMENTO NO FUE ENCONTRADO SI_NO CREAR(X) X^.INFORMACION = DATO, X^.LIGADER= Q, T= Q^.LIGAIZQ Q^.LIGAIZQ=X y X^.LIGAIZQ=T SI P=Q ENTONCES P=X SI_NO T^.LIGADER=X FIN_CONDICIONAL FIN_CONDICIONAL

EJEMPLO
P T Q F

REF NILL Q DATO X NILL

1. 2. 3. 4. 5. 6. 7. 8.

ELIMINAR EL PRIMER ELEMENTO

Q=P SI Q^.LIGADER<>NILL ENTONCES P=Q^.LIGDER y P^.LIGAIZQ=NILL SI_NO P=NILL y F=NILL FIN_CONDICIONAL QUITA(Q)
Q P P F

NILL

NILL NILL

ELIMINAR EL ULTIMO NODO


Q=F SI Q^.LIGAIZQ<>NILL ENTONCES F=Q^.LIGIZQ y F^.LIGADER=NILL SI_NO F=NILL y P=NILL FIN_CONDICIONAL QUITA(Q)
F Q F

NILL NILL

NILL

ELIMINA UN NODO CON INFORMACION X


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Q=P y BAND= FALSO REPETIR MIENTRAS (Q^.INFORMACION <> X) y (BAND= FALSO) SI Q^.LIGADER <>NILL ENTONCES Q=Q^.LIGADER SI_NO BAND= TRUE FIN_CONDICIONAL {PASO 3} FIN_CICLO {PASO 2} SI BAND = VERDADERO ENTONCES ESCRIBIR EL ELEMENTO NO FUE ENCONTRADO SI_NO SI (Q=P) y (Q=F) ENTONCES P=NILL y F=NILL SI_NO SI Q=P {ES EL PRIMER NODO} ENTONCES P=Q^.LIGADER y P^.LIGAIZQ=NILL SI_NO SI Q=F {ES EL ULTIMO NODO} ENTONCES F=Q^.LIGAIZQ y F^.LIGADER=NILL SI_NO T= Q^.LIGAIZQ R=Q^.LIGADER, T^.LIGADER=R y R^.LIGAIZQ=T FIN_CONDICIONAL {PASO 16} FIN_CONDICIONAL {PASO 13} FIN_CONDICIONAL {PASO 11} QUITA(Q) FIN_CONDICIONAL {PASO8}

X NILL P A) CUANDO EL NODO ES EL PRIMERO NILL NILL Q F F

X NILL NILL B) CUANDO EL NODO ES EL ULTIMO P T Q R NILL

X NILL NILL
C) CUANDO EL NODO ES INTERMEDIO

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.

ELIMINAR UN NODO ANTERIOR/POSTERIOR CON INFORMACION X


Q=P y BAND=FALSO REPETIR MIENTRAS (Q^.INFORMACION <>X) y (BAND= FALSO) SI Q^.LIGADER<> NILL ENTONCES Q=Q^.LIGADER SI_NO BAND= TRUE FIN_CONDICIONAL FIN_CICLO SI BAND= TRUE ENTONCES E SCRIBIR EL ELEMENTO NO FUE ENCONTRADO SI_NO SI P=Q {ES EL PRIMER NODO} ENTONCES ESCRIBIR NO EXISTE NODO ANTERIOR SI_NO SI P=Q^.LIGAIZQ ENTONCES T=P, P=Q P^.LIGAIZQ =NILL SI_NO T=Q^.LIGAIZQ, R=T^.LIGAIZQ R^.LIGADER =Q y Q^.LIGAIZQ = R FIN_CONDICIONAL {PASO 18} QUITA(T) FIN_CONDICIONAL {PASO 14} FIN_CONDICIONAL {PASO 10}

X NILL NILL

LISTAS DOBLEMENTE LIGADAS CIRCULARES


P F

LISTAS DOBLEMENTE LIGADAS CIRCULARES CON NODO CABECERA


P F

APLICACIONES DE LAS LISTAS


Las ms conocidas son las siguiente 1. Representacin de polinomios 2. Resolucin de colisiones HASH

P ( X ) = 3 x + 0. 5 x + 6 X 4
4 3

3 4

0.5 3

6 1

-4 0 nill

Representacin de polinomios

You might also like