Você está na página 1de 40

UNIDAD 12: Listas Enlazadas

Lista enlazada

INICIO
LISTA

Bloque 1

Estructura de datos lineal, formada por bloques de informacin,


con un formato comn, enlazados entre s mediante punteros.

Bloque 2

Bloque 3

Bloque 4

FIN

Caractersticas
Caractersticas de
delistas
listasenlazadas
enlazadas
Los elementos se distribuyen de forma dispersa por la memoria:
Los bloques de informacin no ocupan posiciones consecutivas en la memoria. El
orden de la lista la establecen los enlaces entre bloques de informacin.
Acceso a los elementos aleatorio:
Puede extraerse informacin de cualquier elemento o insertar un bloque en cualquier
posicin.
Acceso a los elementos no destructivo:
Al contrario que en colas y pilas, la extraccin de un bloque no implica su eliminacin.
El tamao de la lista puede modificarse de forma dinmica:
Al contrario que en colas y pilas, no hay un nmero mximo de elementos de la lista
(salvo limitaciones de la capacidad de almacenamiento de la mquina)

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Cada elemento contiene un enlace con el siguiente elemento de la lista.
Conocida la posicin de un elemento, podemos recorrer la lista hacia delante
No es posible recorrer la lista hacia atrs.

INICIO
LISTA

Bloque 1

Bloque 2

Bloque 3

Listas
Listassimplemente
simplementeenlazadas
enlazadasen
enCC
struct direc {
char nombre[40];
char calle[40];
char ciudad[20];
int codigo;
struct direc * sig;
} info;

Informacin del Elemento


Enlace con el siguiente elemento

Bloque 4

NULL

Por convenio, el fin de


lista se indica como
NULL

Puntero a la
propia estructura

Cada elemento requiere una reserva dinmica de memoria al ser creado (liberar
memoria al ser eliminado).
La gestin de la lista se hace con funciones apropiadas para aadir, insertar, borrar,
buscar elementos, etc.

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Construccin
Construccinde
deuna
unaLista
Listasimplemente
simplementeenlazada
enlazadaen
enCC

Dos Formas
Lista
Ordenada

Lista
Desordenada
No hay orden especfico para los
elementos.
La lista se construye aadiendo cada
nuevo elemento al final de la lista
existente.
Si no existe lista, el nuevo elemento
pasa a ser el primero y nico de la lista.

raiz

Elto 1

Elto 2

NULL

Elto 3

Los elementos se aaden para que la


lista final tenga un orden especfico.
Hay que buscar el punto de insercin del
elemento segn el orden establecido.
La insercin puede ser al principio, en
medio o al final.
Si no existe lista, el nuevo elemento
pasa a ser el primero y nico de la lista.

raiz

Elto 1

Elto 2

Elto 3

NULL

nuevo elemento
INSERCIN

nuevo elemento
AL FINAL

raiz

raiz
Elto 1

Elto 2

Elto 3

nuevo

NULL

Elto 1

Elto 2

nuevo

Elto 3

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * almac_fin( struct direc *top, struct direc * nuevo)
{
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL) /* si no existe lista la crea */
return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve la cabeza */
}

top

Elto. 1

Elto. 2

nuevo

Elto. 3

E. nuevo

NULL

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * almac_fin( struct direc *top, struct direc * nuevo)
{
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL) /* si no existe lista la crea */
return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve la cabeza */
}
Recibe:

-Puntero al comienzo de la lista top


-Puntero al nuevo elemento a insertar nuevo
top

Elto. 1

Elto. 2

Elto. 3

NULL

(Se debe haber reservado memoria dinmicamente


antes de llamar a la funcin)
nuevo

E. nuevo

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * almac_fin( struct direc *top, struct direc * nuevo)
{
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL) /* si no existe lista la crea */
return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve
la cabeza */
Devuelve:
}

-Puntero al comienzo de la lista

top

(En este caso la cabecera de la lista slo vara al


Elto. 1
Elto. 2elemento) Elto. 3
insertar el primer
NULL

