You are on page 1of 18

Unidad III

LISTAS ENLAZADAS

Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


Con Memoria Dinmica en POO
 No se necesita conocer el nmero de elementos de la(s) lista(s) en tiempo de compilacin  Se puede llenar, tanto como la memoria lo permita.  Los nodos se obtienen y liberan segn el comportamiento de la lista, ocupando solo la memoria que se necesiten.
Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


Al implementar la Lista en POO, se tiene una clase Lista que tendr un apuntador al primer nodo de la lista (el apuntador externo), que se llamar Primero. La clase Nodo ser una clase amiga de la clase Lista, es decir, sus atributos privados Info y Prox seran visibles a la Lista, pero privados para el resto de las aplicaciones. Esto se logra designando a clase Lista como amiga friend, en la seccin pblica o privada de la clase Nodo.

Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


#ifndef Lista_H #define Lista_H template <class Tipo> class Lista; template <class Tipo> class nodo { Tipo info; nodo<Tipo>* prox; friend class Lista<Tipo>;
};

//La clase Lista puede acceder a sus atributos privados

Programacin No Numrica I Estructura de Datos

template <class Tipo> class Lista { typedef nodo<Tipo>* Apuntador; private: nodo<Tipo>* Primero; public: Lista(); nodo<Tipo>* ObtPrimero(); void AsigPrimero(nodo<Tipo>* p); bool Vacia(); bool Llena(); bool InsComienzo(Tipo Valor); bool EliComienzo(Tipo &Valor); bool InsDespues(Apuntador p,Tipo Valor); bool EliDespues(Apuntador p,Tipo &Valor); ~Lista(); nodo<Tipo>* ObtProx(Apuntador p); void AsigProx(Apuntador p,Apuntador q); Tipo ObtInfo(Apuntador p); void AsigInfo(Apuntador p,Tipo Valor); }; #include "Lista.cpp" #endif

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA

Programacin No Numrica I Estructura de Datos

"Lista.cpp:
#include <iostream> #include <string> using namespace std; template <class Tipo> nodo<Tipo>* Lista<Tipo>::ObtPrimero(){ return Primero; }; template <class Tipo> void Lista<Tipo>::AsigPrimero(nodo<Tipo>* p){ Primero=p; };

Programacin No Numrica I Estructura de Datos

template <class Tipo> Lista<Tipo>::Lista() { Primero=NULL; }; template <class Tipo> bool Lista<Tipo>::Vacia() { return Primero == NULL; }; template <class Tipo> bool Lista<Tipo>::Llena() { nodo<Tipo> *p; p=new nodo<Tipo>; if (p==NULL) return true; else { delete p; return false; } };
Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


template <class Tipo> bool Lista<Tipo>::InsComienzo(Tipo Valor) { Apuntador nuevo; if (!Llena()) { nuevo=new nodo<Tipo>; nuevo->info=Valor; nuevo->prox=Primero; Primero=nuevo; return true; } else return false; };

Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


template <class Tipo> bool Lista<Tipo>::EliComienzo(Tipo &Valor) { Apuntador viejo; if (!Vacia()) { viejo=Primero; Valor=viejo->info; Primero=Primero->prox; delete viejo; return true; } else return false; };

Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


template <class Tipo> bool Lista<Tipo>::InsDespues(Apuntador p,Tipo Valor) { Apuntador nuevo; if (!Llena()) if (p==NULL) return false; else { nuevo=new nodo<Tipo>; nuevo->info=Valor; nuevo->prox=p->prox; p->prox=nuevo; return true; } else return false; };
Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


template <class Tipo> bool Lista<Tipo>::EliDespues(Apuntador p,Tipo &Valor) { Apuntador viejo; if (p==NULL) return false; else if (p->prox==NULL) return false; else { viejo=p->prox; Valor=viejo->info; p->prox=viejo->prox; delete viejo; return true; }; };
Programacin No Numrica I Estructura de Datos

template <class Tipo> nodo<Tipo>* Lista<Tipo>::ObtProx(Apuntador p) { return p->prox; }; template <class Tipo> void Lista<Tipo>::AsigProx(Apuntador p,Apuntador q) { p->prox=q; }; template <class Tipo> Tipo Lista<Tipo>::ObtInfo(Apuntador p) { return p->info; }; template <class Tipo> void Lista<Tipo>::AsigInfo(Apuntador p,Tipo Valor) { p->info=Valor; };
Programacin No Numrica I Estructura de Datos

IMPLEMENTACION DE LISTA LINEAL SIMPLEMENTE ENLAZADA


template <class Tipo> Lista<Tipo>::~Lista() { nodo<Tipo> *p; while (!Vacia()) { p=Primero->prox; delete Primero; Primero=p; }; };

Programacin No Numrica I Estructura de Datos

APLICACION DE LISTA LINEAL SIMPLEMENTA ENLAZADA EJEMPLO:


Codificar un programa que lea por teclado 10 nmeros enteros y los inserte en una lista.
#include <cstdlib> #include <iostream> #include "Lista.h" using namespace std; int main(int argc, char *argv[]) { Lista<int> Lista1; int valor; for(int i=0; i<10;i++) { cout << "Introduzca un numero: " << endl; cin >> valor; Lista1.InsComienzo(valor); } system("PAUSE"); return EXIT_SUCCESS; }
Programacin No Numrica I Estructura de Datos

EJEMPLO:
Codificar un programa que lea por teclado 10 nmeros enteros, y los inserte en una lista por orden de entrada y luego los imprima.
#include "Lista.h" using namespace std; int main(int argc, char *argv[]) { Lista<int> Lista1; nodo<int> *ap; int valor; for(int i=0; i<10;i++) { cout << "Introduzca un numero: " << endl; cin >> valor; if (Lista1.Vacia()) { Lista1.InsComienzo(valor); ap=Lista1.ObtPrimero(); } else { Lista1.InsDespues(ap,valor); ap=Lista1.ObtProx(ap); } }
Programacin No Numrica I Estructura de Datos

ap=Lista1.ObtPrimero(); while(ap!=NULL) { valor=Lista1.ObtInfo(ap); cout << "valor: " << valor << endl; ap=Lista1.ObtProx(ap); } system("PAUSE"); return EXIT_SUCCESS; }

Programacin No Numrica I Estructura de Datos

EJEMPLO:
Codificar un programa que lea por teclado 10 nmeros enteros, y los inserte en una lista de manera ordenada.
#include "Lista.h typedef nodo<int>* Apuntador; Lista<int> Lista1; Apuntador ap,sig; int valor,valoraux; int main() { for(int i=1;i<=10;i++) { cout << "Numero :"; cin >> valor; ap=Lista1.ObtPrimero(); if (Lista1.Vacia()) Lista1.InsComienzo(valor); else {

Programacin No Numrica I Estructura de Datos

valoraux=Lista1.ObtInfo(Lista1.ObtPrimero()); if (valor<valoraux) Lista1.InsComienzo(valor); else while (ap!=NULL) { sig=Lista1.ObtProx(ap); if (sig==NULL) { Lista1.InsDespues(ap,valor); ap=NULL; } else { valoraux=Lista1.ObtInfo(sig); if (valor<valoraux) { Lista1.InsDespues(ap,valor); ap=NULL; } else ap=sig; }; }; }; }; };

Programacin No Numrica I Estructura de Datos