leccion 3.3 listas enlazadas
TRANSCRIPT
-
8/8/2019 Leccion 3.3 Listas enlazadas
1/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 1
Leccion 3.3 LISTAS ENLAZADAS
En Ciencias de la Computacin, una lista enlazada es una de las estructuras de datos fundamentales, y
puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en losque se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior oposterior. El principal beneficio de las listas enlazadas respecto a los array convencionales es que el
orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el
disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.
Una lista enlazada es un tipo de dato auto-referenciado porque contienen un puntero o link a otro dato
del mismo tipo. Las listas enlazadas permiten inserciones y eliminacin de nodos en cualquier punto dela lista en tiempo constante (suponiendo que dicho punto est previamente identificado o localizado),
pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: Lista Enlazadas
Simples, Listas Doblemente Enlazadas, Listas Enlazadas Circulares y Listas Enlazadas Doblemente
Circulares.
Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp yScheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas
enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente,
disponen de referencias para crear listas enlazadas.
Listas simples enlazadas
La lista enlazada bsica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta
al siguiente nodo en la lista, o al valorNULL o a la lista vaca, si es el ltimo nodo.
Una lista enlazada simple contiene dos valores: el valor actual del nodo y un enlace al siguiente nodo
Aplicaciones de las listas enlazadas
Las listas enlazadas son usadas como mdulos para otras muchas estructuras de datos, tales comopilas,colas y sus variaciones.
El campo de datos de un nodo puede ser otra lista enlazada. Mediante este mecanismo, podemosconstruir muchas estructuras de datos enlazadas con listas; esta practica tiene su origen en el lenguaje de
programacin Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la nica),
y ahora es una caracterstica comn en el estilo de programacin funcional.
A veces, las listas enlazadas son usadas para implementar arrays asociativos, y estas en el contexto de
las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejoresformas de implementar stas estructuras, por ejemplo con rboles binarios de bsqueda equilibrados. Sin
-
8/8/2019 Leccion 3.3 Listas enlazadas
2/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 2
embargo, a veces una lista enlazada es dinmicamente creada fuera de un subconjunto propio de nodos
semejante a un rbol, y son usadas ms eficientemente para recorrer sta serie de datos
Ventajas
Como muchas opciones en programacin y desarrollo, no existe un nico mtodo correcto para resolverun problema. Una estructura de lista enlazada puede trabajar bien en un caso pero causar problemas enotros. He aqu una lista con un algunas de las ventajas ms comunes que implican las estructuras de tipo
lista. En general, teniendo una coleccin dinmica donde los elementos estn siendo aadidos y
eliminados frecuentemente e importa la localizacin de los nuevos elementos introducidos se incrementael beneficio de las listas enlazadas.
Lenguajes soportados
Muchos lenguajes de programacin tales como Lisp y Scheme tienen listas enlazadas simples ya
construidas. En muchos lenguajes de programacin, estas listas estn construidas por nodos, cada uno
llamado cons o celda cons. Las celdas cons tienen dos campos: el car, una referencia del dato al nodo, yel cdr, una referencia al siguiente nodo. Aunque las celdas cons pueden ser usadas para construir otras
estructuras de datos, este es su principal objetivo.
En lenguajes que soportan tipos abstractos de datos o plantillas, las listas enlazadas ADTs o plantillas
estn disponibles para construir listas enlazadas. En otros lenguajes, las listas enlazadas son tpicamente
construidas usando referencias junto con el tipo de dato record.
En la seccin de implementaciones hay un ejemplo completo en C y en Maude
Operaciones sobre listas enlazadas
Cuandos se manipulan listas enlazadas, hay que tener cuidado con no usar valores que hayamosinvalidado en asignaciones anteriores. Esto hace que los algoritmos de insertar y borrar nodos en las
listas sean algo especiales. A continuacin se expone elpseudocdigo para aadir y borrar nodos en
listas enlazadas simples, dobles y circulares.
Listas Enlazadas Lineales
Nuestra estructura de datos tendr dos campos. Vamos a mantener la variables PrimerNodos quesiempre apunta al primer nodo de tal lista, nulo para la lista vaca.
recordNode {data // El dato almacenado en el nodo
next // Una referencia al nodo siguiente, nulo para el ltimo nodo
}
recordList {
Node PrimerNodo // Apunta al primer nodo de la lista; nulo para la lista
vaca
}
-
8/8/2019 Leccion 3.3 Listas enlazadas
3/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 3
El recorrido en una lista enlazada es simple, empezamos por el primer nodo y pasamos al siguiente hasta
que la lista llegue al final.
node := list.PrimerNodo
while node not null {
node := node.next
}
El siguiente cdigo inserta un elemento a continuacin de otro en una lista simple. El diagrama muestra
como funciona.
function insertAfter(Node node, Node newNode) {newNode.next := node.next
node.next := newNode
}
Insertar al principio de una lista requiere una funcin por separado. Se necesita actualizar PrimerNodo.
function insertBeginning(List list, Node newNode) {
newNode.next := list.firstNode
list.firstNode := newNode
}
De forma similar, tambin tenemos funciones para borrar un nodo dado para borrar un nodo delprincipio de la lista. Ver diagrama.
function removeAfter(Node node) {
obsoleteNode := node.next
node.next := node.next.next
destroy obsoleteNode
}
function removeBeginning(List list) {
obsoleteNode := list.firstNode
list.firstNode := list.firstNode.next
destroy obsoleteNode
}
-
8/8/2019 Leccion 3.3 Listas enlazadas
4/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 4
Advertimos que BorrarPrincipio pone PrimerNodo a nulo cuando se borra el ltimo elemento de la lista.
Adjuntar una lista enlazada a otra puede resultar ineficiente a menos que se guarde una referencia a la
cola de la lista, porque si no tendramos que recorrer la lista en orden hasta llegar a la cola y luego aadirla segunda lista.
EJEMPLO
Recorrido
Definicin:
Recorrido simplemente despliega los datos almacenados en el arreglo Info, con ayuda de un segundo
arreglo llamado Indice el cual guarda el orden en el que encuentran enlazados cada uno de los datos.
Explicacin:
Apuntador toma el valor de Inicio, despus ve si la condicin cumple para efectuar un Ciclo mientras
Apuntador sea diferente de 0, si cumple lo que hace es que despliega la Info[Apuntador], despusApuntador toma el valor de Indice[Apuntador] (El cual nos indica el siguiente nodo que sigue en la lista)
y hace esto hasta que Apuntador sea igual a 0 (Cuando llega a este punto a llegado al fin de la Lista
Enlazada).
Algoritmo:
Recorrido(Inicio, Info, Indice)
Apuntador - Inicio
Repetir mientras Apuntador Nill
Imprimir Info[Apuntador]
Apuntador - Indice[Apuntador]
Fin del ciclo
Salir
Diagrama:
-
8/8/2019 Leccion 3.3 Listas enlazadas
5/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 5
Programa:
#include
#include
void Recorrido(char Info[8][2],int Indice[8],int Inicio,int Disp);
void main()
{
char Info[8][2]={{"G"},{"I"},{" "},{"T"},{"O"},{"A"},
{" "},{"T"}};int Indice[8]={5,7,6,1,-999,3,-999,4};
int Inicio=0,Disp=2;
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
6/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 6
Bsqueda
Definicin:
La Bsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lo desplegara en la
pantalla, si no lo encuentra no desplegara nada ya que el dato no se encuentra en el arreglo Info.
Explicacin:
Apuntador toma el valor de Inicio, despus ve si la condicin cumple para efectuar un Ciclo mientras
Apuntador sea diferente de 0, si cumple lo que hace a continuacin es la comparacin de Elemento (El
dato que vamos a buscar) con Info[Apuntador], cuando lo encuentre lo despliega y sale del mtodo. Sino, regresa el valor de Apuntador para as saber que no se encontr el dato.
Algoritmo:
Recorrido(Inicio, Info, Indice, Elemento)
Apuntador - Inicio
Repetir mientras Apuntador Nill
Si Elemento = Info[Apuntador] entonces:
Imprimir Info[Apuntador]
Regresa Apuntador
Apuntador - Indice[Apuntador]
Fin del ciclo
Regresar Apuntador
-
8/8/2019 Leccion 3.3 Listas enlazadas
7/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 7
Diagrama:
Programa:
#include
#include
int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento);
void main()
{
int Info[8]={12,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,-999,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
coutElemento;
Res=Busqueda(Info,Indice,Inicio,Disp,Elemento);
if(Res==-999)
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
8/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 8
}
return Apuntador;
}
CORRIDA:
Insercin al Principio
Definicin:
La Insercin al Principio bsicamente busca si existe algn lugar disponible en el arreglo Info y loagrega como primer Nodo si es que es posible.
Explicacin:
Hace una comparacin para ver si es posible insertar otro Elemento al arreglo Info, para esto checa si
Disp es Diferente de Nulo. Si no cumple con la condicin se desplegar Sobre Carga ya que no sepuede insertar un Nuevo Elemento. Si es cierto Apuntador toma el valor de Inicio, Disp cambia a
Indice[Disp] ya que el primer Disp tomara el valor del Nuevo Elemento, despus de esto solo copia la
informacin de Elemento al arreglo Info en la posicin que guarda Apuntador, Indice[Apuntador] tomael valor de Inicio y finalmente Inicio toma el valor de Apuntador.
Algoritmo:
-
8/8/2019 Leccion 3.3 Listas enlazadas
9/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 9
InsPr(Inicio, Disp, Info, Indice, Elemento)
Si Disp Nill entonces:
Apuntador - Disp
Disp - Indice[Disp]
Info[Apuntador] - Elemento
Indice[Apuntador] - Inicio
Inicio - Apuntador
Si no:
Imprimir Sobre Carga
Salir
Diagrama:
Programa:
-
8/8/2019 Leccion 3.3 Listas enlazadas
10/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 10
#include
#include
void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp);
void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento);
void main()
{
int Info[8]={12,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,-999,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
11/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 11
Insercin despus de UN Nodo Determinado
Definicin:
La Insercin despus de un Nodo Determinado bsicamente hace lo mismo que la insercin al principio,la nica diferencia es que este recibe la posicin del nodo en la que ser Insertada. Este Algoritmo se usa
para Insercin Ordenada que mas adelante explicaremos.
Explicacin:
Primero confirma que sea posible insertar el Dato, si no es posible solo desplegara Sobre Carga. Si es
posible insertar un dato nuevo lo posiciona en la primer posicin Disponible en el arreglo Info, despuscompara la Nueva Posicin (Npos) que le mandamos con Nill si cumple la condicin el dato es insertadoen la primer posicin, de otra forma se posicionara en la posicin que guarde Npos.
Algoritmo:
-
8/8/2019 Leccion 3.3 Listas enlazadas
12/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 12
InsNd(Inicio, Disp, Info, Indice, Elemento, Npos)
Si Disp Nill entonces:
Apuntador - Disp
Disp - Indice[Disp]
Info [Apuntador] - Elemento
Si Npos = Nill entonces:
Indice[Apuntador] - Inicio
Inicio - Apuntador
Si no:
Indice[Apuntador] - Indice[Npos]
Indice[Npos] - Apuntador
Si no:
Imprimir Sobre Carga
Salir
Insercin Ordenada
Definicin:
La Insercin Ordenada busca la posicin en donde ser Insertado el Elemento y la posicin anterior
donde ser Insertado, despus de encontrar la posicin en la que ser Insertado el Elemento nos regresa
ese valor y lo mandamos al mtodo de la Insercin despus de un Nodo.
Explicacin:
En esta ocasin usaremos dos variables para determinar la posicin deseada, comparamos si Inicio es
igual a Nill si Elemento es menor al dato que se encuentra en Info[Inicio], si alguna de las dos cumpleregresamos Nill, de esta manera Indicamos que el Elemento ser el primero de todo el Arreglo Info, si
no es as Temp tomara el valor de Inicio y Temp2 de la posicin que le sigue a Inicio. Hace un ciclo
hasta encontrar la posicin en donde se insertara el Nuevo Elemento y va movindose de posicin conlas variables Temp y Temp2 para as determinar que posicin debe de regresar.
-
8/8/2019 Leccion 3.3 Listas enlazadas
13/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 13
Algoritmo:
InsOrd(Inicio, Info, Indice, Elemento)
Si Inicio = Nill Elemento < Info[Inicio] entonces:
Regresar Nill
Temp - Inicio
Temp2 - Indice[Inicio]
Repetir mientras Temp2 Nill
Si Elemento < Info[Temp2]
Regresar Temp
Temp - Temp2
Temp2 - Indice[Temp2]
Regresar Temp
Diagrama:
-
8/8/2019 Leccion 3.3 Listas enlazadas
14/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 14
Programa:
#include
#include
int InsOrd(int Info[8],int Indice[8],int Inicio,int Elemento);
void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp);
void InsNd(int Info[8],int Indice[8],int Inicio,int Disp, int Elemento, int Npos);
void main(){
int Info[8]={12,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,-999,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
15/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 15
void InsNd(int Info[8],int Indice[8],int Inicio,int Disp, int Elemento, int Npos)
{
if(Disp!=-999)
{
int Apuntador=Disp;
Disp=Indice[Disp];
Info[Apuntador]=Elemento;
if(Npos==-999)
{
Indice[Apuntador]=Inicio;
Inicio=Apuntador;
}
else
{
Indice[Apuntador]=Indice[Npos];
Indice[Npos]=Apuntador;
}
Recorrido(Info,Indice,Inicio,Disp);
}else
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
16/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 16
Eliminacin por Bsqueda
Definicin:
La Eliminacin simplemente cambia los nodos para que el dato que se desea eliminar sea el primer
disponible, de esta forma ya no estar en el Arreglo de Info.
Explicacin:
Lo primero que hace es ver si existe algn dato en la lista para eliminar, si Inicio es igual a Nill entonces
solo desplegara Imposible Eliminar. De otra formas cambiar de Posicin en Posicin hasta encontrar
el Elemento que sea desea Eliminar con ayudar de dos variables que guardan la Posicin actual y laanterior en donde se encuentre el dato. Ya que lo encuentra cambia ese dato como la primera posicinDisponible y lo apunta al siguiente nodo disponible. Si no encuentra el dato simplemente desplegara
Dato no encontrado
Algoritmo:
EliBusq(Inicio, Info, Indice, Elemento)
Temp - Inicio
Si Temp = Nill
Imprimir Lista Vacia Imposible Eliminar y Retornar
Repetir mientras Temp Nill
-
8/8/2019 Leccion 3.3 Listas enlazadas
17/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 17
Si Elemento = Info[Temp] entonces:
Si Temp = Inicio entonces:
Inicio - Indice[Inicio]
Si no:
Indice[Temp2] - Indice[Temp]
Indice[Temp] Disp
Disp - Temp
Recorrido(Inicio, Info, Indice) y Retornar
Si no:
Temp2 - Temp
Temp - Indice[Temp]
Imprimir Dato no encontrado Imposible Eliminar y Retornar
Diagrama:
-
8/8/2019 Leccion 3.3 Listas enlazadas
18/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 18
Programa:
#include
#include
void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp);
void EliBusq(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento);
void main()
{
int Info[8]={12,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,-999,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
19/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 19
}
}
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
20/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 20
APENDICE
Codigo de Listas enlazadas en C++
#include
#include
#include
#include
class Alumno
{
private:
char Nombre[10][30];
int N_control[10],Edad[10],Indice1[10],Indice2[10],Inicio,Fin,Disp;
public:
//ConstructorAlumno()
{
int i,j;
Inicio=0;
Fin=0;
Disp=1;
Indice1[Inicio]=-999;
Indice2[Fin]=-999;
for(i=1,j=2;i
-
8/8/2019 Leccion 3.3 Listas enlazadas
21/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 21
else
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
22/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 22
}
else
Temp=Indice2[Temp];
}
}
return -999;
}
//Funcion de Busqueda Sobrecargada para una Cadena de Caracteres
int Busqueda(char Elem[30])
{
if((strcmp(Elem,Nombre[Inicio]))
-
8/8/2019 Leccion 3.3 Listas enlazadas
23/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 23
Temp=Temp2;
Temp2=Indice1[Temp2];
}
return Temp;
}
//Funcion Sobrecargada de Orden para una Cadena de Caracteres
int Enca(char E_nom[30])
{
int Temp=Indice1[Inicio],Temp2;
if(Temp==-999)
return -999;
if((strcmp(E_nom,Nombre[Temp]))
-
8/8/2019 Leccion 3.3 Listas enlazadas
24/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 24
Fin=Temp;
}
else
{
Indice2[Temp]=Npos;
Indice2[Indice1[Npos]]=Temp;
}
Indice1[Npos]=Temp;
}
}
else
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
25/26
ESTRUCTURAS DE DATOS LECCION 3.3. LISTAS ENLAZADAS Pgina 25
//Funcion Sobrecargada para Borrar una Cadena de Caracteres
void Borrar(char Elem[30])
{
int Temp2,Temp=Indice1[Inicio];
if(Temp==Inicio)
{
cout
-
8/8/2019 Leccion 3.3 Listas enlazadas
26/26
gotoxy(1,10);
switch (op)
{
case 1:
tec.Recorrido(1);
break;
case 2:
tec.Recorrido(2);
break;
case 3:
cout