SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Implantación de listas en
          C++
        Apoyo SSD5
Una Plantilla de la Clase Lista

En esta sección examinaremos la
implantación de una clase de lista
encadenada (linked list class).
Iniciaremos examinando algunos
requerimientos importantes que queremos
que nuestra clase soporte.



               Mtl Lourdes Cahuich    2
Lista encadenada
Asumamos que la lista de la clase, que
llamaremos LinkedList, necesita soportar
solamente recorridos hacia adelante.
Por esta razón, podemos implantar la
clase como una lista sencillamente-
encadenada.



                Mtl Lourdes Cahuich        3
Lista encadenada
También podemos asumir que la clase
LinkedList necesita soportar la
inserción y eliminación de elementos del
frente y detrás de la lista.
Para soportar este requerimiento, nuestra
clase mantendrá apuntadores al inicio y al
final de la lista.


                 Mtl Lourdes Cahuich         4
Lista encadenada
Finalmente, nos gustaría usar esta clase
para almacenar listas de enteros, cadenas
de caracteres, o cualquier tipo de datos.
Esto requiere que la clase sea una
plantilla (template).




                Mtl Lourdes Cahuich     5
template <class T>
class LinkedList {
public:
    LinkedList();   // constructor default
    LinkedList(const LinkedList<T>& src);
    //constructor copy
    ~LinkedList(); // Destructor
    T& front(); //Accesar al primer elemento
    T& back();   //Accesar al último elemento
    int size(); //Total de elementos
    bool empty(); //Si esta vacia la lista
    void push_front(const T&); //Insertar al inicio
    void push_back(const T&); //Insertar al final
    void pop_front(); //Quitar elemento del inicio
    void pop_back(); //Quitar elemento del final
    void dump(); //sacar los elementos de la lista
};


                      Mtl Lourdes Cahuich             6
Representación de Nodos
Ahora que tenemos una idea de las
funciones miembro que la clase implanta,
enfoquémonos y pensemos en como
podemos representar un nodo de la lista
encadenada.
Sabemos que un nodo debe almacenar
los datos de los elementos y cualquier
información necesaria para mantener la
estructura de la lista encadenada.

                Mtl Lourdes Cahuich        7
Lista encadenada
Debido a se trata de la implantación de
una lista sencillamente-encadenada, la
única información que requerimos
almacenar es un apuntador al siguiente
nodo de la lista




                Mtl Lourdes Cahuich       8
template <class T>
class LinkedList {
private:
    class Node {
        T data;
        Node* next;
    };
public:
    // aquí van elementos públicos
 ...          Mtl Lourdes Cahuich    9
Lista encadenada
La clase anterior es una representación
adecuada de un nodo para una lista
sencillamente-encadenada.
Contiene un elemento para almacenar los
datos para el nodo y un apuntador al
siguiente nodo.



                Mtl Lourdes Cahuich       10
Lista encadenada
Dentro del contexto de nuestra clase de
lista encadenada, la clase Node requiere
de más características.
Primero, agregamos un constructor que
permite la inicialización de los datos
miembro de la clase.



                Mtl Lourdes Cahuich        11
Lista encadenada
También añadimos un estatuto friend
que permite a las funciones miembro de la
clase LinkedList acceder a los datos
miembro privados de la clase Node.




                Mtl Lourdes Cahuich     12
template <class T>
class LinkedList {
private:
    class Node {
         friend class LinkedList<T>;
    private:
         T data;
         Node* next;
    public:
           Node(T d, Node* n = NULL) :
    data(d), next(n) {}}

;
                    Mtl Lourdes Cahuich   13
Lista encadenada
El listado anterior define completamente a
la clase Node dentro de la clase
LinkedList.
Esto se hace principalmente por
conveniencia, de manera que no
tengamos que especificar el tipo de la
plantilla cada vez que declaramos un
objeto de tipo Node

                 Mtl Lourdes Cahuich     14
Lista encadenada
La definición de la clase Node en este
listado, agrega un constructor e incluye
estatutos explícitos de los datos miembro
privados y públicos.
También, el estatuto friend permite a los
objetos de la clase LinkedList acceder
a los datos miembros de la clase Node


