Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
II Semestre 2002
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #3 [solución]

La lista circular

/* ADH_list.h  (C) 2002  adolfo@di-mare.com  */

typedef int T;

class ADH_list {
public:
    void push_front( const T& v );   // agrega el valor al principio
    void push_back(  const T& v );   // agrega el valor al final

    void pop_front();   // Elimina el valor del principio
    void pop_back();    // Elimina el valor del final

    bool empty() const;  // "true" si la lista está vacía
    T    first() const;  // Obtiene una copia del primer valor de la lista

    void operator=(const ADH_list& L); // LO = L
    void swap(ADH_list& L);   // intercambia *this <==> L

    void remove(const T& v);  // Elimina cada uno de los valores iguales a "v"

    friend ostream& operator << (ostream &, const ADH_list& );
    friend istream& operator >> (istream &,       ADH_list& );
};

// EOF: ADH_list.h
Figura 1: La clase lista

      La implementación del contenedor de la clase lista que le fue entragada en el aula corresponde al prototipo de la clase que está en la Figura 1. El modelo que corresponde a la implementación que usted ya conoce es el de la Figura 2.

 L ──>─┐
       │
       v
┌────────┬───┐   ┌────────┬───┐   ┌────────┬───┐
│ elem_1 │ *─┼──>│ elem_2 │ *─┼──>│ elem_3 │ *─┼─> NIL
└────────┴───┘   └────────┴───┘   └────────┴───┘
Figura 2: Lista simple

 L->last ───────────────────────────────────────┐
                                                │
┌────────────┐   ┌────────────┐   ┌───────────┐ │
│            v   │            v   │           v v
│ ┌────────┬───┐ │ ┌────────┬───┐ │ ┌────────┬───┐
│ │ elem_1 │ ├─┼─┘ │ elem_2 │ ├─┼─┘ │ elem_3 │ ├─┼─┐
│ └────────┴───┘   └────────┴───┘   └────────┴───┘ │
│            ^               next              ^   │
│            │                                 │   │
│          first                             last  v
└───────<───────────────<────────────────<─────────┘
Figura 3: Lista circular, con puntero al último nodo

      Esta tarea programada, ustede debe implementar la clase lista, usando una lista circular, de manera que en el Rep lo que exista es un puntero al último nodo de la lista, y de ése nodo, un puntero al primero, como se muestra en la Figura 3.

// USE_list.cpp (basado en)

// Fig. 20.17: fig20_17.cpp
// Testing Standard Library class list

#include <iostream>

#include "ADH_list.h"

void printList( const ADH_list 
&L ) {
    if ( L.empty() ) {
        cout << "List is empty";
    }
    else {
        ADH_list LO;
        LO = L; // Hace una copia
        while (! LO.empty()) {
            T val = LO.first();
            cout << "  " << val;
            LO.pop_front();
        }
    }
}


int main() {
    int a[] = { 2, 6, 4, 8 };
    const int SIZE = sizeof(a) / sizeof(a[0]);
    ADH_list LV, LO;

    LV.push_front( 1 );
    LV.push_front( 2 );
    LV.push_back( 4 );
    LV.push_back( 3 );

    cout << "LV contains: ";
    printList( LV );
//  LV.sort();
    cout << "\nLV after sorting contains: ";
    printList( LV );

//  LO.insert( LO.begin(), a, a + SIZE );
    cout << "\nLO contains: ";
    printList( LO );

//  LV.sort();
    cout << "\nLV contains: ";

    LV.pop_front();
    LV.pop_back();   // all sequence containers
    cout << "\nAfter pop_front and pop_back LV contains:\n";
    printList( LV );

    // method swap is available in all containers
    LV.swap( LO );
    cout << "\nAfter swap:\n   LV contains: ";
    printList( LV );
    cout << "\n   LO contains: ";
    printList( LO );

    LV.remove( 4 );
    cout << "\nAfter remove( 4 ) LV contains: ";
    printList( LV );
    cout << endl;
    return 0;
}

// EOF: USE_list.cpp
Figura 4: Programa que usa la lista

      Como muestra de que su lista funciona correctamente, su implementación debe producir los mismos resultados cuando el programa de la Figura 4 se usa con su lista, o con la vista en clase.

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 1 semana
Modalidad: Individual

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2002
Derechos de autor reservados © 2002
[home] <> [/\]