예제 #1
0
// Imprime cada uno de los elementos que hay en la lista, llamando al método
// print de cada nodo.
void LinkedList::print()const {
    DLLNode* tmp = head;
    for (int i=0; i < getSize; i++){
        tmp->print();
        tmp = tmp->getNext();
    }    
}
예제 #2
0
// Consigue el elemento index de la lista, si index es una posición válida
Object* LinkedList::get(int index)const {
    if (index < 0 || index >= getSize)
        return NULL;
    DLLNode* tmp = head;
    for (int i=0; i < index; i++)
        tmp = tmp->getNext();
    return tmp->getData();
}
예제 #3
0
// Retorna el último elemento de la lista, si es que hay alguno
Object* LinkedList::last()const {
    if (!head)
        return NULL;
    DLLNode* tmp = head;
    for (int i=0; i < getSize -1; i++)
        tmp = tmp->getNext();
    return tmp->getData();
}
예제 #4
0
TDAList* LinkedList::toFArrayList()const{
    TDAList* retVal = new FArrayList(getSize);
    DLLNode* temp = head;
    for (int i = 0; i<getSize ; i++){
        retVal->insert(temp->getData(),i);
        temp = temp->getNext();
    }
    return retVal;
}
예제 #5
0
/* 
* Inserción en la lista
* En esta operación se consideran cuatro casos generales de inserción:
* (A) La Lista está Vacía
* (B) Se desea Insertar antes de head (pos = 0)
* (C) Se desea Insertar en Medio de la Lista
* (D) Se desea Insertar al Final (pos = getSize)
*/
bool LinkedList::insert(Object* data, int pos) {
    // Si se desa meter en una posición inválida
    if (pos < 0 || pos > getSize)
        return false; // Fracaso en esta Operación
    
    // Creación del Nodo que insertaremos en la lista
    DLLNode* neo = new DLLNode(data);
    
    if (!head) // La lista está vacía
        head = neo;
    else { // La Lista tiene elementos
        if (pos == 0){ // Desea insertar al principio de la lista
            // Enlace de neo a la lista
            head->setPrev(neo);
            neo->setNext(head);
            // Actualizar la cabeza
            head = neo;
        }else if (pos > 0 && pos < getSize){ // Desea Insertar en medio
            DLLNode* tmp = head;
            // Recorrer hasta la posición anterior a la que deseamos insertar
            for (int i=1; i<pos; i++)
               tmp = tmp->getNext();
            // Enlazar el Nodo neo
            neo->setPrev(tmp);
            neo->setNext(tmp->getNext());
            tmp->getNext()->setPrev(neo);
            tmp->setNext(neo);
        }else { // Desea insertar al final
            DLLNode* tmp = head;
            // Recorrer la Lista hasta el final
            for (int i=1; i<pos; i++)
               tmp = tmp->getNext();
            // Enlazar el Nodo neo
            tmp->setNext(neo);
            neo->setPrev(tmp);        
        }    
    }
    // Incremento del tamaño
    getSize++;
    // Éxito en la operación
    return true;
}
예제 #6
0
/*
* Búsqueda del índice (posición) de un objeto
* Para que esta operación tenga éxito es necesario que los objetos que sean
* insertados en la lista tengan bien definido el método equals, pues es este
* método el que determinará la igualdad de un objeto con otro.
*/
int LinkedList::indexOf(Object* other)const {
    DLLNode* tmp = head;
    for (int i=0; i < getSize; i++){
        // Compara cada uno de los elementos con el parámetro
        if (tmp->getData()->equals(other))
                return i;
        tmp = tmp->getNext();
    }    
    // En el caso de no encontrarlo
    return -1;
}
예제 #7
0
/*
* Borra un elemento de la lista, dada la posición del mismo. Se consideran
* tres casos:
* (A) El Elemento es la Cabeza
* (B) El Elemento es el Último
* (C) El Elemento está en Medio
* Es importante recalcar que para borrar un elemento es necesario primero
* desenlazarlo de la lista y luego liberar su memoria, pues en caso contrario
* liberaríamos todos los elementos siguiente a este elemento.
*/
Object* LinkedList::remove(int pos) {
    // Si es una posición Inválida
    if (pos < 0 || pos >= getSize)
        return NULL; // Indicar fracaso en la operación
    DLLNode* tmp;
    Object* tmpData;
    if (pos == 0){ // Desea Borrar la Cabeza
        // Desenlazar
        tmpData = head->getData();
        tmp = head->getNext(); 
        head->setData(NULL);
        tmp->setPrev(NULL);
        head->setNext(NULL);
        // Liberar Memoria
        delete head;
        // Actualizar head
        head = tmp;
    }else if (pos == getSize - 1){ // Desea Borrar el último
        // Recorrer hasta el final
        tmp = head;
        for (int i=1; i<pos; i++)
           tmp = tmp->getNext();
        tmpData = tmp->getNext()->getData();
        // Desenlazar
        DLLNode* toErase = tmp->getNext();   
        tmp->setNext(NULL);
        toErase->setPrev(NULL);
        toErase->setData(NULL);
        
        // Liberar Memoria
        delete toErase; 
        
    }else { // Desea Borrar de enmedio
        // Recorrer hasta el nodo anterior al que se desea borrar
        tmp = head;
        for (int i=1; i<pos; i++)
           tmp = tmp->getNext();
        // Desenlazar
        tmpData = tmp->getNext()->getData();
        DLLNode* toErase = tmp->getNext();
        tmp->setNext(toErase->getNext());
        toErase->getNext()->setPrev(tmp);
        toErase->setNext(NULL);
        toErase->setPrev(NULL);
        toErase->setData(NULL);
        // Liberar Memoria
        delete toErase;        
    }
    getSize--; // Disminuir Tamaño
    return tmpData; // Indicar Éxito
}