                Mtl Lourdes Cahuich     15
Lista encadenada
Se requiere agregar otros datos miembro
privados a la clase LinkedList.
Se añaden apuntadores al inicio y al final
de la lista.
La implantación de nuestra función
miembro usa estos apuntadores para
manipular la lista; también se añade un
dato miembro para almacenar el tamaño
de la lista.
                 Mtl Lourdes Cahuich         16
template <class T>
class LinkedList {
private:
    class Node {
        friend class LinkedList<T>;
     private:
        T data;
        Node* next;
    public:
       Node(T d, Node* n = NULL) : data(d), next(n)
 {}}
   ;
   Node* head; // inicio de la lista
   Node* tail; // final de la lista
   int count; // núm. Cahuich Elementos en la lista
                  Mtl Lourdes                     17
Funciones Miembro Sencillas
Ahora podemos implantar algunas de las
funciones miembro más sencillas de la
clase LinkedList.
El siguiente listado contiene
implantaciones para el constructor default
y las funciones miembro front, back,
size y empty.


                 Mtl Lourdes Cahuich         18
// Constructor por default
LinkedList(void) : head(NULL), tail(NULL),
  count(0) {}
// Regresa la referencia al 1er elemento
T& front(void) {
    assert (head != NULL);
    return head->data;}
// Regresa la referencia al último elemento
T& back(void) {
    assert (tail != NULL);
    return tail->data;}
// Regresa el contador de elementos de la lista
int size(void) {       return count;}
// Regresa si la lista tiene o no elementos
bool empty(void) {        return count == 0;}
                       Mtl Lourdes Cahuich        19
Insertar y Remover desde el Inicio
 Insertar un elemento al inicio de la lista
 es un proceso relativamente directo.
 Las tareas involucradas son:
      Crear un objeto nuevo Node.
 1.

      Encadenar el nuevo nodo al inicio de la lista.
 2.
      Reposicionar el apuntador head para reflejar
 3.
      el nuevo inicio de la lista.
      Incrementar el conteo de elementos en uno.
 4.


                      Mtl Lourdes Cahuich          20
Insertar y Remover desde el Inicio
Debido a que también debemos mantener
un apuntador al final de la lista, existe un
caso especial cuando añadimos un
elemento a una lista vacía.
En este caso, el elemento que agregamos
no sólo se convierte en el elemento inicial
de la lista, también se convierte en el
elemento final de la lista.

                 Mtl Lourdes Cahuich       21
Insertar y Remover desde el Inicio
Este caso especial es conocido como una
condición de límites o boundary condition.
Una condición de límites es un punto o un
caso en un algoritmo, que debe ser
manejado de manera diferente.




                 Mtl Lourdes Cahuich     22
Inserción en una lista vacía
template <class T>
void LinkedList<T>::push_front(T d) {
    Node* new_head = new Node(d, head);
    if (this->empty()) {
        head = new_head;
        tail = new_head;
    }
    else {
        head = new_head;
    }
    count++;
}
                  Mtl Lourdes Cahuich     23
Eliminar una lista con un elemento
La implantación del método pop_front,
por razones similares al método
push_front, también cuenta para una
condición de límites.
En este método, el caso especial ocurre
cuando el tamaño de la lista es igual a
uno.


