You are on page 1of 25

5: Listas

1
ELO320 Estructuras de Datos y Algoritmos
Listas
Tomás Arredondo Vidal
Este material está basado en:

Robert edge!ic"# $Algorit%ms in &$# 't%ird edition(# Addison)*esley# +,- 0)20.)3.//3)30 200.

material del curso ELO320 del 1ro20 Leo3oldo il4a
 material en el sitio %tt3:55es0!i"i3edia0org
5: Listas
2
5)Listas
50. De2iniciones y o3eraciones
502 Listas sim3lemente enla6adas
503 Listas doblemente enla6adas
507 Listas circulares
505 Listas auto organi6adas y ordenadas
5: Listas
3
De2iniciones y o3eraciones

&ada elemento o nodo se re3resenta 3or una
estructura# cuyos cam3os 3ueden ser le8dos y
escritos a tra49s de un 3untero a la estructura0

uele e:istir un cam3o ;ue se denomina cla4e# ;ue
identi2ica <nicamente al nodo0 La cla4e 3uede ser
num9rica o al2anum9rica0

O3eraciones 3osibles sobre listas incluyen:

Recorrer

,uscar

eleccionar

+nsertar

Descartar
5: Listas
4
5)Listas
50. De2iniciones y o3eraciones
502 Listas sim3lemente enla6adas
503 Listas doblemente enla6adas
507 Listas circulares
505 Listas auto organi6adas y ordenadas
5: Listas
5
Listas sim3lemente enla6adas

Listas ;ue re;uieren un solo
enlace '3untero( entre un nodo
y su sucesor

Elementos se direccionan en
tiem3o constante O'.(# los
elementos tienen un costo de
acceso de O'n( en el 3eor caso

Las o3eraciones deben
considerar ;ue estas listas
3ueden estar 4ac8as lo cual
re;uiere un tratamiento
es3ecial

