1 /* vim: set et sts=4 sw=4 fdm=indent fdn=1 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Graficador de figuras.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: sáb ago 30 20:34:45 ART 2003
24 DLList::DLList(void): first(NULL), curr(NULL), last(NULL) {
26 std::cerr << "En constructor de DLList." << std::endl;
30 DLList::~DLList(void) {
32 std::cerr << "En destructor de DLList." << std::endl;
34 /* Elimino los nodos. */
40 bool DLList::empty(void) {
44 void* DLList::begin(void) {
46 /* Si hay un nodo, devulevo sus datos, si no NULL. */
47 return curr ? curr->data : NULL;
50 void* DLList::end(void) {
52 /* Si hay un nodo, devulevo sus datos, si no NULL. */
53 return curr ? curr->data : NULL;
56 bool DLList::have_more(void) {
60 void* DLList::current(void) {
61 return curr ? curr->data : NULL;
64 void* DLList::next(void) {
65 DLListNode* new_curr = curr;
66 /* Si no está vacía ni ya fue terminada de recorrer. */
68 /* Apuntamos el actual al próximo. */
69 curr = new_curr->next;
70 /* Devolvemos los datos del próximo o NULL si no había otro. */
71 return curr ? curr->data : NULL;
72 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
78 void* DLList::prev(void) {
79 DLListNode* new_curr = curr;
80 /* Si no está vacía ni ya fue terminada de recorrer. */
82 /* Apuntamos el actual al anterior. */
83 curr = new_curr->prev;
84 /* Devolvemos los datos del anterior o NULL si no había otro. */
85 return curr ? curr->data : NULL;
86 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
92 bool DLList::unshift(void* data) {
93 DLListNode* node = new DLListNode(NULL, data, first);
94 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
96 /* Apunto el nodo actual al nuevo nodo. */
98 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
102 /* Si no está vacía. */
104 /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
106 /* Apunto el primer nodo de la lista al nuevo. */
115 bool DLList::push(void* data) {
116 DLListNode* node = new DLListNode(last, data, NULL);
117 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
119 /* Apunto el nodo actual al nuevo nodo. */
121 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
125 /* Si no está vacía. */
127 /* Apunto el próximo nodo del último nodo de la lista al nuevo. */
129 /* Apunto el último nodo de la lista al nuevo. */
138 void* DLList::shift(void) {
139 // Si está vacía devuelve NULL.
144 DLListNode* node = first;
145 /* Datos del primer nodo. */
146 void* data = node->data;
147 /* Pongo como primer nodo al siguiente. */
149 /* Pongo al primero como nodo actual. */
151 /* Si era el único pongo el último en NULL. */
154 /* Si no, pongo el anterior en NULL. */
158 /* Libero memoria del nodo. */
160 // Devuelvo elemento.
164 void* DLList::pop(void) {
165 // Si está vacía devuelve NULL.
170 DLListNode* node = last;
171 /* Datos del último nodo. */
172 void* data = node->data;
173 /* Pongo como último nodo al anterior. */
175 /* Pongo al último como nodo actual. */
177 /* Si era el único pongo el primero en NULL. */
180 /* Si no, pongo el siguiente en NULL. */
184 /* Libero memoria del nodo. */
186 // Devuelvo elemento.
190 void* DLList::remove_current(void) {
191 // Si no hay un nodo seleccionado devuelve NULL.
196 DLListNode* new_curr = curr;
197 /* Datos del nodo actual. */
198 void* data = new_curr->data;
199 /* Si tiene siguiente. */
200 if (new_curr->next) {
201 /* Se pone como anterior del siguiente al anterior del actual. */
202 new_curr->next->prev = new_curr->prev;
203 /* Si no tiene siguiente, se pone como último al anterior del actual. */
205 last = new_curr->prev;
207 /* Si tiene anterior. */
208 if (new_curr->prev) {
209 /* Se pone como siguiente del anterior al siguiente del actual. */
210 new_curr->prev->next = new_curr->next;
211 /* Si no tiene anterior, se pone como primero al siguiente del actual. */
213 first = new_curr->next;
215 /* Pongo como elemento actual al próximo elemento. */
216 curr = new_curr->next;
217 /* Libero memoria del nodo. */
219 // Devuelvo elemento.