                Mtl Lourdes Cahuich       24
Eliminar una lista con un elemento
template <class T>
void LinkedList<T>::pop_front(void) {
    assert(head != NULL);
    Node* old_head = head;
    if (this->size() == 1) {
        head = NULL;
        tail = NULL;
    }
    else {
        head = head->next;
    }
    delete old_head;
    count--;
}                  Mtl Lourdes Cahuich   25
Insertar y Remover desde el Final
Insertar un elemento al final de la lista
(push_back) es similar a insertarlo al
inicio (push_front).
La principal diferencia es el apuntador
utilizado en la operación.
Al usar (push_back), insertamos un
elemento, encadenando un nodo nuevo al
apuntador tail.
                Mtl Lourdes Cahuich     26
Insertar y Remover desde el Final
El método pop_back, por otro lado, no se
parece a ninguno de los métodos que
hemos implantado hasta ahora.
Los pasos requeridos para completar esta
operación son los siguientes.
  Reposicionar el apuntador tail al nodo
  previo al último elemento.
  Liberar la memoria usada para el último nodo
  de la lista.
                  Mtl Lourdes Cahuich        27
Insertar y Remover desde el Final
El primer paso mencionado anteriormente,
reposicionar el apuntador tail, añade
algo de complejidad a la implantación.
Reposicionar requiere que regresemos un
nodo el apuntador tail
La única forma de mover un apuntador al
nodo justo antes del último nodo es
recorrer la lista
                Mtl Lourdes Cahuich    28
El Destructor
El destructor para nuestra clase de lista
encadenada debe liberar cualquier
memoria que pudimos haber asignado (en
los métodos push_front y push_back).
Podemos nivelar nuestra implantación del
método pop_front para brindar una
implantación del destructor simple y
efectiva.

                Mtl Lourdes Cahuich     29
// Destructor
template <class T>
LinkedList<T>::~LinkedList(void)
  {
     while (! this->empty()) {
    this->pop_front();
  }
}

              Mtl Lourdes Cahuich   30
El Constructor Copy
Debido a que nuestra clase de lista encadenada
asigna memoria dinámicamente, necesitamos
implantar un constructor copy.
Esto es para asegurar que cuando se haga una
copia de la lista, también se haga una copia de
los datos de la lista.
De otra forma, podríamos tener dos
apuntadores de los objetos de la lista (head y
tail) apuntando a los mismos nodos.

                   Mtl Lourdes Cahuich        31
// constructor copy
template <class T>
LinkedList<T>::LinkedList(const
  LinkedList<T>& src) :count(0), head(NULL),
  tail(NULL)
 {
    Node* current = src.head;
    while (current != NULL) {
         this->push_back(current->data);
         current = current->next;
    }
}
                  Mtl Lourdes Cahuich      32
Cómo desplegar el contenido de la
             lista
 La última función miembro que
 implantamos para la clase LinkedList
 es el método print_list.
 Este método despliega el contenido de la
 lista al flujo de salida estándar.