El uso de un centinela
sim3li2ica las o3eraciones al
%acer ;ue todos los nodos sean
tratados de 2orma igual
5: Listas
6
E=em3lo: Lista sim3lemente enla6ada
typedef struct moldenodo
{
int clave;
struct moldenodo *proximo;
} nodo, *pnodo;
pnodo CreaNodo(int dato)
{ pnodo pn=NULL;
if ( (pn= (pnodo) malloc(sieof(nodo))) ==NULL) exit(!);
else
{ pn"#clave=dato;
pn"#proximo=NULL;
}
return(pn);
}
pnodo lista=NULL;
pnodo listaC = CreaNodo($);
5: Listas
7
E=em3lo: Recorrer la lista y contar nodos
int Lar%oLista(pnodo p)
{ int numeroelementos = $;
&'ile (p (= NULL)
{
numeroelementos ));
p = p "#proximo; **recorre la lista
}
return (numeroelementos);
}
int Lar%oLista(pnodo p)
{ int numeroelementos = $;
for ( ; p (= NULL; p=p"#proximo) numeroelementos ));
return (numeroelementos);
}
5: Listas
8
E=em3lo: ,uscar un nodo
pnodo +uscar(pnodo p, int valor)
{ &'ile (p (= NULL)
{
if (p"#clave== valor)
return (p); **lo encontr,
else p = p "#proximo; **recorrer- .(n)
}
return (p); **retorna NULL si no lo encontr,/
}
Como usar esta funci,n0
pnodo 1;
if ( (1= +uscar(lista, 2)) == NULL)
{ ** no encontr, nodo con clave = 2**
}
else
{ ** lo encontr,/ 3//**
}
if ( (1= +uscar(listaC"#proximo, 2)) == NULL)
{ ** no encontr, nodo con clave = 2**
}
else
{ ** lo encontr,/ 3//**
}
5: Listas
9
E=em3lo: eleccionar un 4alor e:tremo 'm8nimo(
pnodo 4eleccionar5inimo(pnodo p)
{ int min; pnodo t;
if (p==NULL) return (NULL);
else
{ min=p"#clave; **6nicia min
t=p;
p=p"#proximo;
}
&'ile (p (= NULL)
{ if (p"#clave 7min )
{ min=p"#clave;
t=p;
}
p = p "#proximo; **recorre la lista/ .(n)
}
return (t);
}
5: Listas
10
E=em3lo: ,uscar el <ltimo nodo
pnodo 8puntar8l9inal(pnodo p) ** como pro%ramar0
{
pnodo t;
if (p==NULL)
{
return (NULL);
}
else &'ile (p (= NULL)
{
t=p;
p = p "#proximo; **recorre la lista/ .(n)
}
return (t);
}
5: Listas
11
Listas: inserci>n

?ay dos 4ariables de ti3o 3untero a
nodo: 3 a3unta a un nodo de una
lista y n a3unta a un nodo
correctamente iniciali6ado 'e0g0
retorno de &rea-odo(0

El nodo a3untado 3or n 3uede ser
insertado des3u9s del nodo
a3untado 3or 3 usando:
n)@3ro:imo A 3)@3ro:imoB

1ara com3letar la lista se usa:
3)@3ro:imo A nB

&omo seria el diagrama 2inalC
5: Listas
12
E=em3lo: insertar des3u9s

i el argumento 3osici>n toma 4alor
-DLL# se 3roducirá un error# 3or
eso se 4eri2ica su e:istencia#
pnodo 6ns:espues( pnodo posicion,
pnodo nuevo)
{
if (nuevo == NULL)
return (NULL);
if (posicion (= NULL)
{ nuevo"#proximo = posicion"#proximo;
posicion"#proximo=nuevo;
return (posicion);
}
return(nuevo);
}

E=em3lo de uso:
pnodo lista=NULL; **inicialiar lista
pnodo pos=NULL;
lista=6ns:espues(pos, CreaNodo(!));
pos =+uscar(lista, !);
6ns:espues(pos, CreaNodo(;));
pos =+uscar(lista, ;);
6ns:espues(pos, CreaNodo(<));
pos =+uscar(lista, ;);
6ns:espues(pos, CreaNodo(=));
5: Listas
13
Listas: inserci>n antes

i se desea insertar antes de la 3osici>n 3B se
re;uiere una 4ariable tem3oral 3ara e2ectuar
el intercambio 'i0e0 tem3( :
pnodo p = NULL; **inicialiar lista
p = 6ns:espues(p,CreaNodo(!));
6ns:espues(p,CreaNodo(;));
pnodo n = CreaNodo(<);
** Como es el dia%rama0
int temp;
n"#proximo = p"#proximo;
p"#proximo = n;
temp=p"#clave;
p"#clave=n"#clave;
n"#clave=temp;
** Como es el dia%rama final0
p
1 2
3
n
5: Listas
14
Listas: inserci>n al 2inal

i se desea insertar al 2inal:
pnodo 6nsertaNodoal9inal(pnodo posicion, int dato)
{ pnodo temp=posicion;
if (temp (= NULL)
{
&'ile (temp"#proximo (=NULL)
temp=temp"#proximo; **.(n)
temp"#proximo=CreaNodo(dato);
return (temp"#proximo); **retorna NULL si no se pudo crear
}
else
return (CreaNodo(dato));
} ** >?emplo uso0
5: Listas
15
+nserci>n: cabe6a y cola

Dsando 4ariables globales
cabe6a y cola:
static pnodo ca@ea=NULL;
static pnodo cola=NULL;
pnodo insertainicio(int clave)
{ pnodo t=CreaNodo(clave);
if(ca@ea==NULL)
cola=t;
t"#proximo=ca@ea;
ca@ea=t; **.(!)
return(t);
}

6nsertafinal( )0
pnodo insertafinal(int clave)
{ pnodo t =CreaNodo(clave);
if(cola==NULL) { cola=ca@ea=t;}
else {
cola"#proximo=t; cola=t;} **.(!)
return(t);
}
5: Listas
16
+nserci>n con re2erencias

Dsando re2erencias:
void insAnodoAref(pnodo *p, pnodo t)
{ if (*p==NULL)
*p=t; **inserta en lista vacBa/
else {
t"#proximo=*p; **lee var/ externa/
*p=t; **escri@e en var/ externa/
}
}

DsoC-
pnodo lista!=NULL;
6nsertanodoAref(Clista!,
CreaNodo(=));
6nsertanodoAref(Clista!,
CreaNodo(<));
6nsertanodoAref(Clista!,
CreaNodo(;));
6nsertanodoAref(Clista!,
CreaNodo(!));
5: Listas
17
Listas: descarte

La 4ariable 3 a3unta al nodo
anterior al ;ue se desea descartar#

t a3unta al nodo ;ue se desea
desligar de la lista des3u9s de
e=ecutada la acci>n:
t=p"#proximo;

1ara mantener la lista ligada:
p"#proximo = t"#proximo;

Des3u9s se libera el es3acio del
nodo descartado:
free(t);
t=NULL;
5: Listas
18
5)Listas
50. De2iniciones y o3eraciones
502 Listas sim3lemente enla6adas
503 Listas doblemente enla6adas
507 Listas circulares
505 Listas auto organi6adas y ordenadas
5: Listas
19
Listas doblemente enla6adas

Estas listas re;uieren dos
enlaces '3unteros( entre un nodo#
su sucesor y su antecesor:
typedef struct moldecelda
{ int clave;
struct moldecelda *nx; **next struct
struct modecelda *pr; ** previous
} nodo, *pnodo;
5: Listas
20
Listas doblemente enla6adas: insertar des3u9s

Diagramas muestran las 4ariables
antes de insertar el nodo a3untado
3or ; a la lista dada 3or 30

&omo seria el c>digo 3ara insertarC
1"#nx = p"#nx;
1"#pr = p;
p"#nx = 1 ;
1"#nx"#pr = 1;

&omo seria descartar el nodo ;C
1"#pr"#nx = 1"#nx;
1"#nx"#pr = 1"#pr;
free(1);
5: Listas
21
Listas doblemente enla6adas: condiciones

Las o3eraciones de insertar# buscar y descartar deben
considerar las condiciones en los bordes# y ;ue la lista
3ueda estar 4ac8a0

Dna 2orma usual de tratar sim3li2icadamente las
condiciones de borde# es de2inir un nodo 4ac8o# denominado
cabecera o centinela0
5: Listas
22
5)Listas
50. De2iniciones y o3eraciones
502 Listas sim3lemente enla6adas
503 Listas doblemente enla6adas
507 Listas circulares
505 Listas auto organi6adas y ordenadas
5: Listas
23
Listas circulares

En listas sim3lemente enla6adas# sin o con cabecera#
3uede escogerse ;ue el <ltimo nodo a3unte al 3rimero#
con esto se logra ;ue el 3rimer nodo 3ueda ser
cual;uier nodo de la lista0

La inserci>n al inicio# en el caso de la 2igura debe
tratarse de manera es3ecial# con costo O'n(# 3ara ;ue
el <ltimo nodo a3unte al nue4o 3rimero0

i la lista es con centinela# y si el <ltimo a3unta al
centinela# no es necesario introducir c>digo adicional0
5: Listas
24
5)Listas
50. De2iniciones y o3eraciones
502 Listas sim3lemente enla6adas
503 Listas doblemente enla6adas
507 Listas circulares
505 Listas auto organi6adas# ordenadas
5: Listas
25
Listas auto organi6adas y ordenadas

En listas auto organi6adas la o3eraci>n buscar
mue4e a la 3rimera 3osici>n el elemento
encontrado0

De esta manera los elementos más buscados 4an
;uedando cerca del inicio0

En listas ordenadas se mantienen los nodos
ordenados seg<n el orden de las cla4es0

e 3uede tratar las listas en base a arreglos0
1udiendo ser 9stos: arreglos de nodos# en los
cuales se em3lean 3unterosB o bien arreglos ;ue
contienen la in2ormaci>n de 48nculos en base a
cursores ;ue almacenan 8ndices0