Está en la página 1de 27

LISTAS ENLAZADAS

Listas simplemente enlazadas

NODO DE LISTA SIMPLE


Lista

inf apuntador

Creación de una lista simplemente enlazada agregando elementos por la derecha.

primero primero --> dato = 8


primero --> siguiente = NULL

Se agrega un nuevo elemento por la derecha, es decir;

primero

aux

aux = primero
aux = aux --> siguiente
aux --> dato = 10
aux --> siguiente = NULL

primero

6 10

PROFR. SERGIO SÁNCHEZ REBOLLO


aux

y asi se pueden ir agregando elementos a una lista simplemente enlazada. Se debe notar que
la cabecera de lista permanece fija en la parte izquierda de la lista.

aux = aux --> siguiente


aux --> dato = 10
aux --> siguiente = NULL

primero

6 10 10

aux aux

Se va a crear ahora una lista simplemente enlazada insertando elementos por la parte izquierda,
que es la forma en la que se procederá en adelante.

Creación del primer nodo de lista.

primero --> dato = 8 primero


primero --> siguiente = NULL
8

Se inserta un nuevo dato por la izquierda, es decir;

aux --> dato = 11


aux --> siguiente = primero
primero = aux
primero

11 8

PROFR. SERGIO SÁNCHEZ REBOLLO


aux

primero

11 8

aux

De forma similar, se puede ir insertando más elementos por la izquierda empleando una
variable auxiliar.

aux --> dato = 10


aux --> siguiente = primero
primero = aux

primero

10 11 8

aux

primero

10 11 8

aux

PROFR. SERGIO SÁNCHEZ REBOLLO


Y de esta forma se pueden ir insertando elementos, hasta formar una lista de un tamaño
determinado.

primero

7 10 11 8

aux

Ahora se va a insertar un elemento al final de la lista. En tal situación , se debe recorrer la lista
desde la cabecera hasta el final de la misma, empleando una variable auxiliar, esto es;

primero

7 10 11 8 11

aux r

aux = primero
aux = aux -- > siguiente

primero

7 10 11 8 11

PROFR. SERGIO SÁNCHEZ REBOLLO


aux r

Lo que se hace enseguida es agregar el elemento nuevo a la lista, es decir;

r --> dato = 11
r --> siguiente = NULL
aux --> siguiente = r

primero

7 10 11 8 11

aux r

Ahora se insertará un elemento en medio de la lista, después de un elemento dado, para ello
se buscará el elemento en la lista después del cual se quiere insertar un nuevo elemento.

primero

10 3 6 8

aux
11

PROFR. SERGIO SÁNCHEZ REBOLLO


La variable aux será la encargada de buscar ese elemento en la lista, en el esquema siguiente
aux apunta al número 3, que es el elemento después del cual se insertará el nuevo elemento.

Primero aux

10 3 6 8

aux
11

De esta forma, una vez hubicado el elemento, se procede a modificar los enlaces a fin de que el
nuevo elemento este en la lista.

r --> dato = 2
r --> siguiente = aux --> siguiente
aux --> siguiente = r

primero aux

10 3 6 8

PROFR. SERGIO SÁNCHEZ REBOLLO


r

Eliminación del último elemento de la lista.

Se recorre toda la lista desde la cabecera hasta llegar al último elemento de la lista, empleando
dos apuntadores; en este caso, en el algoritmo, el apuntador r siempre toma la dirección del
apuntador aux.

Lista r

10 3 6 8

aux aux

Ahora, r->siguiente == NULL , será el nuevo tamaño de la lista. Ya se ha eliminado el último


elemento.

Lista r

10 3 6 8

aux aux

aux = Lista

PROFR. SERGIO SÁNCHEZ REBOLLO


aux = aux --> siguiente
r --> siguiente = NULL
delete aux

Eliminación de un elemento en medio de la lista.

Se busca el elemento a eliminar, empleando dos apuntadores; la variable aux es la encargada


de identificar el elemento a eliminar, una vez identificado, se procede modificar los enlaces.

Lista

8 4

aux

Lista r aux

11 8 4 6

aux

En este caso, r --> siguiente toma la dirección a la que apunta actualmente aux, y de esa
forma se ha eliminado el elemento de interés.

PROFR. SERGIO SÁNCHEZ REBOLLO


Lista r

11 8 4 6

aux aux

Listas doblemente enlazadas.

Elemento de lista nodo

apuntador inf apuntador

Esquema general de una lista doblemente enlazada.

primero ultimo

Inserción del primer elemento de lista.

primero primero --> dato = 8

primero --> siguiente == NULL