                 Mtl Lourdes Cahuich        33
// Muestra el contenido de la lista
template <class T>
void LinkedList<T>::dump(void) {
    cout << quot;(quot;;
    Node* current = head;
    if (current != NULL) {
        while (current->next != NULL) {
            cout << current->data << quot;, quot;;
            current = current->next;
        }
        cout << current->data;
    }
    cout << quot;)quot; << endl;
 }
                  Mtl Lourdes Cahuich        34

Mais conteúdo relacionado

Mais procurados

Estructura de datos
Estructura de datosEstructura de datos
Estructura de datoscharlezgt
 
Unidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicasUnidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicasrehoscript
 
Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadasguestbd36f7
 
Estructura de datos_Listas encadenadas presentacion
Estructura de datos_Listas encadenadas  presentacionEstructura de datos_Listas encadenadas  presentacion
Estructura de datos_Listas encadenadas presentacionGabriely Peña
 
Estructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasEstructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasElias Peña
 
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)Eli Diaz
 
Listas c#
Listas c#Listas c#
Listas c#rezzaca
 
Estructuras dinámicas
Estructuras dinámicasEstructuras dinámicas
Estructuras dinámicasPatriciaU
 

Mais procurados (20)

Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Listas,pilas&colas yorka
Listas,pilas&colas yorkaListas,pilas&colas yorka
Listas,pilas&colas yorka
 
Listas y Pilas
Listas y PilasListas y Pilas
Listas y Pilas
 
Unidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicasUnidad 3 estructuras lineales estaticas y dinamicas
Unidad 3 estructuras lineales estaticas y dinamicas
 
Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
Tipos de listas en estructura de datos
Tipos de listas en estructura de datosTipos de listas en estructura de datos
Tipos de listas en estructura de datos
 
Listas, pilas y colas
Listas, pilas y colasListas, pilas y colas
Listas, pilas y colas
 
Listas
ListasListas
Listas
 
Estructura de datos_Listas encadenadas presentacion
Estructura de datos_Listas encadenadas  presentacionEstructura de datos_Listas encadenadas  presentacion
Estructura de datos_Listas encadenadas presentacion
 
Listas Pilas Colas
Listas Pilas ColasListas Pilas Colas
Listas Pilas Colas
 
Estructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasEstructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colas
 
Listas encadenadas
Listas encadenadas Listas encadenadas
Listas encadenadas
 
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)
Investigacion ed (pseudocodigo, algoritmo, listas, colas, arboles)
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
Listas c#
Listas c#Listas c#
Listas c#
 
Estructuras dinámicas
Estructuras dinámicasEstructuras dinámicas
Estructuras dinámicas
 
Estructuras lineales
Estructuras linealesEstructuras lineales
Estructuras lineales
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Estructura datos pilas y colas
Estructura datos pilas y colasEstructura datos pilas y colas
Estructura datos pilas y colas
 

Destaque (8)

Estructura de Datos, Multilistas
Estructura de Datos, MultilistasEstructura de Datos, Multilistas
Estructura de Datos, Multilistas
 
Listas Enlazadas
Listas EnlazadasListas Enlazadas
Listas Enlazadas
 
El case y sus partes
El case y sus partesEl case y sus partes
El case y sus partes
 
Componentes del case
Componentes del caseComponentes del case
Componentes del case
 
Tipos de case
Tipos de caseTipos de case
Tipos de case
 
El case
El caseEl case
El case
 
Clasificación de Gabinentes - Arquitectura de PC
Clasificación de Gabinentes - Arquitectura de PCClasificación de Gabinentes - Arquitectura de PC
Clasificación de Gabinentes - Arquitectura de PC
 
Case y tipos de case
Case y tipos de caseCase y tipos de case
Case y tipos de case
 

Semelhante a 8 Listas Encadenadas 2a Parte

10 Pilas
10 Pilas10 Pilas
10 PilasUVM
 
ED Listas, Pilas y Colas
ED Listas, Pilas y ColasED Listas, Pilas y Colas
ED Listas, Pilas y Colasiventura26
 
Estructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasEstructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasElias Peña
 
19 Contenedores De Stl Basados En Arboles
19 Contenedores De Stl Basados En Arboles19 Contenedores De Stl Basados En Arboles
19 Contenedores De Stl Basados En ArbolesUVM
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colaslabarra90
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colaslabarra90
 
Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314Edward Mejia Gomez
 
Listas, pilas & colas
Listas, pilas & colasListas, pilas & colas
Listas, pilas & colasjorgeluis0317
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrbviela6
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrbviela6
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrbviela6
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrbviela6
 
Estructura dedatos listas pilas y colas 12-0617
Estructura dedatos listas pilas y colas 12-0617Estructura dedatos listas pilas y colas 12-0617
Estructura dedatos listas pilas y colas 12-0617Johannadotel
 
Informe declaracion de listas David Ratmiroff.pdf
Informe declaracion de listas David Ratmiroff.pdfInforme declaracion de listas David Ratmiroff.pdf
Informe declaracion de listas David Ratmiroff.pdfYuriratmiroff
 

Semelhante a 8 Listas Encadenadas 2a Parte (20)

10 Pilas
10 Pilas10 Pilas
10 Pilas
 
ED Listas, Pilas y Colas
ED Listas, Pilas y ColasED Listas, Pilas y Colas
ED Listas, Pilas y Colas
 
LISTAS
LISTASLISTAS
LISTAS
 
Estructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colasEstructura de datos listas, pilas y colas
Estructura de datos listas, pilas y colas
 
19 Contenedores De Stl Basados En Arboles
19 Contenedores De Stl Basados En Arboles19 Contenedores De Stl Basados En Arboles
19 Contenedores De Stl Basados En Arboles
 
Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
Listas enlazadas
Listas enlazadasListas enlazadas
Listas enlazadas
 
06 listas1 t2018
06 listas1 t201806 listas1 t2018
06 listas1 t2018
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colas
 
Tad lista, pilas y colas
Tad lista, pilas y colasTad lista, pilas y colas
Tad lista, pilas y colas
 
Nelson Villacres listas
Nelson Villacres listasNelson Villacres listas
Nelson Villacres listas
 
Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314Listas pilascolas edward.mejia-10-1314
Listas pilascolas edward.mejia-10-1314
 
Presentacion pilas lista y colas
Presentacion pilas lista y colas  Presentacion pilas lista y colas
Presentacion pilas lista y colas
 
Listas, pilas & colas
Listas, pilas & colasListas, pilas & colas
Listas, pilas & colas
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
Estructura dedatos listas pilas y colas 12-0617
Estructura dedatos listas pilas y colas 12-0617Estructura dedatos listas pilas y colas 12-0617
Estructura dedatos listas pilas y colas 12-0617
 
Informe declaracion de listas David Ratmiroff.pdf
Informe declaracion de listas David Ratmiroff.pdfInforme declaracion de listas David Ratmiroff.pdf
Informe declaracion de listas David Ratmiroff.pdf
 

Mais de UVM

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programaciónUVM
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaUVM
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempoUVM
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosUVM
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglosUVM
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadoresUVM
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlUVM
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadoresUVM
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicosUVM
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datosUVM
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funcionesUVM
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funcionesUVM
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bitsUVM
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreUVM
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3UVM
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuarioUVM
 
Función main()
Función main()Función main()
Función main()UVM
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++UVM
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoUVM
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++UVM
 

Mais de UVM (20)

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programación
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación Avanzada
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempo
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicos
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglos
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadores
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stl
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadores
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicos
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datos
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funciones
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funciones
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bits
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembre
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuario
 
Función main()
Función main()Función main()
Función main()
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agosto
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++
 

8 Listas Encadenadas 2a Parte