nuevo

E. nuevo

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * almac_fin( struct direc *top, struct direc * nuevo)
{
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL) /* si no existe lista la crea */
return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza
el nuevode
elemento
al final
*/ la lista no
Si el principio
la lista es
NULL,
return top; /* devuelve la cabeza */
existe y la creamos: Su primer elemento es el
}

que le pasamos, nuevo, y es tambin la nueva


cabecera de la lista.
nuevo

top

NULL

La lista no existe

top

E. nuevo

NULL

El nuevo Elto es el primero y


nico de la lista

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

Si el principio de la lista no es NULL, la lista ya


tiene al menos un elemento.
Recorremos
la lista
hasta
encontrar el ltimo
struct direc * almac_fin( struct direc
*top, struct
direc
* nuevo)
elemento (Al salir del while, p apunta al ltimo
{
struct direc * p = top; /* punteroelemento)
que recorrer la lista hasta el final */
1.- Lista Desordenada

if (top = = NULL) /* si no existe lista la crea */


return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve la cabeza */
}

top

Elto. 1

Elto. 2

Elto. 3

NULL

p
nuevo

E. nuevo

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

Alcanzado el final de la lista, slo queda


enlazar el nuevo elemento a continuacn de
ste. *top, struct direc * nuevo)
struct direc * almac_fin( struct direc
(El siguiente elemento al ltimo (p->sig) deber
{
a nuevo)
struct direc * p = top; /* punteroapuntar
que recorrer
la lista hasta el final */
1.- Lista Desordenada

if (top = = NULL) /* si no existe lista la crea */


return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve la cabeza */
}

top

Elto. 1

Elto. 2

Elto. 3

NULL

p
nuevo

E. nuevo

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * almac_fin( struct direc *top, struct direc * nuevo)
Para finalizar devolvemos la cabecera de la lista
{
(Haya sta cambiado o no)
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL) /* si no existe lista la crea */
return nuevo ;
while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */
{ p = p -> sig ; }
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
return top; /* devuelve la cabeza */
}

top

Elto. 1

Elto. 2

Elto. 3

E. nuevo

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


Estructura
para
ejemplo
de
insertar
Estructura
base
parael
ejemplo
delala*funcin
funcin
insertar
struct
ciclistabase
*insertar
(elstruct
ciclista
top, struct
ciclista * nuevo)
{
struct
ciclista{
struct
ciclista{
struct
ciclista
*actual = top; /* puntero para moverse por la lista */
int
num;
del
ciclista
int*anterior
num;/*/*nmero
nmero
del
ciclista*/al
*/ elemento anterior al "actual" */
struct ciclista
= NULL;
/*puntero
char
/*/*nombre
char
nombre[80];
nombre
delciclista
ciclista*/*/
/* Bsqueda
del nombre[80];
punto
de insercin
*/ del
int
tiempo
en
*/*/ -> tiempo) )
inttiempo;
tiempo;
tiempo
enla
laclasificacin
clasificacin
while ( (actual
!=
NULL)/*/*&&
(actual
->
tiempo
<= nuevo
{
structciclista
ciclista**sig;
sig;/*/*puntero
punteroaasiguiente
siguiente*/*/
anterior = struct
actual;
};}; -> sig;
actual = actual
}
Elobjetivo
objetivo*/es
esdisear
disearlalafuncin
funcininsertar
insertarpara
paracrear
crearlistas
listas
/* El
insercin
ordenadas
de
elementos
struct
ciclista.
ordenadas
elementos
structenciclista.
if (anterior
!= de
NULL)
/* insercin
medio o final */
El
criterio
de
ordenacin
ser
de
menor
El criterio
de =
ordenacin
ser de menoraamayor
mayortiempo
tiempo
anterior
-> sig
nuevo;
de
clasificacin.
de/*clasificacin.
else
insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig; Recibe:
-Puntero al comienzo de la lista top
}
/* Insercin */
-Puntero al nuevo elemento a insertar nuevo
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo; (Se debe haber reservado memoria dinmicamente
else /* insercin al principio
dede
la llamar
lista */a la funcin)
antes
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig;
Devuelve:
}
-Puntero al comienzo de la lista
/* Insercin */
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
(En este caso la cabecera de la lista vara si el
else /* insercin al nuevo
principio
de la lista
elemento
tiene*/un tiempo de clasificacin
top = nuevo;
inferior a todos los dems)
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
Recorreremos la lista con dos punteros:
anterior = actual;
actual = actual -> sig; -actual que apunta al elemento que queremos
}
examinar en ese momento
/* Insercin */
- anterior, que apunta al elemento precedente a
if (anterior != NULL) /* insercin
actual en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio
de la Elto
lista
*/ Elto 2
1
Elto 3
Elto 4
Elto 5
top
NULL
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
anterior actual
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig;
}
/* Insercin */
la lista
if (anterior != NULL) /* insercinRecorremos
en medio o final
*/ desde el principio
mientras:
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
1.- No lleguemos al final
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig;
Y
}
2.- El elemento actual tenga un tiempo de clasificacin
/* Insercin */
inferior al del nuevo elemento.
if (anterior != NULL) /* insercin en medio o final */
Si no es as, el nuevo elemento debe insertarse entre los
anterior -> sig = nuevo;
elementos de la lista apuntados por anterior y actual.
else /* insercin al principio de la lista */
Elto 1
Elto 2
Elto 3
Elto 4
Elto 5
top
top = nuevo;
NULL
nuevo -> sig = actual;
actual
return top; /* devuelve la cabecera
lista */
anterior de la nuevo
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada

