1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
3 * Taller de Programación (75.42).
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
20 DLList::DLList(void): _first(NULL), _current(NULL), _last(NULL) {}
22 DLList::~DLList(void) {
23 /* Elimino los nodos. */
29 bool DLList::empty(void) {
30 return _first == NULL;
33 void* DLList::begin(void) {
35 /* Si hay un nodo, devulevo sus datos, si no NULL. */
36 return _current ? _current->data : NULL;
39 void* DLList::end(void) {
41 /* Si hay un nodo, devulevo sus datos, si no NULL. */
42 return _current ? _current->data : NULL;
45 bool DLList::have_more(void) {
46 return _current != NULL;
49 void* DLList::current(void) {
50 return _current ? _current->data : NULL;
53 void* DLList::next(void) {
54 DLListNode* current = _current;
55 /* Si no está vacía ni ya fue terminada de recorrer. */
57 /* Apuntamos el actual al próximo. */
58 _current = current->next;
59 /* Devolvemos los datos del próximo o NULL si no había otro. */
60 return _current ? _current->data : NULL;
61 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
67 void* DLList::prev(void) {
68 DLListNode* current = _current;
69 /* Si no está vacía ni ya fue terminada de recorrer. */
71 /* Apuntamos el actual al anterior. */
72 _current = current->prev;
73 /* Devolvemos los datos del anterior o NULL si no había otro. */
74 return _current ? _current->data : NULL;
75 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
81 bool DLList::unshift(void* data) {
82 DLListNode* node = new DLListNode(NULL, data, _first);
83 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
85 /* Apunto el nodo actual al nuevo nodo. */
87 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
91 /* Si no está vacía. */
93 /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
95 /* Apunto el primer nodo de la lista al nuevo. */
104 bool DLList::push(void* data) {
105 DLListNode* node = new DLListNode(_last, data, NULL);
106 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
108 /* Apunto el nodo actual al nuevo nodo. */
110 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
111 if (_first == NULL) {
114 /* Si no está vacía. */
116 /* Apunto el próximo nodo del último nodo de la lista al nuevo. */
118 /* Apunto el último nodo de la lista al nuevo. */
127 void* DLList::shift(void) {
128 // Si está vacía devuelve NULL.
129 if (_first == NULL) {
133 DLListNode* node = _first;
134 /* Datos del primer nodo. */
135 void* data = node->data;
136 /* Pongo como primer nodo al siguiente. */
138 /* Pongo al primero como nodo actual. */
140 /* Si era el único pongo el último en NULL. */
143 /* Si no, pongo el anterior en NULL. */
147 /* Libero memoria del nodo. */
152 void* DLList::pop(void) {
153 // Si está vacía devuelve NULL.
154 if (_first == NULL) {
158 DLListNode* node = _last;
159 /* Datos del último nodo. */
160 void* data = node->data;
161 /* Pongo como último nodo al anterior. */
163 /* Pongo al último como nodo actual. */
165 /* Si era el único pongo el primero en NULL. */
168 /* Si no, pongo el siguiente en NULL. */
172 /* Libero memoria del nodo. */
177 void* DLList::remove_current(void) {
178 // Si no hay un nodo seleccionado devuelve NULL.
179 if (_current == NULL) {
183 DLListNode* current = _current;
184 /* Datos del nodo actual. */
185 void* data = current->data;
186 /* Si tiene siguiente. */
188 /* Se pone como anterior del siguiente al anterior del actual. */
189 current->next->prev = current->prev;
190 /* Si no tiene siguiente, se pone como último al anterior del actual. */
192 _last = current->prev;
194 /* Si tiene anterior. */
196 /* Se pone como siguiente del anterior al siguiente del actual. */
197 current->prev->next = current->next;
198 /* Si no tiene anterior, se pone como primero al siguiente del actual. */
200 _first = current->next;
202 /* Pongo como elemento actual al próximo elemento. */
203 _current = current->next;
204 /* Libero memoria del nodo. */