1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=1 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 list = (DLList*)malloc(sizeof(DLList));
27 return list ? TRUE : FALSE;
30 bool DLList_empty(DLList* list) {
31 return list->first == NULL;
34 void* DLList_reset(DLList* list) {
35 list->current = list->first;
36 return list->current ? list->current->data : NULL;
39 void* DLList_current(DLList* list) {
40 return list->current ? list->current->data : NULL;
43 void* DLList_next(DLList* list) {
47 list->current = ret->next;
48 return list->current ? list->current->data : NULL;
53 bool DLList_unshift(DLList* list, void* data) {
54 DLNode* node = (DLNode*)malloc(sizeof(DLNode));
55 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
57 /* Inicializamos el nuevo nodo. */
60 node->next = list->first;
61 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
62 if (DLList_empty(list)) {
66 /* Si no está vacía. */
68 /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */
69 list->first->prev = node;
70 /* Apunto el primer nodo de la lista al nuevo. */
74 return node ? TRUE : FALSE;
77 bool DLList_push(DLList* list, void* data) {
78 DLNode* node = (DLNode*)malloc(sizeof(DLNode));
79 /* Si obtenemos la memoria bien, actualizamos lo que sea necesario. */
81 /* Inicializamos el nuevo nodo. */
82 node->prev = list->last;
85 /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */
86 if (DLList_empty(list)) {
90 /* Si no está vacía. */
92 /* Apunto el próximo nodo del último nodo de la lista al nuevo. */
93 list->last->next = node;
94 /* Apunto el último nodo de la lista al nuevo. */
98 return node ? TRUE : FALSE;
101 void* DLList_shift(DLList* list) {
103 DLNode* node = list->first;
104 /* Datos del primer nodo. */
105 void* data = node->data;
106 /* Pongo como primer nodo al siguiente. */
107 list->first = node->next;
108 /* Si era el único actualizo los otros punteros. */
111 list->current = NULL;
113 /* Libero memoria del nodo. */
118 void* DLList_pop(DLList* list) {
120 DLNode* node = list->last;
121 /* Datos del último nodo. */
122 void* data = node->data;
123 /* Pongo como último nodo al anterior. */
124 list->last = node->prev;
125 /* Si era el único actualizo los otros punteros. */
128 list->current = NULL;
130 /* Libero memoria del nodo. */