Ingeniero en Informática


Programación: listas


ASSIGNATURA: Algorismes II

DATA: 10-03-1997

Para que no hubiese problemas de divisibilidad entre los caracteres y el signo del apuntador, he sustituido el caracter por el caracter ^.

Eliminar elemento

Eliminaremos un elemento que es el primero de la lista

Si top=NIL entonces "Lista vacia"

sino inicio

p:=top

top:=top^.sig

dispose(p)

fin

Si top es distinto de cero, la lista como minimo tendra un elemento.

Eliminamos el último elemento

Primero hemos de buscar el elemento ha eliminar. Para buscarlo haremos un recorrido de toda la lista. Sabremos que el elemento buscado sera el último porque tendra dirección NIL.

Si top = NIL entonces "Lista vacia"

sino inicio

p:=top

mientres (p^.sig <> nil) hacer

inicio

q:=p

p:=p^.sig

fin

dispose (p)

q^.sig:=nil

fin

Eliminar el nodo del medio

Para eliminar el nodo del medio hay que seguir los siguientes pasos:

1. Encontrar el nodo i guardar la dirección del anterior

2. Enlazar q con el sig de p

3. Eliminar p

Si lo hacemos con un puntero, los pasos son los siguientes:

1. Preguntamos si hay que eliminar ese nodo

2. Mirar si el siguiente elemento es el que se tiene que borrar

3. Como (p) tiene las dos direcciones (la del actual y la del siguiente), entonces borrara el

nodo del siguiente.

Lista lineal encabezado circular

Se supone que cada nodo tiene dos campos, puede tener más.

Este tipo de listas son circulares porque el último elemento de la lista, el campo siguiente, tiene la dirección del primer elemento de la lista. Esto genera una serie de consideraciones:

- Cada nodo de una lista circular es accesible desde cualquier otro nodo sin que se tenga

que volver acceder al principio de la lista.

- No hay un primer nodo, ni un último nodo

Estas listas circulares, generan un problema, que no sabemos cuando acaba la lista, y podemos dar vueltas indefinidamente (bucles infinitos).

Este problema se puede solucionar de dos formas: la primera es preguntar por el top y la otra solución , es utilizar un nodo centinela, que nos sirve para indicar cuando damos la vuelta. En el campo información del nodo centinela ponemos una marca que nos indica que ese es el nodo centinela. Por tanto en la lista tendremos un nodo más.

1 3 5 x

En vez de preguntar por el top, preguntaremos por el campo información.

Hay que recordar que estamos trabajando con enlaces simples de dirección, es decir, lo que une un nodo a otro es un enlace (una flecha).

Creación de una lista enlazada circular

En este algortimo no utilizaremos un nodo centinela.

Si top = NIL entonces

inicio

new (top) reservamos espacio

top^.info.='dato'

top

top^.sig:=top (*)

sino inicio

p:=top buscamos el elemento

mientras (p^.sig <> top) hacer preguntamos por el top

p:=p^.sig

fin

new(q) reservamos espacio

q^.info:='dato'

top p q

q^.sig:=top 1 2 (**)

top p q

p^.sig:=q 1 2

fin

(*) Ya tenemos la lista circular. Hemos creado el primer nodo.

(**) No importa si tenemos dos direcciones apuntando al TOP, lo importante es no

perder ninguna dirección.

Listas doblemente encadenada

Significa que tiene dos campos de dirección

TYPE nodo RECORD

Ant: ^nodo

info: integer

sig: ^nodo

END

Representación grafica:

ANT INFO SIG

ANT: Se guarda la dirección de memoria del elemento que le precede en la lista.

SIG: Guarda la dirección de memoria que le sucede en la lista.

INFO: Es la información del nodo.

Como la lista no es circular, habra un elemento con un NIL.

Como en el anterior (en las listas de simple enlace), tendremos una variable donde nos dice donde empieza la lista (no hay que perder esa dirección).

1 2 3

Convenientes de la lista doblemente enlazada: Se puede mover en dos direcciones. Es decir cada nodo puede acceder a su sucesor y a su predecesor.

Inconvenientes de la lista doblemente enlazada: Se gasta más memoria, ya que creamos un campo mas.

Propiedades:

1. P+.SIG+.ANT= P

P+.ANT+.SIG =P

Con las listas de doble enlace, p se puede referenciar de dos formas

2. Se necesitan dos punteros, p y q, para acceder a los dos extremos de la listas

3. Las operaciones de cerca, inserción y eliminación son más eficientes

4. Necesitamos un espacio adicional para almacenar otro puntero.

5. Es importante saber que no se puede utilizar una lista simple encadenada, junto a una

lista doblemente encadenada. Esto esta totalmente prohibido.




Descargar
Enviado por:Xavi Royo Melero, Xavier Mondragon Fuentes
Idioma: castellano
País: España

Palabras clave:
Te va a interesar