8
primero --> anterior == NULL

ultimo ultimo = primero

PROFR. SERGIO SÁNCHEZ REBOLLO


Inserción de un segundo elemento de lista, de forma similar a la inserción del primer elemento.

aux --> dato = 8 primero

aux --> siguiente = primero

ultimo --> anterior = aux 8 4

aux --> anterior = NULL aux ultimo

primero = aux

se recorre el apuntador cabecera de la lista, y la inserción del segundo elemento queda así,
como se refleja en el código anterior.

primero primero

8 4

aux ultimo

se quiere insertar un nuevo elemento a la lista y se siguen las mismas instrucciones de


código anteriores.

primero ultimo

10 8 4

aux

primero ultimo

10 8 4

PROFR. SERGIO SÁNCHEZ REBOLLO


aux

primero ultimo

10 8 4

aux

se continua insertando elementos de lista, uno a la vez, y la lista queda así con cuatro
elementos, por ejemplo.

primero ultimo

11 10 8 4

se quiere ahora insertar un elemento en medio de la lista doble. Mediante el apuntador aux
se identifica el elemento después del cual se quiere insertar uno nuevo.

primero ultimo

11 10 8 4

aux
6

PROFR. SERGIO SÁNCHEZ REBOLLO


r

primero aux ultimo

11 10 8 4

entonces, el primer enlace que se modifica


es en el cual la dirección a donde
apunta actualmente aux, ahore se le 6
queda a r --> siguiente , es decir r --> siguiente = aux --> siguiente
r

enseguida, aux --> siguiente apunta a r, y r --> anterior apunta a aux.

primero aux ultimo

11 10 8 4

finalmente, r--> siguiente --> anterior debe apuntar al mismo r, y de esa forma el nuevo
elemento esta ahora en la lista.

PROFR. SERGIO SÁNCHEZ REBOLLO


primero aux ultimo

11 10 8 4

Eliminación de elementos en una lista doblemente enlazada.

Eliminemos ahora el último elemento de la lista: no es necesario recorrer toda la lista, es


suficiente con verificar que el elemento anterior al apuntado por ultimo no sea NULL.

Se recorre el apuntador ultimo hacia la izquierda y de esa forma se elimina el elemento


apuntado por aux.

if(aux-->anterior != NULL)

ultimo = aux --> anterior


ultimo --> siguiente = NULL

primero ultimo

11 10 8 4

aux

PROFR. SERGIO SÁNCHEZ REBOLLO


primero ultimo

11 10 8 4

aux

Eliminar el primer elemento de la lista, es similar a lo descrito anteriormente, por lo que no se


mostrará el esquema y el código correspondiente, se dejará como ejercicio particular el hacerlo.
En cambio se muestra el proceso de eliminación de un elemento en medio de la lista.

Si el elemento a eliminar es el apuntado por aux , entonces, mediante el empleo de un


apuntador r, que tomará la dirección de aux a medida que la lista se recorre y una vez que se ha
encontrado el elemento a eliminar, los apuntadores se quedan fijos como se indica en los
esquemas.

primero ultimo

11 10 8 4

primero r aux ultimo

11 10 8 4

Es decir, la dirección a la cual apunta aux --> siguiente se le queda a r, y


después aux debe apuntar a r. Esto es;

r --> siguiente = aux --> siguiente

PROFR. SERGIO SÁNCHEZ REBOLLO


aux --> siguiente --> anterior --> anterior = r

primero r ultimo

11 10 8 4

aux

primero r ultimo

11 10 8 4

aux

De esta forma el elemento señalado por aux ha quedado desagregado de la lista.

primero r ultimo

11 10 8 4

aux

LISTAS CIRCULARES DOBLEMENTE ENLAZADAS.

El esquema de una lita circular es como sigue.

Lista

PROFR. SERGIO SÁNCHEZ REBOLLO


La creación de una lista circular doblemente enlazada es de forma similar a como se crea
una lista doblemente enlazada. Se crea el primer elemento de la lista.

Lista

Lista --> dato = 8


Lista --> siguiente = Lista
Lista --> anterior = Lista

Se quiere insertar un nuevo elemento en la lista circular.

Lista

8 8

aux

Así que, aux --> siguiente apuntará a Lista --> siguiente y Lista --> siguiente apuntará a aux

Lista

8 8

PROFR. SERGIO SÁNCHEZ REBOLLO


aux

Lista

8 8

aux

aux --> anterior apuntará a Lista.

Lista

8 8

Aux

y Lista --> anterior apuntará a aux y finalmente se recorre el apuntador Lista, lo cual
señala el último elemento que entró a la estructura.