Una vez localizado el punto de insercin, hay que


distinguir dos casos:

struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)


{
1.- Que el punto de insercin sea en medio o al final
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL;
al elemento
*/
Elto 1
Elto 2
Eltoanterior
3
Elto 4al "actual"
top /*puntero
NULL
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo
-> tiempo)
actual )
nuevo
anterior
{
anterior = actual;
actual = actual -> sig;
}
/* Insercin */
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada

En cuyo caso Reconectamos como


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
Elto 1
Elto 2
Elto 3
Elto 4
top
NULL
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al
"actual" */
actual
anterior
nuevo
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
anterior -> sig = nuevo
{
anterior = actual;
actual = actual -> sig;
}
/* Insercin */
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
noinsercin */
/* Bsqueda del puntoSide
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
2.- La insercin es al principio de la lista.
{
anterior = actual;
actual = actual -> sig;
}
/* Insercin */
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada

En cuyo caso reconectamos como

struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)


NULL
Elto 1
Elto 2
Elto 3
Elto 4
top
NULL
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
nuevo
struct ciclista *anterior = NULL; /*puntero
al elemento anterior
"actual" */
top =alnuevo
/* Bsqueda del punto de anterior
insercin */
actual
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig;
}
/* Insercin */
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada

En cualquiera de los dos casos:

struct ciclista *insertar ( struct ciclista * top, struct


ciclista
* nuevo)
nuevo
-> sig
= actual
{
Caso 1:
struct ciclista *actual = top; /* puntero para moverse por la lista */
Elto 1
Elto 2
Elto 3
Elto 4
top /*puntero
NULL
struct ciclista *anterior = NULL;
al elemento
anterior
al
"actual"
*/
/* Bsqueda del punto de insercin */
actual
while ( (actual != NULL) && (actual ->
tiempo <= nuevo
-> tiempo)
)
anterior
nuevo
{
Caso 2:
anterior = actual;
actual = actual -> sig;
NULL
Elto 1
Elto 2
Elto 3
Elto 4
top
}
/* Insercin */
nuevo
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
anterior
actual
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

NULL

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo)
{
struct ciclista *actual = top; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) )
{
anterior = actual;
actual = actual -> sig;
Para finalizar devolvemos la
}
cabecera de la lista (Haya sta
/* Insercin */
cambiado o no)
if (anterior != NULL) /* insercin en medio o final */
anterior -> sig = nuevo;
else /* insercin al principio de la lista */
top = nuevo;
nuevo -> sig = actual;
return top; /* devuelve la cabecera de la lista */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
deRecuperacin
Recuperacinde
deelementos
elementosde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Recorrer la lista completa


