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).
6 * Programa calculadora.
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 bool DLList_init(DLList* list) {
21 /* Aloco memoria para la lista. */
22 /*list = (DLList*)malloc(sizeof(DLList));*/
23 /* Si la obtuve, inicializo todo a NULL y devuelvo TRUE. */
29 /* Si no hay más memoria devuelvo FALSE. */
35 bool DLList_empty(DLList* list) {
36 return list->first == NULL;
39 void* DLList_begin(DLList* list) {
40 list->current = list->first;
41 /* Si hay un nodo, devulevo sus datos, si no NULL. */
42 return list->current ? list->current->data : NULL;
45 void* DLList_end(DLList* list) {
46 list->current = list->last;
47 /* Si hay un nodo, devulevo sus datos, si no NULL. */
48 return list->current ? list->current->data : NULL;
51 bool DLList_have_more(DLList* list) {
52 return list->current != NULL;
55 void* DLList_current(DLList* list) {
56 return list->current ? list->current->data : NULL;
59 void* DLList_next(DLList* list) {
60 DLNode* current = list->current;
61 /* Si no está vacía ni ya fue terminada de recorrer. */
63 /* Apuntamos el actual al próximo. */
64 list->current = current->next;
65 /* Devolvemos los datos del próximo o NULL si no había otro. */
66 return list->current ? list->current->data : NULL;
67 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
73 void* DLList_prev(DLList* list) {
74 DLNode* current = list->current;
75 /* Si no está vacía ni ya fue terminada de recorrer. */
77 /* Apuntamos el actual al anterior. */
78 list->current = current->prev;
79 /* Devolvemos los datos del anterior o NULL si no había otro. */
80 return list->current ? list->current->data : NULL;
81 /* Si está vacía o ya fue terminada de recorrer devolvemos NULL. */
87 bool DLList_unshift(DLList* list, void* data) {
88 DLNode* node = (DLNode*)malloc(sizeof(DLNode));
89 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
91 /* Inicializamos el nuevo nodo. */
94 node->next = list->first;
95 /* Apunto el nodo actual al nuevo nodo. */
97 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
98 if (DLList_empty(list)) {
101 /* Si no está vacía. */
103 /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
104 list->first->prev = node;
105 /* Apunto el primer nodo de la lista al nuevo. */
109 return node ? TRUE : FALSE;
112 bool DLList_push(DLList* list, void* data) {
113 DLNode* node = (DLNode*)malloc(sizeof(DLNode));
114 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
116 /* Inicializamos el nuevo nodo. */
117 node->prev = list->last;
120 /* Apunto el nodo actual al nuevo nodo. */
121 list->current = node;
122 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
123 if (DLList_empty(list)) {
126 /* Si no está vacía. */
128 /* Apunto el próximo nodo del último nodo de la lista al nuevo. */
129 list->last->next = node;
130 /* Apunto el último nodo de la lista al nuevo. */
134 return node ? TRUE : FALSE;
137 void* DLList_shift(DLList* list) {
139 DLNode* node = list->first;
140 /* Datos del primer nodo. */
141 void* data = node->data;
142 /* Pongo como primer nodo al siguiente. */
143 list->first = node->next;
144 /* Pongo el nodo anterior al primero como NULL. */
145 list->first->prev = NULL;
146 /* Lo pongo como nodo actual. */
147 list->current = list->first;
148 /* Si era el único actualizo los otros punteros. */
151 list->current = NULL;
153 /* Libero memoria del nodo. */
158 void* DLList_pop(DLList* list) {
160 DLNode* node = list->last;
161 /* Datos del último nodo. */
162 void* data = node->data;
163 /* Pongo como último nodo al anterior. */
164 list->last = node->prev;
165 /* Pongo el nodo siguiente al último como NULL. */
166 list->last->next = NULL;
167 /* Lo pongo como nodo actual. */
168 list->current = list->last;
169 /* Si era el único actualizo los otros punteros. */
172 list->current = NULL;
174 /* Libero memoria del nodo. */