Vous êtes sur la page 1sur 29

ESTRUCTURAS DINMICAS

LINEALES DE DATOS
Listas, pilas y colas
1
ESTRUCTURAS DINMICAS DE DATOS
Permiten crear estructuras de datos que se
adapten a las necesidades reales a las que suelen
enfrentarse nuestros programas.
Tambin permiten crear estructuras de datos
muy flexibles, ya sea en cuanto al orden, la
estructura interna o las relaciones entre los
elementos que las componen.
Las estructuras de datos estn compuestas de
otras pequeas estructuras a las que llamaremos
nodos o elementos, que agrupan los datos con los
que trabajar nuestro programa y adems uno o
ms punteros autoreferenciales, es decir,
punteros a objetos del mismo tipo nodo.
2
ESTRUCTURAS DINMICAS DE DATOS
Una estructura bsica de un nodo para crear
listas de datos seria:
struct nodo {
int dato;
nodo *sgt;
};
El campo sgt" puede apuntar a un objeto del tipo
nodo. De este modo, cada nodo puede usarse como
un ladrillo para construir listas de datos, y cada
uno mantendr ciertas relaciones con otros
nodos.
Para acceder a un nodo de la estructura slo
necesitaremos un puntero a un nodo.
3
ESTRUCTURAS DINMICAS DE DATOS
Para mostrar la estructura de las estructuras de
datos dinmicas nos ayudaremos de grficos.
As por ejemplo El nodo anterior (cdigo de la
estructura autoreferencial) se representar as:
4
Dato
ESTRUCTURAS DINMICAS DE DATOS
Las estructuras dinmicas son una implementacin de
TDAs o TADs (Tipos Abstractos de Datos).
Dependiendo del nmero de punteros y de las
relaciones entre nodos, podemos distinguir varios tipos
de estructuras dinmicas:
Listas enlazadas: cada elemento slo dispone de un puntero,
que apuntar al siguiente elemento de la lista o valdr NULL
si es el ltimo elemento.
Pilas: son un tipo especial de lista, conocidas como listas LIFO
(Last In, First Out: el ltimo en entrar es el primero en salir).
Los elementos se "amontonan" o apilan, de modo que slo el
elemento que est encima de la pila puede ser ledo, y slo
pueden aadirse elementos encima de la pila.
Colas: otro tipo de listas, conocidas como listas FIFO (First In,
First Out: El primero en entrar es el primero en salir). Los
elementos se almacenan en fila, pero slo pueden aadirse por
un extremo y leerse por el otro.
5
LISTAS ENLAZADAS
6
LISTAS ENLAZADAS
La forma ms simple de estructura dinmica es la lista enlazada.
En esta forma los nodos se organizan de modo que cada uno
apunta al siguiente, y el ltimo no apunta a nada, es decir, el
puntero del nodo siguiente vale NULL.
En las listas enlazadas existe un nodo especial: el primero.
Normalmente diremos que nuestra lista es un puntero a ese
primer nodo y llamaremos a ese nodo la cabeza de la lista. Eso es
porque mediante ese nico puntero podemos acceder a toda la
lista.
Cuando el puntero que usamos para acceder a la lista vale NULL,
diremos que la lista est vaca.
7
Dato Dato Dato Dato
Null
Lista
Null Lista
LISTAS ENLAZADAS
Declaraciones de tipos para manejar listas en C:
Como ya se vio anteriormente usaremos la declaracin
de la siguiente forma:
struct nodo {
int dato;
nodo *sgt;
} ;
nodo *lista;
nodo *p;
*p es un punteros a un nodo.
lista es el tipo para declarar listas
como puede verse, *p y *lista son la misma cosa. En
realidad, cualquier puntero a un nodo es una lista,
cuyo primer elemento es el nodo apuntado. 8
OPERACIONES BSICAS CON LISTAS
Entre las operaciones bsicas a realizar
tenemos:
Aadir o insertar.
Buscar o localizar.
Borrar.
Moverse a travs de una lista, anterior,
siguiente, primero.
Cada una de estas operaciones tendr
varios casos especiales, por ejemplo, no
ser lo mismo insertar un nodo en una
lista vaca, o al principio de una lista no
vaca, o la final, o en una posicin
intermedia.
9
INSERTAR NODOS EN UNA LISTA ENLAZADA
1 Insertar un elemento en una lista vaca:
Este es, evidentemente, el caso ms sencillo.
Partiremos de que ya tenemos el puntero a la lista
que valdr NULL,
Adems el nodo a insertar y, por supuesto un
puntero que apunte a l,
Null Lista
Dato p
lista=NULL
p=new(nodo);
10
INSERTAR NODOS EN UNA LISTA ENLAZADA
1 Insertar un elemento en una lista vaca:
El proceso es muy simple, bastar con que:
p->sgt apunte a NULL.
Lista apunte a p.
Null Lista
Dato p
p->sgt=lista;
lista=p;
INSERTAR NODOS EN UNA LISTA ENLAZADA*
1 Insertar un elemento en la primera
posicin:
El proceso es muy simple y bastante similar:
p->sgt apunte a lista.
Lista apunte a p.
Dato p
Dato Dato Dato Null Lista
p->sgt=lista;
lista=p;
EJEMPLO DE LISTA ENLAZADA
#include<iostream>
using namespace std;
struct nodo{
int dato;
nodo *sgt;
};
int main(){
int n;
nodo *lista;
nodo * p;
lista=NULL;
cout<<"numero de elementos: ";
cin>>n;
for (int i=0; i<n; i++){
cout<<"V["<<(i+1)<<"]= ";
p=new(nodo);
cin>>p->dato;
p->sgt=lista;
lista=p;
}
cout<<"presenta datos leidos con un
FOR"<<endl;
p=lista;
for (int i=0; i<n; i++){
cout<<p->dato<<"\t";
p=p->sgt;
}
cout<<endl;
cout<<"presenta datos leidos con un
while"<<endl;
p=lista;
while(p){
cout<<p->dato<<"\t";
p=p->sgt;
}
cout<<endl;
system("pause");
return(0);
} 13
Hacer el mismo programa trabajando con funciones
FUNCIONES TIPO PARA EL MANEJO DE
LISTAS ENLAZADAS
14
void
insertaini(nodo
*&lista, int v){
nodo *p;
p=new(nodo);
p->dato=v;
p->sgt=lista;
lista=p;
}
void mostrarlis(nodo *lista){
cout<<endl;
while(lista){
cout<<lista->dato<<"\t";
lista=lista->sgt;
}
cout<<endl;
}
Inserta un nodo al inicio Mostrar una lista
FUNCIONES TIPO PARA EL MANEJO DE
LISTAS ENLAZADAS - TYPEDEF
struct nodo{
int dato;
nodo *sgt;
};
typedef nodo* pnodo;
void insertaini(pnodo &lista,
int v){
pnodo p;
p=new(nodo);
p->dato=v;
p->sgt=lista;
lista=p;
}
void mostrarlis(pnodo lista){
cout<<endl;
while(lista){
cout<<lista->dato<<"\t";
lista=lista->sgt;
}
cout<<endl;
}
15
RESUMEN
16
p=lista;
for (int i=0; i<n; i++){
cout<<p->dato<<\t;
p=p->sgt;
}
************************
p=lista;
while (p!=NULL){
cout<<p->sgt;
p=p->sgt;
}
void insertaini(pnodo &lista, int v){
pnodo p;
p=new(nodo);
p->dato=v;
p->sgt=lista;
lista=p;
}
void mostrarlis(pnodo lista){
cout<<endl;
while(lista){
cout<<lista->dato<<"\t";
lista=lista->sgt;
}
cout<<endl;
}
Sin funciones Con funciones
INSERTAR NODOS EN UNA LISTA ENLAZADA
Insertar un elemento en una lista vaca
en la ultima posicin:
El proceso es muy simple:
p->sgt apunte a NULL.
Lista apunte a p.
Null Lista
Dato p
p->sgt=NULL;
lista=p;
INSERTAR NODOS EN UNA LISTA ENLAZADA*
Insertar un elemento en la ltima posicin:
Partimos de una lista no vaca:
Necesitamos un puntero que seale al ltimo elemento de la lista
(anterior).
La manera de conseguirlo es empezar por el primero y avanzar
hasta que el nodo que tenga como siguiente el valor NULL.
Hacer que p->sgt sea NULL.
Hacer que anterior->sgt sea p.
anterior
Dato Dato Dato Null Lista
Dato p
while(anterior->sgt)
anterior=anterior->sgt
p->sgt=NULL
anterior->sgt=p
anterior=lista
INSERTAR NODOS EN UNA LISTA ENLAZADA*
Insertar nodo a continuacin de un nodo cualquiera:
Podemos considerar el caso anterior como un caso particular de
este. Ahora el nodo "anterior" ser aquel a continuacin del cual
insertaremos el nuevo nodo :
Suponemos que ya disponemos del nuevo nodo a insertar,
apuntado por p, y un puntero al nodo a continuacin del que lo
insertaremos (anterior). El proceso a seguir ser.
Hacer que p->sgt seale a anterior->sgt
Hacer que anterior->sgt seale a p.
anterior
Dato Dato Dato Null Lista
Dato p
p->sgt=anterior->sgt
anterior->sgt=p
anterior=lista;
for(int i=1;anterior!=NULL;i++){
if(i==pos-1){
//inserta
}
anterior=anterior->sgt;
}
ELIMINAR ELEMENTOS DE UNA LISTA*
Eliminar el primer nodo de la lista:
Asumimos que tenemos una lista con uno o mas nodos, y un
puntero auxiliar (p para nuestros ejemplos)
Iniciamos haciendo que p apunte al primer elemento de la lista
Lista apunta al siguiente nodo (segundo nodo)
Liberamos la memoria asignada al elemento a eliminar
Dato Dato Dato Null Lista
p
p=lista
lista=lista->sgt
ELIMINAR ELEMENTOS DE UNA LISTA *
Elimina un nodo cualquiera de una lista.
Partimos de una lista no vaca con al menos dos elementos:
Necesitamos adems un puntero que seale al nodo anterior al que
queremos eliminar (anterior). Por ltimo un puntero auxiliar (p).
Hacemos que p apunte al nodo que queremos borrar
Luego indicamos que anterior->sgt apunte hacia p->sgt
Liberamos la memoria del elemento a eliminar.
anterior
Dato Dato Dato Null Lista
p
p=anterior->sgt
anterior->sgt=p->sgt
Dato
anterior=lista;
for(int i=1;anterior!=NULL;i++){
if(i==pos-1){
//elimina
}
anterior=anterior->sgt;
}
ELIMINAR ELEMENTOS DE UNA LISTA *
Eliminar el ltimo elemento de la lista:
En nuestro ejemplo partimos de una lista no vaca:
Necesitamos un puntero que seale al penltimo elemento de la
lista (anterior) y que p apunte al elemento a eliminar (ltimo).
Luego indicamos que anterior->sgt apunte hacia p->sgt
Liberamos la memoria del elemento a eliminar.
anterior
Dato Dato Dato Null Lista
p
while(p->sgt){
anterior=p
p=p->sgt
}
anterior->sgt=p->sgt
p=lista
ELIMINAR ELEMENTOS DE UNA LISTA
Elimina toda una lista
El proceso es el mismo que utilizamos para
eliminar el primer elemento de la lista, pero
hacemos que este se repita mientras la lista no
sea nula.
23
while(lista){
lista=p
lista=lista->sgt;
delete(p)
}
ESTRUCTURAS DINMICAS
Pilas
24
PILAS - ESTRUCTURA
25
Su nombre se deriva de
la metfora de una pila
de platos en una cocina.
La insercin y
extraccin de elementos
de la pila siguen el
principio LIFO (last-in-
first-out).
El ltimo elemento en
entrar es el nico
accesible en cada
momento.
Entra Sale
Tope
PILA - OPERACIONES
Las operaciones bsicas de una pila son push
(empujar, meter) y pop (sacar)
Push: aade un nuevo elemento a la pila
Pop: elimina un elemento de la pila
Otras operaciones usualmente incluidas en el
tipo de dato abstracto pila son:
isEmpty (estVacia): verifica si la pila est vaca
isFull (estLlena): verifica si la pila est llena
26
PILA - EJEMPLO
27
7 7
3
7
3
9
7
3
7
3
15
7
3
push(7)
push(3) push(9) pop() push(15) pop()
PILAS - OPERACIONES BSICAS
28
void push(pnodo &pila, int v){
pnodo p;
p=new(nodo);
p->dato=v;
p->sgt=pila;
pila=p;
}
int pop(pnodo &pila){
int v;
pnodo p;
p=pila;
v=p->dato;
pila=pila->sgt;
delete(p);
return v;
}
Push Inserta al inicio Pop Elimina al inicio
PILAS - APLICACIONES
Navegador Web
Se almacenan los sitios previamente visitados
Cuando el usuario quiere regresar (presiona el botn
de retroceso), simplemente se extrae la ltima
direccin (pop) de la pila de sitios visitados.
Editores de texto
Los cambios efectuados se almacenan en una pila
Usualmente implementada como arreglo
Usuario puede deshacer los cambios mediante la
operacin undo, la cual extraer el estado del texto
antes del ltimo cambio realizado.
29

Vous aimerez peut-être aussi