void listado (struct ciclista * top)
{
struct ciclista *p = top; /* Puntero para recorrer la lista */
while (p) { /* Bucle que recorre la lista */
printf("%s %d\n", p -> nombre, p -> tiempo);
p = p -> sig;
}
}

Funcin que recorre la lista al


completo desde el primer al
ltimo elemento, mostrando
los miembros nombre y
tiempo.

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
deRecuperacin
Recuperacinde
deelementos
elementosde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

1.- Recorrer la lista completa


void listado (struct ciclista * top)
{
struct ciclista *p = top; /* Puntero para recorrer la lista */
while (p) { /* Bucle que recorre la lista */
printf("%s %d\n", p -> nombre, p -> tiempo);
p = p -> sig;
}
}

Esta sentencia pude sustituirse en el caso


general por cualquier otra secuencia en funcin
de los se desee hacer con los datos de la lista.

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
Funcionesde
deRecuperacin
Recuperacinde
deelementos
elementosde
deListas
Listassimplemente
simplementeenlazadas
enlazadas

2.- Bsqueda de un elemento concreto


struct ciclista * busca (struct ciclista *top, char *c)
{
struct ciclista *p = top; /* Puntero para recorrer la lista */
while (p)
{
if ( !strcmp(c, p -> nombre) ) return p; /* devuelve el puntero*/
p = p -> sig;
}
return NULL; /* no encontrado */
}
Funcin que busca el elemento cuyo miembro
nombre coincida con el que se le pasa como
argumento (char *c).
Devuelve un puntero al elemento encontrado, o
NULL en caso de no encantarlo.

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
Funcin que borrareturn
un elemento
aux;} de una lista enlazada.
Para localizar
le pasa el
else /*elelelemento,
elemento se
a eliminar
vamiembro
en medio o al final */
nombre del elemento
{anta->eliminar
sig = p (char
-> sig;*c), y la
cabecera de la lista
(top)
free(p);
return top;}
Devuelve} un puntero a la nueva cabecera de la lista.
ant = p; /* avance */
p = p -> sig;
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
free(p);
return top;}
}
ant = p; /* avance */
Se definen punteros para recorrer la
p = p -> sig;
lista (similar a la funcin insertar)
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
Recorremos
else /* el elemento a eliminar va en medio o al final */
la lista hasta
{ant -> sig = p -> sig;
el final
free(p);
return top;}
}
ant = p; /* avance */
p = p -> sig;
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p); con el que se le pasa como
Si el miembro nombre coincide
aux;}a borrar est apuntado por
argumento, entonces elreturn
elemento
else /* el elemento a eliminar va en medio o al final */
actual
{ant -> sig = p -> sig;
free(p);
Elto 1
Elto 2
Elto 3
Elto 4
top
NULL
return top;}
}
ant = p; /* avance */
p
p = p -> sig; ant
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
Dos casos: else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
1.- El elemento a borrar
es el primero
free(p);
return top;}
Elto 1
Elto 2
Elto 3
Elto 4
top
NULL
NULL
}
ant = p; /* avance */
ant
p
= p -> sig; p
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
free(p);
Dos casos:
return top;}
Liberamos memoria} y devolvemos la nueva cabecera
ant = p; /* avance */
Elto 1
Elto 2
Elto 3
Elto 4
top
NULL
NULL p = p -> sig;
} /* fin del while */
return
o lista vaca */
ant top; /* no
p encontradoaux
(nueva cabecera)
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * Dos


borrar
(struct ciclista * top, char * c)
casos:
{
struct ciclista * 2.p =El
top
, * ant = aNULL;
Punteros
paraorecorrer
elemento
borrar/*est
en medio
al final lista */
struct ciclista * aux; /* servir para poder liberar memoria */
Elto 1
Elto 2
Elto 3
Elto 4
NULL
while(p) {
top
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant =ant
= NULL) p/* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
free(p);
return top;}
}
ant = p; /* avance */
p = p -> sig;
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * Enlazamos


