Академический Документы
Профессиональный Документы
Культура Документы
Agenda
La clase NodoLEG Insercin de elementos Borrado de elementos Representacin enlazada vs. secuencial.
LEG con referencias al primer y ltimo nodo LEG circular LEG doblemente enlazada LEG ordenada
Objetivos
El objetivo general de este tema es estudiar la representacin enlazada de un grupo o coleccin de objetos como una alternativa a la representacin secuencial:
Representar en C++ un grupo o coleccin de elementos mediante una lista enlazada de nodos. Comparacin de la representacin enlazada y la secuencial Incidir en el mecanismo de genericidad de C++ Implementacin de distintos tipos de listas en base a criterios de eficiencia y claridad en su diseo
Introduccin
la
informacin
en
el
La memoria est compuesta por unidades bsicas: bits. El microprocesador, y por lo tanto nuestro programa, slo puede manejar directamente bytes o grupos de bytes. Cada byte tiene una direccin: direccin de memoria.
Coste constante para acceder al i-simo elemento del grupo: v[i]. Coste de insertar un elementos
P.e. insertar un elemento en la primera posicin de un array. Es necesario desplazar todos los elementos del array para dejar un hueco en la primera posicin El coste est en funcin del tamao del array (lineal respecto al nmero de elementos del array)
Coste de eliminar un elemento: en funcin del tamao del array (si se quiere mantener el orden de los elementos)
Una representacin enlazada de un grupo de elemtnos de un cierto tipo es una lista enlazada de nodos, es decir, una secuencia de odos situados en la memoria dinmica y conectados entre s P.e. lista de enteros {4, 8, 5, 3, 2}
Representacin secuencial: Representacin enlazada:
Dato Nodo
4
Referencia al siguiente nodo
2
NULL
El dato, de tipo genrico (para poder guardar cualquier tipo de objeto) Una referencia al nodo siguiente
template <class E> class NodoLEG { private: E dato; NodoLEG<E> *siguiente; public: NodoLEG(E dato, NodoLEG<E> *sig=NULL) { this->dato = dato; this->siguiente = sig; } ~NodoLEG( ){this->dato = 0; this->siguiente = NULL; } };
Una lista enlazada requiere, como mnimo, una referencia al primer nodo de la lista:
NodoLEG<E> *primero;
LEG
primero
NULL
En una lista podemos incluir un atributo que indique el nmero de elementos de la lista.
Lo ms eficiente es insertar al principio de la lista, pues tenemos una referencia al primer nodo P.e.: queremos insertar el elemento 1 en la siguiente lista:
LEG
primero
3
NULL
Paso 1
1
NULL
10
hacer que el nodo siguiente del nuevo nodo sea el primero de la lista: nuevo->siguiente = primero;
nuevo
1
LEG
primero 2 3
NULL
Paso 3
primero = nuevo;
LEG
11
primero
3
NULL
for (NodoLEG<E> *aux = l.primero; aux != null; aux = aux->siguiente) o<<aux->dato <<\n; return o; } ... }
12
Tenemos que averiguar, por lo tanto, cul es el nodo anterior del que queremos eliminar
13
return true;
}
}
14
La insercin y el borrado requieren del desplazamiento de parte (o todas) las componentes del array Reserva a priori de una cantidad de memoria mayor que el amao del grupo
Ejercicio 1: Aadir a la clase LEG un mtodo que inserte un nuevo elemento al final de la lista:
void insertarEnFin(E x);
3
NULL
16
17
18
19
LEG CIRCULAR
Una alternativa a la LEG con referencia al primer y ltimo nodo es la LEG circular: una LEGConUltimo en la que se obliga a que el siguiente al ltimo nodo sea el primero:
LEG
primero ultimo
Podemos prescindir de la referencia al primer nodo, pues ultimo.siguiente ya apunta al primer nodo
1
20
3
NULL
LEG CIRCULAR
template <class E> class LEGCircular { protected: NodoLEG<E> *ultimo; int tamanio; public: LEGCircular() { ultimo = null; tamanio = 0; } ... };
21
LEG CIRCULAR
... template <class E> void LEGCircular <E> :: insertar(E x) { NodoLEG<E> *nuevo = new NodoLEG<E> (x); nuevo->siguiente = nuevo; if (ultimo != null) { // Lista no vaca nuevo->siguiente = ultimo->siguiente; ultimo->siguiente = nuevo; } else ultimo = nuevo; // Lista vaca tamanio++; } ... }
22
En las LEG doblemente enlazadas cada nodo, adems de una referencia al nodo siguiente, tiene una referencia al nodo anterior
LEG
primero
NULL
1
NULL
23
NodoLDEG(E dato, NodoLDEG<E> *s=0, NodoLDEG<E> *a=0) { this->dato = dato; this->siguiente = s; this->anterior = a; } };
24
25
LEG ORDENADAS
En una LEG ordenada, los nodos de la lista se mantienen ordenados de acuerdo con un orden determinado:
LEG
primero
4
NULL
Si insertamos el elemento 3
LEG
primero
4
NULL
27
LEG ORDENADAS
template <class E> class LEGOrdenada: public LEG { ... public: void insertar(E x) { NodoLEG<E> *nuevo = new NodoLEG<E>(x); NodoLEG<E> *ant = NULL, *aux = primero; while (aux != NULL && aux->dato < x) { ant = aux; aux = aux->siguiente; } nuevo->siguiente = aux; if (ant != NULL) ant->siguiente = nuevo; else primero = nuevo; tamanio++; } ... }:
28