*
* Taller de Programación (75.42).
*
- * Ejercicio Número 2:
- * Programa calculadora.
+ * Ejercicio Número 3:
+ * Lista de figuras.
*
* Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
* Puede copiar, modificar y distribuir este programa bajo los términos de
*/
#include "dllist.h"
+#include <cstdlib>
-DLList::DLList(void): first(NULL), current(NULL), last(NULL) {}
+DLList::DLList(void): _first(NULL), _current(NULL), _last(NULL) {}
DLList::~DLList(void) {
/* Elimino los nodos. */
- while (!DLList_empty(list)) {
- DLList_pop(list);
+ while (!empty()) {
+ pop();
}
}
bool DLList::empty(void) {
- return this->first == NULL;
+ return _first == NULL;
}
void* DLList::begin(void) {
- this->current = this->first;
+ _current = _first;
/* Si hay un nodo, devulevo sus datos, si no NULL. */
- return this->current ? this->current->data : NULL;
+ return _current ? _current->data : NULL;
}
void* DLList::end(void) {
- this->current = this->last;
+ _current = _last;
/* Si hay un nodo, devulevo sus datos, si no NULL. */
- return this->current ? this->current->data : NULL;
+ return _current ? _current->data : NULL;
}
bool DLList::have_more(void) {
- return this->current != NULL;
+ return _current != NULL;
}
void* DLList::current(void) {
- return this->current ? this->current->data : NULL;
+ return _current ? _current->data : NULL;
}
void* DLList::next(void) {
- DLListNode* cur = this->current;
+ DLListNode* current = _current;
/* Si no está vacía ni ya fue terminada de recorrer. */
- if (cur) {
+ if (current) {
/* Apuntamos el actual al próximo. */
- this->current = cur->next;
+ _current = current->next;
/* Devolvemos los datos del próximo o NULL si no había otro. */
- return this->current ? this->current->data : NULL;
+ return _current ? _current->data : NULL;
/* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
} else {
return NULL;
}
void* DLList::prev(void) {
- DLListNode* cur = this->current;
+ DLListNode* current = _current;
/* Si no está vacía ni ya fue terminada de recorrer. */
- if (cur) {
+ if (current) {
/* Apuntamos el actual al anterior. */
- this->current = cur->prev;
+ _current = current->prev;
/* Devolvemos los datos del anterior o NULL si no había otro. */
- return this->current ? this->current->data : NULL;
+ return _current ? _current->data : NULL;
/* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
} else {
return NULL;
}
bool DLList::unshift(void* data) {
- DLListNode* node = new DLListNode(NULL, data, this->first);
+ DLListNode* node = new DLListNode(NULL, data, _first);
/* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
if (node) {
/* Apunto el nodo actual al nuevo nodo. */
- this->current = node;
+ _current = node;
/* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
- if (this->first == NULL) {
- this->first = node;
- this->last = node;
+ if (_first == NULL) {
+ _first = node;
+ _last = node;
/* Si no está vacía. */
} else {
/* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
- this->first->prev = node;
+ _first->prev = node;
/* Apunto el primer nodo de la lista al nuevo. */
- this->first = node;
+ _first = node;
}
return true;
} else {
}
bool DLList::push(void* data) {
- DLListNode* node = new DLListNode(this->last, data, NULL);
+ DLListNode* node = new DLListNode(_last, data, NULL);
/* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
if (node) {
/* Apunto el nodo actual al nuevo nodo. */
- this->current = node;
+ _current = node;
/* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
- if (this->first == NULL) {
- this->first = node;
- this->last = node;
+ if (_first == NULL) {
+ _first = node;
+ _last = node;
/* Si no está vacía. */
} else {
/* Apunto el próximo nodo del último nodo de la lista al nuevo. */
- this->last->next = node;
+ _last->next = node;
/* Apunto el último nodo de la lista al nuevo. */
- this->last = node;
+ _last = node;
}
return true;
} else {
void* DLList::shift(void) {
// Si está vacía devuelve NULL.
- if (this->first == NULL) {
+ if (_first == NULL) {
return NULL;
}
/* Primer nodo */
- DLListNode* node = this->first;
+ DLListNode* node = _first;
/* Datos del primer nodo. */
void* data = node->data;
/* Pongo como primer nodo al siguiente. */
- this->first = node->next;
+ _first = node->next;
/* Pongo al primero como nodo actual. */
- this->current = this->first;
+ _current = _first;
/* Si era el único pongo el último en NULL. */
- if (!this->first) {
- this->last = NULL;
+ if (!_first) {
+ _last = NULL;
/* Si no, pongo el anterior en NULL. */
} else {
- this->first->prev = NULL;
+ _first->prev = NULL;
}
/* Libero memoria del nodo. */
delete node;
void* DLList::pop(void) {
// Si está vacía devuelve NULL.
- if (this->first == NULL) {
+ if (_first == NULL) {
return NULL;
}
/* Último nodo */
- DLListNode* node = this->last;
+ DLListNode* node = _last;
/* Datos del último nodo. */
void* data = node->data;
/* Pongo como último nodo al anterior. */
- this->last = node->prev;
+ _last = node->prev;
/* Pongo al último como nodo actual. */
- this->current = this->last;
+ _current = _last;
/* Si era el único pongo el primero en NULL. */
- if (!this->last) {
- this->first = NULL;
+ if (!_last) {
+ _first = NULL;
/* Si no, pongo el siguiente en NULL. */
} else {
- this->last->next = NULL;
+ _last->next = NULL;
}
/* Libero memoria del nodo. */
delete node;
void* DLList::remove_current(void) {
// Si no hay un nodo seleccionado devuelve NULL.
- if (this->current == NULL) {
+ if (_current == NULL) {
return NULL;
}
/* Nodo actual */
- DLListNode* current = this->current;
+ DLListNode* current = _current;
/* Datos del nodo actual. */
void* data = current->data;
/* Si tiene siguiente. */
current->next->prev = current->prev;
/* Si no tiene siguiente, se pone como último al anterior del actual. */
} else {
- this->last = current->prev;
+ _last = current->prev;
}
/* Si tiene anterior. */
if (current->prev) {
current->prev->next = current->next;
/* Si no tiene anterior, se pone como primero al siguiente del actual. */
} else {
- this->first = current->next;
+ _first = current->next;
}
/* Pongo como elemento actual al próximo elemento. */
- this->current = current->next;
+ _current = current->next;
/* Libero memoria del nodo. */
delete current;
return data;
* Taller de Programación (75.42).
*
* Ejercicio Número 3:
- * TODO
+ * Lista de figuras.
*
* Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
* Puede copiar, modificar y distribuir este programa bajo los términos de
#ifndef DLLIST_H
#define DLLIST_H
-/** Nodo de la lista doblemente enlazada. */
+#include <cstdlib>
+
+/// Nodo de la lista doblemente enlazada.
struct DLListNode {
- /** Puntero al nodo anterior. */
+
+ /// Puntero al nodo anterior.
DLListNode* prev;
- /** Datos almacenados en el nodo. */
+
+ /// Datos almacenados en el nodo.
void* data;
- /** Puntero al próximo nodo. */
+
+ /// Puntero al próximo nodo.
DLListNode* next;
+
+ /// Constructor.
+ DLListNode(DLListNode* prev = NULL, void* data = NULL,
+ DLListNode* next = NULL): prev(prev), data(data), next(next) {}
+
};
-/**
- * Lista doblemente enlazada.
- */
+/// Lista doblemente enlazada.
class DLList {
protected:
- /** Puntero al primer nodo. */
- DLListNode* first;
- /** Puntero al nodo actual. */
- DLListNode* current;
- /** Puntero al último nodo. */
- DLListNode* last;
+
+ /// Puntero al primer nodo.
+ DLListNode* _first;
+
+ /// Puntero al nodo actual.
+ DLListNode* _current;
+
+ /// Puntero al último nodo.
+ DLListNode* _last;
public:
- /**
- * Crea una nueva lista.
- */
+
+ /// Crea una nueva lista.
DLList(void);
- /**
- * Libera la memoria ocupada por una lista.
- */
- ~DLList(void);
+ /// Libera la memoria ocupada por una lista.
+ virtual ~DLList(void);
/**
* Indica si está vacía.
*/
void* remove_current(void);
+};
+
#endif /* DLLIST_H */