borrar (struct
ciclista * top,
char * c) a borrar y liberamos
saltndonos
el elemento
{
memoria. Devolvemos la cabecera de lista.
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
Elto 1
Elto 2
Elto 3
Elto 4
NULL
while(p) {
top
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant =ant
= NULL) /* es el primero
*/
p
{ aux = p -> sig;
free(p);
return aux;}
else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
free(p);
return top;}
}
ant = p; /* avance */
p = p -> sig;
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listassimplemente
simplementeenlazadas
enlazadas
Funciones
FuncionesAdicionales
Adicionalespara
paraListas
Listassimplemente
simplementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c)


{
struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */
struct ciclista * aux; /* servir para poder liberar memoria */
while(p) {
if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */
{
if (ant = = NULL) /* es el primero */
{ aux = p -> sig;
free(p);
return aux;}
else /* el elemento a eliminar va en medio o al final */
{ant -> sig = p -> sig;
free(p);
Si return
llegamos
al final de la lista, significa que no se
top;}
ha encontrado el elemento a eliminar.
}
la cabecera de lista.
ant = p; /* avanceDevolvemos
*/
p = p -> sig;
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Listas
Listasdoblemente
doblementeenlazadas
enlazadas
Cada elemento contiene dos enlaces con el siguiente y anterior elemento de la lista.
Conocida la posicin de un elemento, podemos recorrer la lista en ambas
direcciones
INICIO
LISTA

Bloque 1

Bloque 2

Bloque 3

Bloque 4

NULL

NULL
Listas
Listasdoblemente
doblementeenlazadas
enlazadasen
enCC
struct direc {
char nombre[40];
char calle[40];
char ciudad[20];
int codigo;
struct direc * sig;
struct direc * ante;
} info;

Informacin del Elemento

Por convenio, el fin de lista,


y el elemento precente al
primero se indican como
NULL

Punteros a la
propia estructura

Enlace con el siguiente


elemento y el anterior

DE NUEVO:
Cada elemento requiere una reserva dinmica de memoria al ser creado (liberar
memoria al ser eliminado).
La gestin de la lista se hace con funciones apropiadas para aadir, insertar, borrar,
buscar elementos, etc.

Listas
Listasdoblemente
doblementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listasdoblemente
doblementeenlazadas
enlazadas

1.- Lista Desordenada


struct direc * d_almac_fin(struct direc *top, struct direc * nuevo)
{
struct direc * p = top; /* puntero que recorrer la lista hasta el final */
if (top = = NULL)
return nuevo ; /* si no existe lista la crea */
while( p -> sig )
{ p = p -> sig ; } /* recorre la lista hasta que p apunte al ltimo */
p -> sig = nuevo; /* enlaza el nuevo elemento al final */
nuevo -> ante = p; /* enlace con el ltimo */
return top; /* devuelve la cabeza */
}

INICIO
LISTA

Bloque 1

Bloque 2

Bloque 3

NULL
nuevo
NULL

NULL
E. nuevo

NULL

Listas
Listasdoblemente
doblementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listasdoblemente
doblementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista * dinsertar (struct ciclista * ppio, struct ciclista * nuevo)
{ Estructura
Estructurabase
basepara
paraelelejemplo
ejemplode
delalafuncin
funcindinsertar
dinsertar
struct ciclista *actual = ppio; /* puntero para moverse por la lista */
struct
ciclista{
struct
ciclista
*anterior = NULL; /*puntero al elemento anterior al "actual" */
struct
ciclista{
int
num;
/*/*nmero
del
*/*/
/* Bsqueda
del
punto
de insercin
*/
int
num;
nmero
delciclista
ciclista
char
del
while ( (actual
!=nombre[80];
NULL) && ( /*nombre
actual
-> tiempo
<= nuevo -> tiempo) )
char
nombre[80];
/*nombre
delciclista*/
ciclista*/
int
tiempo;
/*
tiempo
en
la
clasificacin
{anterior
= actual;
int tiempo;
/* tiempo en la clasificacin*/*/
struct
**sig;
/*/*puntero
actual
=ciclista
actual ->
sig;}
struct
ciclista
sig;
punteroaasiguiente
siguiente*/*/
ciclista
/* insercinstruct
*/
struct
ciclista**ant;
ant;/*/*puntero
punteroaaanterior
anterior*/*/
if (anterior };
!=
}; NULL)
{ anterior -> sig = nuevo; /* insercin en medio o final */
El
es
funcin
nuevo
-> ant =lala
anterior;}
Elobjetivo
objetivo
esdisear
disear
funcindinsertar
dinsertarpara
paracrear
crearlistas
listas
ordenadas
de
elementos
struct
ciclista.
else
ordenadas de elementos struct ciclista.
El
de
aamayor
tiempo
{ ppio
= nuevo; /*ser
insercin
al principio
de
la lista */
Elcriterio
criterio
deordenacin
ordenacin
serde
demenor
menor
mayor
tiempo
de
nuevo -> ant = NULL;}
declasificacin.
clasificacin.
nuevo -> sig = actual;
if ( actual != NULL )
actual -> ant = nuevo;
return ppio; /* devuelve la cabecera de la lista */
}

Listas
Listasdoblemente
doblementeenlazadas
enlazadas
Funciones
Funcionesde
decreacin
creacinde
deListas
Listasdoblemente
doblementeenlazadas
enlazadas

2.- Lista Ordenada


struct ciclista * dinsertar (struct ciclista * ppio, struct ciclista * nuevo)
{
struct ciclista *actual = ppio; /* puntero para moverse por la lista */
struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */
/* Bsqueda del punto de insercin */
while ( (actual != NULL) && ( actual -> tiempo <= nuevo -> tiempo) )
{anterior = actual;
actual = actual -> sig;}
/* insercin */
if (anterior != NULL)
{ anterior -> sig = nuevo; /* insercin en medio o final */
nuevo -> ant = anterior;}
else
{ ppio = nuevo; /* insercin al principio de la lista */
nuevo -> ant = NULL;}
nuevo -> sig = actual;
if ( actual != NULL )
actual -> ant = nuevo;
return ppio; /* devuelve la cabecera de la lista */
}

Listas
Listasdoblemente
doblementeenlazadas
enlazadas

Borrado de elementos

struct ciclista * dborrar (struct ciclista * top, char * c)


{
struct ciclista * p = top;
while(p) {
if ( !strcmp(c, p->nombre) ) /* lo hemos encontrado */
{
if ( p -> ant = = NULL ) /* es el primero */
{top = p -> sig;
if (top) top -> ant = NULL; /* si el borrado no era nico */
free(p);return top;}
if ( p -> sig = = NULL ) /* si no, es el ltimo */
{p -> ant -> sig = NULL;
free (p);return top;}
else
{p -> ant -> sig = p -> sig; /* va en medio */
p -> sig -> ant = p -> ant;
free(p);
return top;}
} /*fin de if */
p = p -> sig; /* avance */
} /* fin del while */
return top; /* no encontrado o lista vaca */
}

Informacin tomada de: Fundamentos de Informtica, Escuela Superior de Ingenieros,


Universidad de Sevilla.
Autores: Ismael Alcal Torrego, Jos ngel Acosta Rodrguez, Fernando Dorado Navas,
Fabio Gmez Estern-Aguilar, Manuel Lpez Martnez, Amparo Nez Reyes y Carlos Vivas
Venegas
Compilado por Sullin Santaella, con fines acadmicos. 2014

Você também pode gostar