  • 1. Implantación de listas en C++ Apoyo SSD5
  • 2. Una Plantilla de la Clase Lista En esta sección examinaremos la implantación de una clase de lista encadenada (linked list class). Iniciaremos examinando algunos requerimientos importantes que queremos que nuestra clase soporte. Mtl Lourdes Cahuich 2
  • 3. Lista encadenada Asumamos que la lista de la clase, que llamaremos LinkedList, necesita soportar solamente recorridos hacia adelante. Por esta razón, podemos implantar la clase como una lista sencillamente- encadenada. Mtl Lourdes Cahuich 3
  • 4. Lista encadenada También podemos asumir que la clase LinkedList necesita soportar la inserción y eliminación de elementos del frente y detrás de la lista. Para soportar este requerimiento, nuestra clase mantendrá apuntadores al inicio y al final de la lista. Mtl Lourdes Cahuich 4
  • 5. Lista encadenada Finalmente, nos gustaría usar esta clase para almacenar listas de enteros, cadenas de caracteres, o cualquier tipo de datos. Esto requiere que la clase sea una plantilla (template). Mtl Lourdes Cahuich 5
  • 6. template <class T> class LinkedList { public: LinkedList(); // constructor default LinkedList(const LinkedList<T>& src); //constructor copy ~LinkedList(); // Destructor T& front(); //Accesar al primer elemento T& back(); //Accesar al último elemento int size(); //Total de elementos bool empty(); //Si esta vacia la lista void push_front(const T&); //Insertar al inicio void push_back(const T&); //Insertar al final void pop_front(); //Quitar elemento del inicio void pop_back(); //Quitar elemento del final void dump(); //sacar los elementos de la lista }; Mtl Lourdes Cahuich 6
  • 7. Representación de Nodos Ahora que tenemos una idea de las funciones miembro que la clase implanta, enfoquémonos y pensemos en como podemos representar un nodo de la lista encadenada. Sabemos que un nodo debe almacenar los datos de los elementos y cualquier información necesaria para mantener la estructura de la lista encadenada. Mtl Lourdes Cahuich 7
  • 8. Lista encadenada Debido a se trata de la implantación de una lista sencillamente-encadenada, la única información que requerimos almacenar es un apuntador al siguiente nodo de la lista Mtl Lourdes Cahuich 8
  • 9. template <class T> class LinkedList { private: class Node { T data; Node* next; }; public: // aquí van elementos públicos ... Mtl Lourdes Cahuich 9
  • 10. Lista encadenada La clase anterior es una representación adecuada de un nodo para una lista sencillamente-encadenada. Contiene un elemento para almacenar los datos para el nodo y un apuntador al siguiente nodo. Mtl Lourdes Cahuich 10
  • 11. Lista encadenada Dentro del contexto de nuestra clase de lista encadenada, la clase Node requiere de más características. Primero, agregamos un constructor que permite la inicialización de los datos miembro de la clase. Mtl Lourdes Cahuich 11
  • 12. Lista encadenada También añadimos un estatuto friend que permite a las funciones miembro de la clase LinkedList acceder a los datos miembro privados de la clase Node. Mtl Lourdes Cahuich 12
  • 13. template <class T> class LinkedList { private: class Node { friend class LinkedList<T>; private: T data; Node* next; public: Node(T d, Node* n = NULL) : data(d), next(n) {}} ; Mtl Lourdes Cahuich 13
  • 14. Lista encadenada El listado anterior define completamente a la clase Node dentro de la clase LinkedList. Esto se hace principalmente por conveniencia, de manera que no tengamos que especificar el tipo de la plantilla cada vez que declaramos un objeto de tipo Node Mtl Lourdes Cahuich 14
  • 15. Lista encadenada La definición de la clase Node en este listado, agrega un constructor e incluye estatutos explícitos de los datos miembro privados y públicos. También, el estatuto friend permite a los objetos de la clase LinkedList acceder a los datos miembros de la clase Node Mtl Lourdes Cahuich 15
  • 16. Lista encadenada Se requiere agregar otros datos miembro privados a la clase LinkedList. Se añaden apuntadores al inicio y al final de la lista. La implantación de nuestra función miembro usa estos apuntadores para manipular la lista; también se añade un dato miembro para almacenar el tamaño de la lista. Mtl Lourdes Cahuich 16
  • 17. template <class T> class LinkedList { private: class Node { friend class LinkedList<T>; private: T data; Node* next; public: Node(T d, Node* n = NULL) : data(d), next(n) {}} ; Node* head; // inicio de la lista Node* tail; // final de la lista int count; // núm. Cahuich Elementos en la lista Mtl Lourdes 17
  • 18. Funciones Miembro Sencillas Ahora podemos implantar algunas de las funciones miembro más sencillas de la clase LinkedList. El siguiente listado contiene implantaciones para el constructor default y las funciones miembro front, back, size y empty. Mtl Lourdes Cahuich 18
  • 19. // Constructor por default LinkedList(void) : head(NULL), tail(NULL), count(0) {} // Regresa la referencia al 1er elemento T& front(void) { assert (head != NULL); return head->data;} // Regresa la referencia al último elemento T& back(void) { assert (tail != NULL); return tail->data;} // Regresa el contador de elementos de la lista int size(void) { return count;} // Regresa si la lista tiene o no elementos bool empty(void) { return count == 0;} Mtl Lourdes Cahuich 19
  • 20. Insertar y Remover desde el Inicio Insertar un elemento al inicio de la lista es un proceso relativamente directo. Las tareas involucradas son: Crear un objeto nuevo Node. 1. Encadenar el nuevo nodo al inicio de la lista. 2. Reposicionar el apuntador head para reflejar 3. el nuevo inicio de la lista. Incrementar el conteo de elementos en uno. 4. Mtl Lourdes Cahuich 20
  • 21. Insertar y Remover desde el Inicio Debido a que también debemos mantener un apuntador al final de la lista, existe un caso especial cuando añadimos un elemento a una lista vacía. En este caso, el elemento que agregamos no sólo se convierte en el elemento inicial de la lista, también se convierte en el elemento final de la lista. Mtl Lourdes Cahuich 21
  • 22. Insertar y Remover desde el Inicio Este caso especial es conocido como una condición de límites o boundary condition. Una condición de límites es un punto o un caso en un algoritmo, que debe ser manejado de manera diferente. Mtl Lourdes Cahuich 22
  • 23. Inserción en una lista vacía template <class T> void LinkedList<T>::push_front(T d) { Node* new_head = new Node(d, head); if (this->empty()) { head = new_head; tail = new_head; } else { head = new_head; } count++; } Mtl Lourdes Cahuich 23
  • 24. Eliminar una lista con un elemento La implantación del método pop_front, por razones similares al método push_front, también cuenta para una condición de límites. En este método, el caso especial ocurre cuando el tamaño de la lista es igual a uno. Mtl Lourdes Cahuich 24
  • 25. Eliminar una lista con un elemento template <class T> void LinkedList<T>::pop_front(void) { assert(head != NULL); Node* old_head = head; if (this->size() == 1) { head = NULL; tail = NULL; } else { head = head->next; } delete old_head; count--; } Mtl Lourdes Cahuich 25
  • 26. Insertar y Remover desde el Final Insertar un elemento al final de la lista (push_back) es similar a insertarlo al inicio (push_front). La principal diferencia es el apuntador utilizado en la operación. Al usar (push_back), insertamos un elemento, encadenando un nodo nuevo al apuntador tail. Mtl Lourdes Cahuich 26
  • 27. Insertar y Remover desde el Final El método pop_back, por otro lado, no se parece a ninguno de los métodos que hemos implantado hasta ahora. Los pasos requeridos para completar esta operación son los siguientes. Reposicionar el apuntador tail al nodo previo al último elemento. Liberar la memoria usada para el último nodo de la lista. Mtl Lourdes Cahuich 27
  • 28. Insertar y Remover desde el Final El primer paso mencionado anteriormente, reposicionar el apuntador tail, añade algo de complejidad a la implantación. Reposicionar requiere que regresemos un nodo el apuntador tail La única forma de mover un apuntador al nodo justo antes del último nodo es recorrer la lista Mtl Lourdes Cahuich 28
  • 29. El Destructor El destructor para nuestra clase de lista encadenada debe liberar cualquier memoria que pudimos haber asignado (en los métodos push_front y push_back). Podemos nivelar nuestra implantación del método pop_front para brindar una implantación del destructor simple y efectiva. Mtl Lourdes Cahuich 29
  • 30. // Destructor template <class T> LinkedList<T>::~LinkedList(void) { while (! this->empty()) { this->pop_front(); } } Mtl Lourdes Cahuich 30
  • 31. El Constructor Copy Debido a que nuestra clase de lista encadenada asigna memoria dinámicamente, necesitamos implantar un constructor copy. Esto es para asegurar que cuando se haga una copia de la lista, también se haga una copia de los datos de la lista. De otra forma, podríamos tener dos apuntadores de los objetos de la lista (head y tail) apuntando a los mismos nodos. Mtl Lourdes Cahuich 31
  • 32. // constructor copy template <class T> LinkedList<T>::LinkedList(const LinkedList<T>& src) :count(0), head(NULL), tail(NULL) { Node* current = src.head; while (current != NULL) { this->push_back(current->data); current = current->next; } } Mtl Lourdes Cahuich 32
  • 33. Cómo desplegar el contenido de la lista La última función miembro que implantamos para la clase LinkedList es el método print_list. Este método despliega el contenido de la lista al flujo de salida estándar. Mtl Lourdes Cahuich 33
  • 34. // Muestra el contenido de la lista template <class T> void LinkedList<T>::dump(void) { cout << quot;(quot;; Node* current = head; if (current != NULL) { while (current->next != NULL) { cout << current->data << quot;, quot;; current = current->next; } cout << current->data; } cout << quot;)quot; << endl; } Mtl Lourdes Cahuich 34