Lista

8 8

aux

De esta forma, se pueden ir insertando elementos a la lista, esto es;

Lista

11 10 8 4

PROFR. SERGIO SÁNCHEZ REBOLLO


aux

Eliminar o insertar un elemento en una lista circular, es similar a insertar o eliminar un elemento
en medio en una lista doblemente enlazada. Se sugiere revisar el procedimiento que inserta o
elimina un elemento en medio de una lista doblemente enlazada, para insertar o eliminar en una
lista circular doblemente enlazada.

// CLASE TIPO PARA CREACIÓN DE UNA EN LISTA SIMPLEMENTE ENLAZADA

# include <iostream.h>
class Nodo{
private: int dato;
Nodo * siguiente;
public: Nodo(){
dato = 0;
siguiente = NULL;

PROFR. SERGIO SÁNCHEZ REBOLLO


}
friend class Lista;
};

class Lista
private: Nodo primero; // cabecera de lista
public: Lista(){
primero = NULL; // se crea una lista vacía
}
void creaLista(int );
Nodo *Bucar(int );
void insertaEnmedio(Nodo *, int);
void insertaUltimo(int );
void eliminaUltimo();
void eliminaEnmedio(int );
void Listar();
};

CÓDIGO DE ALGUNOS MODULOS DE LA CLASE.

CREACION DE UNA LISTA

void Lista :: creaLista( int x){

Nodo aux = new Nodo;

if(primero == NULL){
primero = new Nodo;
primero -> dato = x;
primero -> siguiente = NULL;
}
else{
aux -> dato = x;

PROFR. SERGIO SÁNCHEZ REBOLLO


aux -> siguiente = primero;
primero = aux;
}
}

INSERSIÓN EN MEDIO DE LA LISTA

SE BUSCA EL ELEMENTO DESPUES DEL CUAL SE QUIERE INSERTAR Y REGRESA LA DIRECCION


DE LA POSICIÓN DE INTERES.

Nodo * Lista:: Buscar( int x){

Nodo *aux = primero;

while(aux -> dato != x && aux -> siguiente != NULL)


aux = aux -> siguiente;
return aux;
}

SE INSERTA EL NUEVO ELEMENTO EN LA POSICIÓN DESEADDA.

void Lista:: insertaEnmedio( Nodo *aux, int x){

Nodo *r= new Nodo;


r -> dato = x;
r -> siguiente = aux -> siguiente;
aux -> siguiente = r;
}

ELIMINACIÓN DE ELEMENTOS EN LISTA SIMPLEMENTE ENLAZADA

ELIMINA EL ÚLTIMO ELEMENTO DE LA LISTA.

void Lista :: eliminaUltimo(){

PROFR. SERGIO SÁNCHEZ REBOLLO


Nodo *aux = primero, *r;

while(aux -> siguiente != NULL){


r = aux;
aux = aux -> siguiente;
}
r -> siguiente = NULL;
delete aux;
}

ELIMINA UN ELEMENTO EN MEDIO DE LA LISTA.

SE BUSCA EL ELEMENTO A ELIMINAR, PARA ELLO SE EMPLEA UN APUNTADOR ADICIONAL


QUE VA TOMANDO LA DIRECCIÓN DE aux, HASTA QUE EL ELEMENTO DE INTERES ES
ENCONTRADO.

void Lista :: eliminaEnmedio(int x){

Nodo *aux = primero, *r;

while(aux -> dato != x && aux -> siguiente != NULL)


r = aux;
aux = aux -> siguiente;
}
r -> siguiente = aux -> siguiente;
delete aux;
}

CLASE TIPO PARA LA CREACION DE UNA LISTA DOBLEMENTE ENLAZADA.

PROFR. SERGIO SÁNCHEZ REBOLLO


# include <iostream.h>
class Nodo{
private: int dato;
Nodo *siguiente, *anterior;
public: Nodo(){
dato = 0;
anterior = siguiente = NULL;
}
friend class Lista;
};

class Lista
private: Nodo *primero, *ultimo; // cabeceras de lista
public: Lista(){
primero = NULL; // se crea una lista vacía
ultimo = NULL;
}
void creaLista(int );
Nodo *Bucar(int );
void insertaEnmedio(Nodo *, int);
void insertaUltimo(int );
void eliminaUltimo();
void eliminaEnmedio(int );
void Listar();
};

CREACIÓN DE UNA LISTA DOBLEMENTE ENLAZADA

