Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
ELO320 Estructuras de Datos y Algoritmos
Listas
Toms Arredondo Vidal
Este material est basado en:
Robert edge!ic"# $Algorit%ms in &$# 't%ird edition(# Addison)*esley# +,- 0)20.)3.//3)30 200.
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
Elementos se direccionan en
tiem3o constante O'.(# los
elementos tienen un costo de
acceso de O'n( en el 3eor caso
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
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
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