Professional Documents
Culture Documents
LISTAS
DEFINICIN
Una LISTA es un conjunto ordenado de elementos homogneos, en la que no hay restricciones de acceso, la introduccin y borrado de elementos puede realizarse en cualquier posicin de la misma.
LISTAS
DEFINICIN
Cuando hablamos de un conjunto ordenado, nos referimos a la disposicin de sus elementos y no a su valor. Esto es que cada uno de ellos, salvo el primero y el ltimo, tienen un anterior y un siguiente. Por otro lado, al decir que los elementos de la lista son homogneos, queremos decir que son del mismo tipo base, aunque sin establecer ninguna limitacin sobre este tipo. Se trata de una estructura dinmica, ya que su tamao cambia a medida que se aaden y eliminan elementos de la misma.
LISTAS
CARACTERSTICAS
La cantidad reservada de almacenamiento para la pila o la cola es fija. Vimos pilas y colas alojadas en arreglos. Problemas al insertar o eliminar elementos. Una representacin secuencial, refleja el orden lgico de los elementos fisicamente almacenados en la lista; el orden fsico y lgico son los mismos.
LISTAS
CARACTERSTICAS
Solucin a los problemas de movimiento de los datos que se ha encontrado al utilizar representaciones secuenciales. Con la representacin no secuencial el orden lgico y el orden fsico de los elementos no es necesario que sea el mismo. El orden lgico se representa de tal forma que cada elemento apunta al siguiente elemento, es decir, se encuentran ligados.
Lista
Info
sig
Info
sig
Info
sig
Info
sig
Info
sig
Cada elemento se llama nodo. Se accesa a toda la lista a partir de un apuntador externo llamado Lista que apunta(contiene la direccin de) el primer nodo en la lista. Cada nodo tiene dos secciones: el contenido de datos (Info) y el campo del apuntador (sig). El campo Info(de informacin) contiene el elemento real en la lista. El campo sig(direccin siguiente) contiene la direccin del siguiente nodo en la lista. Tal direccin se conoce como apuntador. El ltimo nodo tiene un apuntador nulo.
Lista
Info
sig
Info
sig
Info
sig
Info
sig
Info
sig
Cada nodo es una estructura de datos de tipo registro. Los nodos enlazados no tienen que estar fisicamente adyacentes. Una lista vaca es aquella que no contiene nodos. Lista=NULL. Para remover un nodo, slo es necesario cambiar el apuntador del nodo previo para que apunte al nodo siguiente. Para insertar un nuevo nodo, slo es necesario cambiar el apuntador del nodo previo para que apunte al nodo nuevo, y el apuntador del nodo nuevo apunte al siguiente.
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Operacionescon listas: Recorrido de la lista. Insercin de un elemento. Borrado de un elemento. Bsqueda de un elemento.
Operaciones: CONSTRUCTORAS
Crea una lista vaca. CrearLista: Lista
MODIFICADORAS
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al inicio de la lista. InsertarInicio: Lista x tipo_base Lista Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al final de lista. InsertarFinal: Lista x tipo_base Lista
MODIFICADORAS
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento en un nodo que sigue al nodo apuntado por p. InsertarDespues: Lista x tipo_base Lista Dada una lista, forma la lista resultante de eliminar el elemento situado al principio de la lista (primer elemento). ElimPrim: Lista Lista
MODIFICADORAS
Dada una lista, forma la lista resultante de eliminar el elemento situado al final de la lista (ltimo elemento). ElimFinal: Lista Lista
Dada una lista, forma la lista resultante de eliminar el nodo que sigue al nodo apuntado por p. ElimDespues: Lista Lista
ANALIZADORAS
Dada una lista, hace el recorrido por la lista mostrando el campo info. RecorrerList: Lista Lista
Dada una lista, devuelve el valor verdadero si la lista est vaca y falso en caso contrario. ListaVacia: Lista lgico
ANALIZADORAS
Dada una lista, devuelve el nmero de elementos de la lista. LongLista: Lista tipo_base
DESTRUCTORA
Destruye la lista retornando toda la memoria ocupada. BorrarLista: Lista
Con esta definicin de Lista las operaciones asociadas especificadas en el TAD quedaran del siguiente modo: Crea una lista vaca int CrearLista(lista **p) { *p=NULL; };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al inicio de la lista.
void InsertarInicio(lista **p, tipo_base dato) { lista *n; n=new lista; n->info=dato; n->prox=*p; *p=n; };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al final de lista.
void InsertarFinal(lista **p, tipo_base dato) { lista *n,*m; m=*p; while(m->prox!=NULL) m=m->prox; n=new lista; n->info=dato; n->prox=NULL; m->prox=n; };
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento en un nodo que sigue al nodo apuntado por p.
void InsertarDespues(lista **p,tipo_base dato) {lista *q; if (p==NULL) { cout<<" Evite Insercin"; exit(1); } else { q=new lista; q->info=dato; q->prox=(*p)->prox; (*p)->prox=q; } };
Dada una lista, forma la lista resultante de eliminar el elemento situado al principio de la lista (primer elemento). void ElimPrim(lista**p) { lista *n; n=*p; *p=(*p)->prox; delete n; };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista, forma la lista resultante de eliminar el elemento situado al final de la lista (ltimo elemento).
void ElimFinal(lista **p) { lista *n,*m; if ((*p)->prox==NULL) { *p=NULL; delete *p; } else n=*p; while(n->prox!=NULL) { m=n;
n=n->prox; }
m->prox=NULL; delete n; };
Dada una lista, forma la lista resultante de eliminar el nodo que sigue al nodo apuntado por p.
void ElimDespues(lista **p) { lista *q; if (p==NULL) { cout<<" Evite Eliminar"; exit(1); } else { q=(*p)->prox; if (q==NULL) { cout<<" Nodo no existe "; exit(1); } else { (*p)->prox=q->prox; delet (q); } } };
Dada una lista, hace el recorrido por la lista mostrando el campo info. void RecorrerList(lista **p) { lista *q; q=*p; while (q!=NULL) { cout<<q->info<<" "; q=q->prox; } };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista, devuelve el valor verdadero si la lista est vaca y falso en caso contrario. int ListaVacia(lista **p) { if (p=NULL); return (1) else return (0); };
Uno de los problemas que plantea la implementacin dinmica mediante enlace simple es el coste de insertar y borrar nuevos elementos en la lista. En varios casos es necesario recorrerla desde el principio para poder acceder al elemento anterior al dado como parmetro. Adems, tan slo es posible recorrer la lista as enlazada en una sola direccin. Para solucionar ambos problemas se puede utilizar una lista
Una lista doblemente enlazada es una coleccin de nodos, en la cual cada nodo contiene dos apuntadores uno a su antecesor y otro a su sucesor. Las listas doblemente enlazadas pueden ser lineales, circulares y pueden contener o no un nodo de encabezado. Los nodos de una lista doblemente enlazada contiene tres campos: un campo info que contiene la informacin almacenada en el nodo, y los campos izq y der que contienen apuntadores a nodos en alguno de los dos lados. Ver figura.
info : contiene la informacin almacenada en el nodo. izq y der : contienen apuntadores a nodos en alguno de los dos
lados.
DEFINICIN # define NULL 0 struct lista { lista *izq; tipo_base info; lista *der; };
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al inicio de la lista. void InsertPrincD(lista **p, tipo_base k) { lista *n; n=new lista; n->izq=NULL; n->info=k; n->der=*p; (*p)->izq=n; *p=n; };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento al final de la lista. void InsertUltD(lista **p, tipo_base k) { lista *n,*m; m=*p; while(m->der!=NULL) { m=m->der; } n=new lista; n->info=k; n->der=NULL; m->der=n; n->izq=m; };
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento a la izquierda del nodo apuntado por p. void InsertIzqD(lista **p, tipo_base k) { lista *n,*m,*q; q=*p; n=new lista; n->info=k; n->izq=q->izq; n->der=q; if (q->izq!=NULL) { m=q->izq; m->der=n; } else p=n; q->izq=n; };
Dada una lista y un valor e, del tipo base, forma una nueva lista al aadir el elemento a la derecha del nodo apuntado por p.
void InsertDerD(lista **p, tipo_base k) { lista *n,*m,*q; q=*p; n=new lista; n->info=k; if (q==NULL) { n->izq=NULL; n->der=NULL; q=n; } else { m=q->der; if (m!=NULL) m->izq=n; n->der=m; n->izq=q; q->der=n; } };
Dada una lista, forma la lista resultante de eliminar el elemento situado al principio de la lista (primer elemento).
Dada una lista, forma la lista resultante de eliminar el elemento situado al final de la lista (ltimo elemento).
void ElimUltD(lista **p) { lista *n,*m; n=*p; while(n->der!=NULL) { n=n->der; } m=n->izq; m->der=NULL; delete n;
};
Dada una lista, forma la lista resultante de eliminar el elemento situado a la derecha del nodo apuntado por p. void ElimDerD(lista**p) { lista *q,*n,*m; q=*p; n=q->der; if (n==NULL) {cout << Evite eliminar; exit(1); } else { q->der=n->der; m=n->der; m->izq=n->izq; delete n;} }
Dada una lista, forma la lista resultante de eliminar el elemento situado a la izquierda del nodo apuntado por p. void ElimIzqD(lista**p) { lista *q,*n,*m; q=*p; n=q->izq if (n == NULL) {cout << Evite eliminar; exit(1); } else {q->izq=n->izq; m=n->izq; m->der=q; delete n; } }
LISTAS CIRCULARES
La lista encadenada circular es una ligera variante de la lista encadenada lineal; se obtiene al considerar el primer nodo de la lista como el sucesor del ltimo nodo, almacenando la direccin del primer elemento en el campo de direccin del ltimo, en lugar de almacenar la direccin nula. Al realizar esta modificacin se genera automticamente un crculo, donde realmente ya no existe ni el primero ni un ltimo elemento.
LISTAS CIRCULARES
CARACTERSTICAS
Es necesario mantener un apuntador general a la estructura (Lista), aunque ya no apunte obligatoriamente al primer elemento. La direccin nula no existe en la lista, excepto cuando la lista est vaca. Si la lista contiene un solo elemento, el campo de direccin apuntar a ese mismo nodo. Como la lista es un crculo, es posible llegar a cualquier nodo de la lista a partir de cualquiera de sus nodos.
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
LISTAS CIRCULARES
CARACTERSTICAS
Ver figura.
Info
sig
Info
sig
Info
sig
Info
sig
Info
sig
Dada una lista circular y un valor e, del tipo base, forma una nueva lista circular al aadir el elemento al iniciar la lista. void InsertarLCSE(ListaCirc **p, int dato) { ListaCirc *q;
Dada una lista circular y un valor e, del tipo base, forma una nueva lista circular al aadir el elemento despus del nodo apuntado por p . void InsertarDespLCSE(ListaCirc **p, int dato) { ListaCirc *n,*q; n=*p; q=new ListaCirc; q->info=dato; q->prox=n->prox; n->prox=q; *p=q; }
Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
Dada una lista circular, forma la lista circular resultante de eliminar el nodo que sigue al nodo apuntado por p. void EliminarDespLCSE(ListaCirc **p) { ListaCirc *q; if ((*p)==NULL){ cout<< "Evitar Eliminar"; //exit(1); } else{ q=(*p)->prox; (*p)->prox=q->prox; delete(q); } }
Dada una lista circular, devuelve el valor verdadero si la lista circular est vaca y falso en caso contrario. int ListaVaciaCSE(lista **p) { if (p=NULL); return (1) else return (0); };
Dada una lista circular, hace el recorrido por la lista circular mostrando el campo info.
void ReccorrerListaCircSE (ListaCirc **p) { ListaCirc *q,*z; z=*p; q=z->prox; while (q!=z) { cout<< q->info <<" "; q=q->prox; } cout << q->info <<" "; }
while (r!=p) { if (r==NULL) r=p; cout << p->info <<" "; p=p->prox; } }
Funcin que concatena dos listas circulares simplemente enlazadas. ListaCirc *concatenarCSE(ListaCirc **p, ListaCirc**q) { ListaCirc *n,*m,*r; n=*p; m=*q; if (n==NULL) n=m; else if(m!=NULL) { r=n->prox; n->prox=m->prox; m->prox=r; n=m; } return n; }