void Lista :: creaLista( int x){

Nodo aux = new Nodo;

if(primero == NULL){

PROFR. SERGIO SÁNCHEZ REBOLLO


primero = new Nodo;
primero -> dato = x;
primero -> siguiente = NULL;
primero -> anterior = NULL;
ultimo = primero;
}
else{
aux -> dato = x;
aux -> siguiente = primero;
primero -> anterior = aux;
aux -> anterior = NULL;
primero = aux;

}
}

INSERSIÓN EN MEDIO DE LA LISTA

SE BUSCA EL ELEMENTO DESPUES DEL CUAL SE QUIERE INSERTAR Y EL METODO REGRESA LA


DIRECCION DE LA POSICIÓN DE INTERES.

Nodo * Lista:: Buscar( int x){

Nodo *aux = primero;

while(aux -> dato != x && aux -> siguiente != NULL)


aux = aux -> siguiente;
return aux;
}

SE INSERTA EL NUEVO ELEMENTO EN LA POSICIÓN DESEADDA.

void Lista:: insertaEnmedio( Nodo *aux, int x){

Nodo *q= new Nodo;


q -> dato = x;
q -> siguiente = aux -> siguiente;

PROFR. SERGIO SÁNCHEZ REBOLLO


aux -> siguiente = q;
q -> anterior = aux;
q -> siguiente -> anterior = r;
}

ELIMINACION DE ELEMENTOS EN LISTA DOBLEMENTE ENLAZADA.

ELIMINACION DEL ÚLTIMO ELEMENTO

void Lista :: eliminaUltimo(){

Nodo *aux = ultimo;

If(aux -> anterior != NULL){


untimo = aux -> anterior;
ultimo -> siguiente = NULL;
else{
ultimo = NULL;
primero = NULL;
}
}

La eliminación del primer elemento de la lista es reciproco; se deja como ejercicio particular
la hechura de esta función.

ELIMINACION DE UN ELEMENTO EN MEDIO DE LA LISTA.

COMO SE EXPLICÓ EN EL ESQUEMA CORRESPONDIENTE, PARA TAL PROPÓSITO SE UTILIZA UN


APUNTADOR ADICIONAL QUE VA TOMANDO LA DIRECCIÓN DEL APUNTADOR AUXILIAR, HASTA
QUE SE ENCUENTRA EL ELEMENTO DE INTERES; ENTONCES LOS APUNTADORES QUEDAN FIJOS

PROFR. SERGIO SÁNCHEZ REBOLLO


EN LA POSICIÓN ADECUADA PARA REHACER LOS ENLACES.

void Lista :: eliminaEnmedio(int x){

Nodo *aux = primero, * r;


while(aux -> dato != x && aux != NULL){
r = aux;
aux = aux -> siguiente;
}
r -> siguiente = aux -> siguiente;
aux -> siguiente -> anterior -> anterior= r;
}

CLASE TIPO PARA LA CREACION DE UNA LISTA CIRCULAR DOBLEMENTE ENLAZADA.

PROFR. SERGIO SÁNCHEZ REBOLLO


# include <iostream.h>
class Nodo{
private: int dato;
Nodo *siguiente;
public: Nodo(){
dato = 0;
siguiente = NULL;
}
friend class Listax;
};

class Listax
private: Nodo *Lista; // cabecera de lista
public: Listax(){
Lista = NULL; // se crea una lista vacía
}
void creaLista(int );
Nodo *Buscar(int );
void insertaEnlista(Nodo *, int);
void eliminaElemento(int );
void Listar();
};

CREACIÓN DE UNA LISTA CIRCULAR DOBLEMENTE ENLAZADA

void Lista :: creaLista( int x){

PROFR. SERGIO SÁNCHEZ REBOLLO


Nodo aux = new Nodo;

If(Lista == NULL){
Lista = new Nodo;
Lista -> dato = x;
Lista -> siguiente = Lista;
Lista -> anterior = Lista;
}
else{
aux -> dato = x;
aux -> siguiente = Lista -> siguiente;
Lista -> siguiente = aux;
aux -> anterior = Lista;
Lista -> anterior = aux;
Lista = aux;
}
}

LOS METODOS PARA INSERTAR O ELIMINAR UN ELEMENTO EN UNA LISTA CIRCULAR


DOBLEMENTE ENLAZADA SON SIMILARES A LOS USADOS PARA INSERTAR O ELIMINAR UN
ELEMENTO DE UNA LISTA DOBLENTE ENLAZADA, POR LO QUE SE DEJA COMO EJERCICIO
PARTICULAR LA HECHURA DE TALES METODOS.

PROFR. SERGIO SÁNCHEZ REBOLLO

También podría gustarte